2017-03-03 81 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

这正是我所需要的。非常聪明的做法!谢谢... –