我想在矩形旋转上拖动枢轴。我让矩形围绕新的枢轴旋转,但矩形发生了跳跃。我想我还需要对矩形进行翻译,但不知道如何进行。我希望矩形在下一次旋转时保持在先前的位置。请帮忙,谢谢。
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import java.io.IOException;
public class T5_4_Rotar_PivotXY_2 extends Application {
double anguloFinal = 0;
double pivoteX = 250; // initial rotate pivotX
double pivoteY = 150; // initial rotate pivotY
@Override
public void start(Stage stage) throws IOException {
Pane pane = new Pane();
Scene scene = new Scene(pane,500,500);
double x0 = 50;
double y0 = 50;
double ancho = 200; // width
double alto = 100; // height
Rectangle r = new Rectangle(x0, y0, ancho, alto);
r.setFill(Color.YELLOW);
// pivot simbol
Circle circle1 = new Circle(pivoteX,pivoteY,4);
circle1.setFill(Color.TRANSPARENT);
circle1.setStroke(Color.BLACK);
Line line1 = new Line(pivoteX-6,pivoteY,pivoteX+6,pivoteY);
Line line2 = new Line(pivoteX,pivoteY-6,pivoteX,pivoteY+6);
Group centro = new Group(circle1,line1,line2);
pane.getChildren().addAll(r,centro);
Rotate rotacion = new Rotate();
rotacion.setPivotX(pivoteX);
rotacion.setPivotY(pivoteY);
r.getTransforms().add(rotacion);
// Rotation event
pane.setOnMousePressed(e1 -> {
pane.setOnMouseDragged(e2 -> {
double anguloPressed = Math.toDegrees(Math.atan2((e1.getSceneY() - pivoteY),(e1.getSceneX() - pivoteX)));
double anguloDragged = Math.toDegrees(Math.atan2((e2.getSceneY() - pivoteY),(e2.getSceneX() - pivoteX)));
double angulo = anguloDragged - anguloPressed + anguloFinal;
rotacion.setAngle(angulo);
pane.setOnMouseReleased(e3 -> {
anguloFinal = angulo;
});
});
});
// Dragging the pivot
centro.setOnMousePressed(e1 -> {
centro.setOnMouseDragged(e2 -> {
centro.setTranslateX(e2.getSceneX() - e1.getSceneX());
centro.setTranslateY(e2.getSceneY() - e1.getSceneY());
e2.consume();
centro.setOnMouseReleased(e3 -> {
centro.setLayoutX(centro.getLayoutX() + centro.getTranslateX());
centro.setLayoutY(centro.getLayoutY() + centro.getTranslateY());
centro.setTranslateX(0);
centro.setTranslateY(0);
// new pivot
pivoteX = centro.getLayoutX() + 250;
pivoteY = centro.getLayoutY() + 150;
rotacion.setPivotX(pivoteX);
rotacion.setPivotY(pivoteY);
// some rectangle translation here, correct? Help please.
});
});
});
stage.setTitle("T5 4 Rotate PivotXY 2");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
+1 对于@jewelsea 在评论中提到的所有要点。我相信您问题的主要问题在于更新旋转的pivotX/Y 时。
目前的行为是:
您有默认的pivotX/Y(比如说px和py),当您拖动窗格时,您会计算并将角度(比如说r0)更新为旋转。您的矩形将使用此参数(px、py、r0)旋转。
现在,当您完成将枢轴拖动到新点时,您正在计算新的枢轴X/Y。 (到目前为止一切顺利......,比方说 px1,py1)并更新为旋转变换。
现在旋转变换参数为(px1, py1, r0)。这就是你的问题所在..你有新的pivotX/Y值和旧角度r0(从px和py计算)。
因此,当您应用新的主元值时,它会正确使用值 px1、py1 和 r0。