javafx位于中心点周围的元素

时间:2015-06-19 12:38:11

标签: java javafx javafx-8

道歉,因为这是一个垃圾问题,但我完全不知道最好的方法。我相信必须有一些内置或常见的做法,但我无法找到它,谷歌已经没有太多价值。

我有一个javafx场景,其中有Circle个。

(以下命名以说明我试图实现的效果)

Circle earth= new Circle(30, Color.web("blue", 0.5));

Circle moon = new Circle(30, Color.web("blue", 0.5));
Circle moon = new Circle(30, Color.web("blue", 0.5));
Circle moon = new Circle(30, Color.web("blue", 0.5));

全部定位:

setCenterX(300); 
setCenterY(300);

在一个600乘600的场景中。

我需要在moon对象周围放置earth个对象。只要距离月球x距离并且不接触,我就不在乎哪里。

我最初循环遍历每个对象,检查碰撞并使用递归函数移动y坐标上的圆圈+10。

这很有效,但似乎我在为圆形路径上有效地绘制一些物体做了很多工作。 (循环遍历每个对象然后再次移动循环所有对象以检查对象的移动没有​​敲击效果)

我已经看到大量的教程为SO questions such as this related question但是它们都向您展示了如何在圆形路径上绘制矩形。 Circle对象似乎没有相同的方法。

非常感谢任何关于我如何解决这个问题的帮助

1 个答案:

答案 0 :(得分:2)

只需将它们放置在围绕中心的相同角度。

Pane pane = new Pane();

double centerX = 300 ;
double centerY = 300 ;
double radius = 30 ;

Circle earth = new Circle(centerX, centerY, radius, Color.web("blue", 0.5));
pane.getChildren().add(earth);

int numMoons = 3 ;
double distance = 100 ;

for (int i = 0 ; i < numMoons; i++) {
    double angle = 2 * i * Math.PI / numMoons ;
    double xOffset = distance * Math.cos(angle);
    double yOffset = distance * Math.sin(angle);
    double x = centerX + xOffset ;
    double y = centerY + yOffset ;
    Circle moon = new Circle(x, y, radius, Color.web("blue", 0.5));
    pane.getChildren().add(moon);
}

或者,将它们全部放在(centerX + distance, centerY),然后应用不同的旋转:

Pane pane = new Pane();

double centerX = 300 ;
double centerY = 300 ;
double radius = 30 ;

Circle earth = new Circle(centerX, centerY, radius, Color.web("blue", 0.5));
pane.getChildren().add(earth);

int numMoons = 3 ;
double distance = 100 ;

for (int i = 0 ; i < numMoons; i++) {
    double angle = 360.0 * i / numMoons ;

    Circle moon = new Circle(centerX + distance, centerY, radius, Color.web("blue", 0.5));
    Rotate rotate = new Rotate(angle, centerX, centerY);
    moon.getTransforms().add(rotate);
    pane.getChildren().add(moon);
}

或者,如果你想在它们之间定义一个固定的间隙,就不难显示增量的角度(弧度)是

incrementAngle = 2 * Math.asin((2 * moonRadius + gap) / (2 * distance) );

所以你可以做像

这样的事情
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

public class CirclesAroundCircle extends Application {

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

        double centerX = 300 ;
        double centerY = 300 ;
        double earthRadius = 30 ;
        double moonRadius = 30 ;

        Circle earth = new Circle(centerX, centerY, earthRadius, Color.web("blue", 0.5));
        pane.getChildren().add(earth);

        int numMoons = 3 ;
        double gap = 10 ;
        double distance = 100 ;
        double angleIncrement = 2 * Math.asin((2 * moonRadius + gap) / (2  * distance) );

        for (int i = 0 ; i < numMoons; i++) {

            double angle = Math.toDegrees(angleIncrement * i) ;

            Circle moon = new Circle(centerX + distance, centerY, moonRadius, Color.web("blue", 0.5));
            Rotate rotate = new Rotate(angle, centerX, centerY);
            moon.getTransforms().add(rotate);
            pane.getChildren().add(moon);
        }

        Circle orbit = new Circle(centerX, centerY, distance, Color.TRANSPARENT);
        orbit.setStroke(Color.BLACK);
        pane.getChildren().add(orbit);

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

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