JavaFX 改变枢轴旋转使矩形跳跃

问题描述 投票:0回答:1

我想在矩形旋转上拖动枢轴。我让矩形围绕新的枢轴旋转,但矩形发生了跳跃。我想我还需要对矩形进行翻译,但不知道如何进行。我希望矩形在下一次旋转时保持在先前的位置。请帮忙,谢谢。

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();
    }
}
javafx rotation pivot drag
1个回答
0
投票

+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。

© www.soinside.com 2019 - 2024. All rights reserved.