2017-03-03 38 views
0

如何限制僅在紅色圓形路徑上的藍色圓圈(由於鼠標拖動)的運動?我應該使用極座標嗎? (x = r cos(θ),y = r sin(θ))?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

這正是我所需要的。非常聰明的做法!謝謝... –