нестандартный поворот формы
Я пытаюсь повернуть произвольную фигуру вокруг ее центра, но не могу получить ожидаемый результат.
что я хочу это *
форма должна вращаться вокруг своего центра, не перемещаясь сама по себе. *
что мое решение в настоящее время делаетвращая целую форму вокруг своего центра, при каждом повороте она меняет свою позицию.
У меня есть несколько фигур, поэтому я создал класс для инкапсуляции формы с ее преобразованием в следующем классе
public abstract class Shoe implements Shape, ShoeShape {
// variable declaration
/**
*
*/
public Shoe() {
position = new Point();
lastPosition = new Point();
}
public void draw(Graphics2D g2, AffineTransform transform, boolean firstTime) {
AffineTransform af = firstTime ? getInitTransform()
: getCompositeTransform();
if (af != null) {
Shape s = af.createTransformedShape(this);
if (getFillColor() != null) {
g2.setColor(getFillColor());
g2.fill(s);
} else {
g2.draw(s);
}
}
}
}
public AffineTransform getCompositeTransform() {
AffineTransform af = new AffineTransform();
af.setToIdentity();
af.translate(position.getX(), position.getY());
Point2D centerP = calculateShapeCenter();
af.rotate(orientation, centerP.getX(), centerP.getY());
return af;
}
public void onMouseDrag(MouseEvent me, Rectangle2D canvasBoundary,
int selectionOperation) {
// shape operation can be either resize , rotate , translate ,
switch (selectionOperation) {
case MmgShoeViewer.SHAPE_OPERATION_MOVE:
// MOVEMENT
break;
case MmgShoeViewer.SHAPE_OPERATION_ROTATE:
Point2D origin = calculateShapeCenter();
Point2D.Double starting = new Point2D.Double(me.getX(), me.getY());
currentAngle = RotationHelper.getAngle(origin, starting);
rotationAngle = currentAngle - startingAngle;
rotate(rotationAngle);
break;
case MmgShoeViewer.SHAPE_OPERATION_RESIZE:
break;
default:
System.out.println(" invalid select operation");
}
}
public void onMousePress(MouseEvent me, Rectangle2D canvasBoundary,
int selectionOperation) {
// shape operation can be either resize , rotate , translate ,
switch (selectionOperation) {
case MmgShoeViewer.SHAPE_OPERATION_MOVE:
break;
case MmgShoeViewer.SHAPE_OPERATION_ROTATE:
Point2D origin = calculateShapeCenter();
Point2D.Double starting = new Point2D.Double(me.getX(), me.getY());
startingAngle = RotationHelper.getAngle(origin, starting);
setShapeOperation(selectionOperation);
break;
case MmgShoeViewer.SHAPE_OPERATION_RESIZE:
break;
default:
System.out.println(" invalid select operation");
}
}
public void onMouseRelease(MouseEvent me, Rectangle2D canvasBoundary,
int selectionOperation) {
// shape operation can be either resize , rotate , translate ,
switch (selectionOperation) {
case MmgShoeViewer.SHAPE_OPERATION_MOVE:
break;
case MmgShoeViewer.SHAPE_OPERATION_ROTATE:
// FIXME rotation angle computation
setShapeOperation(-1);
break;
case MmgShoeViewer.SHAPE_OPERATION_RESIZE:
break;
default:
System.out.println(" invalid select operation");
}
}
public void rotate(double angle) {
orientation = (float) angle;
}
public void translate(double deltaX, double deltaY) {
position.setLocation(deltaX, deltaY);
lastPosition.setLocation(deltaX, deltaY);
}
// another getter and setter
Я рассчитываю угол поворота, используя следующий метод
public static double getAngle(Point2D origin, Point2D other) {
double dy = other.getY() - origin.getY();
double dx = other.getX() - origin.getX();
double angle;
if (dx == 0) {// special case
angle = dy >= 0 ? Math.PI / 2 : -Math.PI / 2;
} else {
angle = Math.atan(dy / dx);
if (dx < 0) // hemisphere correction
angle += Math.PI;
}
// all between 0 and 2PI
if (angle < 0) // between -PI/2 and 0
angle += 2 * Math.PI;
return angle;
}
в нажатие мыши событие холста мыши слушателя
selectedShape.onMousePress(me, canvasBoundary, shoeViewer
.getShapeOperation());
я просто называю выбранную формуметод onMousePress
и в моем методе перетаскивания мышью слушателя мыши, я просто вызываю выбранную фигуруs метод onMouseDrag, который обновляет угол поворота, как вы можете видеть из самого первого класса
selectedShape.onMouseDrag(me, canvasBoundary, shoeViewer
.getShapeOperation());
и вы можете увидеть метод рисования отдельной фигуры, чтобы нарисовать фигуру в соответствии с текущим преобразованием, я звоню из paintComponent, как
Iterator shoeIter = shoeShapeMap.values().iterator();
while (shoeIter.hasNext()) {
Shoe shoe = shoeIter.next();
shoe.draw(g2, firstTime);
}
где shoeShapeMap содержит все пользовательские фигуры, которые в данный момент находятся на холсте.
это я делаю ошибку в угол вычисления или определения точки привязки? мое текущее решение поворачивает форму на 360 градусов, проверяя все условия [90 градусов и т. д.], как вы можете видеть в вышеупомянутом методе.
я хочу, чтобы фигура вращалась вокруг своего центра, не меняя положения? Одним словом, это трудно объяснить, поэтому, пожалуйста, предложите мне лучший способ показать здесь, чего я хочу достичь?
Я думаю, что я упомянул все вещи, связанные с этой проблемой. если у вас есть какие-либо сомнения, пожалуйста, не стесняйтесь спрашивать меня.
Я нашел 2 связанных постов здесь, но я не мог найти много информации от них.