2

マウス ドラッグ イベントを使用して javafx で円弧形状を操作する際に問題があります。

次のパラメーターで定義されたアークがあります。

  • radiusX および radiusY : この円弧が部分セクションである完全な楕円の水平方向および垂直方向の半径
  • centerX,centerY : 円弧の中心点
  • startAngle: 円弧の開始角度 (水平軸に対して)
  • length: 円弧の角度範囲 (度単位)

だから私が必要とするのは、ドラッグ中に円弧の開始角度をマウスの動きに「追従」させることです:

ユーザーがアークの始点 (startAngle にある) を押し、マウスをドラッグしているときに、水平軸と中心からマウス位置までの線によって形成される新しい開始角度を計算する必要があります。

基本的に問題は、指定された点 (マウスの位置) とその他の指定されたパラメーター (中心、長軸、短軸) を指定して円弧の開始角度を計算することです。

私が実際に行っているのは、Math.atan2 関数で角度を計算することです

newStartAngle = atan2(xMouse, yMouse) (中心 x、y が 0,0 であると仮定)

ただし、円弧が円形 (radiusX = radiusY) の場合にのみ機能します。

別の言い方をすると、円弧の始点が常に中心からマウス位置までの線上にある必要があります (したがって、マウスの回転の動きに追従させるために、開始角度を継続的に更新する必要があります)。(私はそれを少し明確にしたことを願っています)

これがサンプルの完全なソースです

import javafx.stage.Stage;
...

public class Main extends Application {

@Override
public void start(Stage primaryStage) {
    Pane pane = new Pane();

    Group designer = createDesigner();
    designer.setLayoutX(100);
    designer.setLayoutY(200);
    pane.getChildren().add(designer);

    Scene sc = new Scene(pane, 600, 600);
    primaryStage.setScene(sc);
    primaryStage.show();
}

public static final double RX = 100;
public static final double RY = 50;
public static final double S_ANGLE = 45;
public static final double ARC_LENGTH = 90;

private Arc arc;
private Circle handle;
private Line connection;
double xMouse,yMouse;

public Group createDesigner() {

    arc = new Arc();        
    arc.setRadiusX(RX);
    arc.setRadiusY(RY); 
    arc.setStartAngle(S_ANGLE);
    arc.setLength(ARC_LENGTH);
    arc.setFill(Color.LIGHTBLUE);
    arc.setType(ArcType.ROUND);

    handle = new Circle();
    handle.setRadius(5);    
    handle.setStroke(Color.BLACK);
    handle.setFill(Color.TRANSPARENT);

    handle.setCenterX(
            RX * Math.cos(Math.toRadians(S_ANGLE))
        );
    handle.setCenterY(
            -RY * Math.cos(Math.toRadians(S_ANGLE))
        );

    connection = new Line();
    connection.startXProperty().bind(arc.centerXProperty());
    connection.startYProperty().bind(arc.centerYProperty());
    connection.endXProperty().bind(handle.centerXProperty());
    connection.endYProperty().bind(handle.centerYProperty());

    handle.setOnMouseDragged(new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {

            xMouse = event.getX();
            yMouse = event.getY();

            handle.setCenterX(xMouse);
            handle.setCenterY(yMouse);


           double angleInRadians = Math.atan2(-yMouse, xMouse);

            arc.setStartAngle(Math.toDegrees(angleInRadians));

        }

    });

    return new Group(arc, connection, handle);

}

public static void main(String[] args) {
    launch(args);
}

}

前もって感謝します

4

1 に答える 1

2

よく私はそれを解決しました、それを機能させるためにxMouseとyMouseをメジャーとマイナーの斧で割るだけで十分です

newStartAngle = Math.atan2(-yMouse/radiusY, xMouse/radiusX) 
//assume center x, y at 0,0
于 2012-06-02T16:10:04.690 に答える