2015-06-19 4 views
1

Извинения, так как это вопрос с мусорным вопросом, но я полностью столкнулся здесь с наилучшим подходом. Я считаю, что для этого должно быть что-то встроенное или обычное дело, но я не могу его найти, и Google не принес ничего ценного.Элементы положения javafx вокруг центральной точки

У меня есть сцена javafx с числом Circle s.

(Названный ниже, чтобы проиллюстрировать эффект я пытаюсь достичь)

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 расстояние от луны и не трогательно.

Первоначально я зациклился на каждом объекте, проверил на столкновение и с помощью рекурсивной функции передвинул круг +10 на координате y.

Это сработало, но казалось, что я делаю так, чтобы эффективно строить некоторые объекты по круговой траектории. (зацикливание через каждый объект, а затем после того, как весь объект, в котором перемещается петля снова, чтобы проверить перемещение объекта, не имел эффекта стука)

Я видел множество учебных пособий как SO questions such as this related question, однако все они показывают, как построить прямоугольник по круговой траектории. объект Circle, похоже, не имеет одинаковых методов.

Любая помощь о том, как идти об этом была бы оценена

ответ

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

Удивительно, знаю, что я делал слишком много работы для себя. благодаря – atmd