2017-03-03 10 views
0

赤い円の軌跡上だけで青い円の動きを(マウスのドラッグによる)どのように制限できますか?極座標を使うべきですか? (x = r cos(θ)、y = rsin(θ))?javafxマウスを円の軌跡上に移動

今まで私が作成したコードは、青い点をステージ全体にドラッグできるようにしました。私は、青い点の中心が赤い円に追従するようにしたい。

package circlemouse; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.Line; 
import javafx.stage.Stage; 

public class CircleMouse extends Application { 

private double initY; 
private double dragAnchorY; 
private double initX; 
private double dragAnchorX; 

@Override 
public void start(Stage primaryStage) { 
    Pane pane = new Pane(); 
    Scene scene = new Scene(pane, 500, 500); 
    primaryStage.setResizable(false); 

    //stage center 
    double x0 = pane.getWidth()/2.0; 
    double y0 = pane.getHeight()/2.0; 
    Line horizontalLine = new Line(0.0, y0, 2.0 * x0, y0); 
    Line vertical = new Line(x0, 0.0, x0, 2.0 * y0); 

    //red circle (path of point) 
    double r = 100.0; 
    Circle c = new Circle(x0, y0, r); 
    c.setFill(null); 
    c.setStroke(Color.RED); 

    //the point 
    double pointRadius = 15.0; 
    Circle point = new Circle(x0 + r, y0, pointRadius); 
    point.setFill(Color.BLUE); 

    point.setOnMousePressed((MouseEvent me) -> { 
     initY = point.getCenterY(); 
     dragAnchorY = me.getSceneY(); 
     initX = point.getCenterX(); 
     dragAnchorX = me.getSceneX(); 
    }); 
    point.setOnMouseDragged((MouseEvent me) -> { 
     double dragY = me.getSceneY() - dragAnchorY; 
     double newY = initY + dragY; 
     point.setCenterY(newY); 
     double dragX = me.getSceneX() - dragAnchorX; 
     double newX = initX + dragX; 
     point.setCenterX(newX); 

    }); 

    pane.getChildren().addAll(horizontalLine, vertical, c, point); 

    primaryStage.setTitle("Hello World!"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

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

} 

答えて

1

あなたはマウスがどこにあるかに赤い円の中心から線を引く、その後、あなたはポイントを配置したい場所に赤い円の中心から線を引く場合は、それらが同じで明らかにされています赤い円の中心から点を求めたいところまでの線の長さは、線の半径になります。

ベクトルの用語では、円の中心から新しい点の位置までのベクトルは、円の中心から円の中心からマウスの方向に単位ベクトルを掛けた円の半径です。

Point2D APIだから

を使用すると、ベクトルとしてPoint2Dを解釈することができ、そして他のベクトルを加算し、減算、スカラー掛ける、単位ベクトル(normalize())を計算するための有用な方法を持っている、等:

point.setOnMouseDragged((MouseEvent me) -> { 
    Point2D redCenter = new Point2D(c.getCenterX(), c.getCenterY()); 
    Point2D mouse = new Point2D(me.getX(), me.getY()); 
    Point2D centerToMouse = mouse.subtract(redCenter); 
    Point2D centerToNewPoint = centerToMouse.normalize().multiply(c.getRadius()); 
    Point2D newPoint = centerToNewPoint.add(redCenter); 
    point.setCenterX(newPoint.getX()); 
    point.setCenterY(newPoint.getY()); 
}); 
+0

これは私が必要としていたものです。非常に賢いアプローチ!ありがとう... –

関連する問題