绘制圆上的N个等距点,仅给出一个点

时间:2017-10-03 02:12:31

标签: java javafx plot geometry points

所以我需要在圆周上绘制n个等间距点。我在这里有代码,但它只绘制了1分。这可能只是一件小事,但我无法弄明白。这就是我所拥有的:

import javafx.application.Application;
import javafx.scene.layout.AnchorPane;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.geometry.Point2D;

public class jvafx extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }
    @Override
    public void start(Stage primaryStage) {     
        AnchorPane root = new AnchorPane();
        Scene scene = new Scene(root, 300, 300, Color.LIGHTGREY);

        Circle c = new Circle();
        c.setCenterX(150.0f);
        c.setCenterY(150.0f);
        c.setRadius(100.0f);
        c.setStroke(Color.BLACK);
        c.setFill(null);

        root.getChildren().add(c);

        int N = 16;
        Circle pt = null;
        for(int i = 0; i < N; i++) {
            pt = new Circle(150.0f + 100 * Math.cos(Math.PI*2*(i/N)),
                    150.0f + 100 * Math.sin(Math.PI*2*(i/N)), 3.0f);
            pt.setFill(Color.BLACK);
            root.getChildren().add(pt); 
        }

        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

我假设点(圆圈)的位置应该随着我的增加而改变。也许这是错的?

3 个答案:

答案 0 :(得分:1)

问题是你计算角度的方式。您希望将圈子周围的“进度”乘以01之间的值乘以i=162 * PI)所使用的值。

这种方法是正确的,但您正在进行 整数除法

(i / N)

此除法的结果被截断,因为对于所有i0 <= i < N,表达式始终计算为0

如果您将其中一个值转换为浮点类型或只是删除括号,则您的方法有效:

int N = 16;
for (int i = 0; i < N; i++) {
    Circle pt = new Circle(150.0f + 100 * Math.cos(Math.PI * 2 * i / N),
            150.0f + 100 * Math.sin(Math.PI * 2 * i / N), 3.0f);
    pt.setFill(Color.BLACK);
    root.getChildren().add(pt);
}

删除括号是有效的,因为Math.PI * 2 * i / N等同于((Math.PI * 2) * i) / N,而doubleMath.PIint相乘会产生double }。

答案 1 :(得分:0)

好的,这应该有效。我改变了很多东西,因为你似乎是一个新的程序员,所以我想我会给你一些智慧的话。

  1. 你在程序中越明确越好。所以不要一直写东西。将它们分成逻辑单元,你会让自己安然无恙。
  2. 软件变量与数学变量不同。给他们长的富有表现力的名字,不要短。你的代码会像诗歌一样(不确定我是谁,但我很喜欢)
  3. 让IDE引导您。开始输入并按Ctrl + Space几次,看看会出现什么。
  4. 如果你的逻辑太长,可以分成新的功能;这样做。
  5. 这是最终的代码。

    public class Main extends Application {
    
        public static void main(String[] args) {
            Application.launch(args);
        }
    
        @Override
        public void start(Stage primaryStage) {
    
            AnchorPane root = new AnchorPane();
            Scene scene = new Scene(root, 300, 300, Color.LIGHTGREY);
            Circle circle = new Circle(150.0f, 150.0f, 100.0f, Color.TRANSPARENT);
            circle.setStroke(Color.BLACK);
    
            List<Node> dots = getCircledDots(16, circle, 3.0f);
    
            root.getChildren().add(circle);
            root.getChildren().addAll(dots);
    
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        /**
         * Function to create list of dots around a circle.
         */
        private List<Node> getCircledDots(int numberOfDots, Circle circle, double dotRadius) {
    
            List<Node> dots = new ArrayList<>();
            double angleFactor = 2 * Math.PI / numberOfDots;
            double originX = circle.getCenterX();
            double originY = circle.getCenterY();
            double radius = circle.getRadius();
            double angle;
            Circle dot = null;
            for (int i = 0; i < numberOfDots; i++) {
    
                angle = i * angleFactor;
                double x = originX + radius * Math.cos(angle);
                double y = originY + radius * Math.sin(angle);
    
                dot = new Circle(x, y, dotRadius);
                dot.setFill(Color.BLACK);
                dots.add(dot);
            }
            return dots;
        }
    }
    

答案 2 :(得分:0)

我这样做的方法是使用一个简单的for循环,并在笛卡尔坐标系中找到xy坐标: 它以[50, 50, 50]为中心,numpoint是您要在圆中指定的点数:如果沿位置3(沿z轴平移),则可能会得到一个圆柱

    double radius = 5.0;
    double theta = Math.toRadians(360/numpoint);
    double[]loc=new double[3];
    for (int i = 1; i <= numpoint; i++) {

        loc[0] = (double)(50+(radius * Math.cos(theta*i)));
        loc[1] = (double)(50+(radius * Math.sin(theta*i)));
        loc[2] = 50+0;

    }