2017-03-03 5 views
0

Wie kann ich die Bewegung des blauen Kreises (wegen einer Maus ziehen) nur auf dem roten Kreisweg beschränken? Soll ich Polarkoordinaten verwenden? (x = r cos (& thgr;), y = r sin (& thgr;))?javafx Maus bewegt sich auf einem Kreisweg

Der Code, den ich bis jetzt erstellt habe, ließ mich den blauen Punkt über die Bühne ziehen. Ich möchte, dass die Mitte des blauen Punkts dem roten Kreis folgt.

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); 
} 

} 

Antwort

1

Wenn Sie eine Linie von der Mitte des roten Kreis zeichnen, wo die Maus ist, und dann eine Linie von der Mitte des roten Kreis zeichnen, wo Sie den Punkt wollen, sind sie offensichtlich in der gleichen Richtung und die Länge der Linie von der Mitte des roten Kreises bis zu dem Punkt, an dem Sie den Punkt haben möchten, ist nur der Radius der Linie. In der Terminologie des Vektors ist der Vektor vom Mittelpunkt des Kreises zur Position des neuen Punktes der Radius des Kreises multipliziert mit dem Einheitsvektor in der Richtung vom Mittelpunkt des Kreises zur Maus.

Die Point2D API ermöglicht eine Point2D als Vektor zu interpretieren und hat nützliche Methoden, um den Einheitsvektor zur Berechnung (normalize()), mit einem Skalar multipliziert wird, Addieren und Subtrahieren anderen Vektoren usw.

So:

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

Das ist genau das, was ich brauchte. Sehr schlauer Ansatz !!! Vielen Dank... –

Verwandte Themen