当前位置: 首页 > 知识库问答 >
问题:

位置元素围绕中心点

郭均
2023-03-14

抱歉,因为这是一个垃圾问题,但是我完全不知道最好的方法。我相信一定有一些内在的或常见的做法,但我找不到它,谷歌没有发现任何有价值的东西。

我有一个javafx场景,其中有许多< code >圆圈

(以下命名是为了说明我试图达到的效果)

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 x 600 的场景中。

我需要将月球物体放置在地球物体周围。我不在乎在哪里,只要它们与月球的距离x并且不接触。

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

这很管用,但似乎我做了很多事情来有效地在圆形路径上绘制一些对象。(循环通过每个对象,然后再次循环所有移动的对象,以检查对象的移动是否没有连锁反应)

我已经看到了很多教程作为SO问题,例如这个相关问题,但是它们都向您展示了如何在圆形路径上绘制矩形。Circle 对象似乎没有相同的方法。

任何关于我如何做到这一点的帮助将不胜感激

共有1个答案

阳俊德
2023-03-14

把它们围绕中心等角度放置。

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距离, 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);
    }
}
 类似资料:
  • 问题内容: 有没有一种简单的方法可以围绕图片中心旋转图片?我首先使用了AffineTransformOp。看起来很简单,而且需要,并且在一个整洁的Google会话中为矩阵找到正确的参数。所以我认为… 我的结果是这样的: 如果您忽略旋转90度的倍数的情况,这非常简单(sin()和cos()无法正确处理)。该解决方案的问题在于,它围绕图片左上角的(0,0)坐标点进行变换,而不是围绕图片中心进行正常的变

  • 我现在正在写一个小游戏,我遇到了一个问题。我需要在一个大圆的边界上画64个小圆。所以我想要这样的东西: 我已经试过很多方法,但都不管用。如何在java中使用java实现这一点。awt。组件#paint()方法和java。awt。图形课? 谢谢

  • OpenGL总是围绕(0,0,0)旋转。但是我需要绕着相机旋转。我知道在GL中,没有相机,但是如果我翻译回(0,0,-6.0),它会绕着(0,0,0)旋转,而不是绕着(0,0,-6.0)旋转 所以我的问题是:如何在opengl和c中设置旋转中心 我已经找到了这篇文章:OpenGL围绕一个点旋转相机 显示此解决方案的地方: 旋转函数通常围绕原点旋转。要围绕另一个点P旋转,必须:平移(-P)旋转平移(

  • 问题内容: 我正在用Java制作2D游戏,玩家可以通过障碍物引导多边形。多边形上下移动,游戏世界向左和向右滚动。我需要多边形绕其中心旋转,但是由于它不断地被平移,所以它绕着点旋转。尝试将其平移回原始中心,旋转并重新平移不起作用。如何获得形状的中心? 这是我在2ms计时器上的运动计算: 这是我的paintComponent方法: 其中(xPos,yPos)是屏幕的中心。 问题答案: 转换(通常)是复

  • 我在下面有一个类,我将其附加到一个对象上,以使其围绕其轴旋转。我把雪碧的枢轴通过检查员送来了。 这正是我想要的效果,但是我遇到的问题是,每当我触摸并拖动它,然后再次触摸并拖动它,它就会捕捉到一个新的位置。 我想让它做的是,当它旋转,然后再次旋转时,精灵保持其相同的旋转,而不是捕捉到一个新的位置,我想精灵的角度重置为0。接下来,我想让角度持续旋转。所以如果我朝正方向旋转,角度应该在正方向上不断增加,

  • 问题内容: 我想创建一个以动态宽度和高度为中心的弹出框。我曾经为此。没有它,则水平居中,但不能垂直居中。添加后,它甚至没有水平居中。 这是完整的设置: 如何使用CSS在屏幕上将此框居中? 问题答案: 基本上,您需要设置div 并将其居中放置在div的左上角。您还需要将和设置为div的高度和宽度的负一半,以将中心移到div的中间。 因此,在提供(标准模式)的情况下,此操作应: 或者,如果你不关心垂直