Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在圆上绘制N个等距点,仅给出一个点_Java_Javafx_Plot_Geometry_Points - Fatal编程技术网

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

Java 在圆上绘制N个等距点,仅给出一个点,java,javafx,plot,geometry,points,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.stag

所以我需要沿着圆周画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();
    }
}
导入javafx.application.application;
导入javafx.scene.layout.ancorpane;
导入javafx.scene.scene;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Circle;
导入javafx.stage.stage;
导入javafx.geometry.Point2D;
公共类jvafx扩展了应用程序{
公共静态void main(字符串[]args){
应用程序启动(args);
}
@凌驾
公共无效开始(阶段初始阶段){
锚烷根=新锚烷();
场景=新场景(根,300,300,颜色。浅灰色);
圆c=新的圆();
c、 setCenterX(150.0f);
c、 setCenterY(150.0华氏度);
c、 设定半径(100.0f);
c、 设定行程(颜色为黑色);
c、 设置填充(空);
root.getChildren().add(c);
int N=16;
圆pt=null;
对于(int i=0;i

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

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

  • 你在程序中越明确越好。所以不要总是把东西写在一起。把它们分成逻辑单元,你会避免很多麻烦
  • 软件变量和数学变量不是一回事。给他们起个长而富有表现力的名字,不要给他们起个短名字。你的代码读起来像诗一样(不确定我是从谁那里听到的,但我非常喜欢)
  • 让IDE引导你。开始键入并按Ctrl+Space几次,看看会出现什么结果
  • 如果你的逻辑太长,它可以被分离成一个新的功能;这样做吧
  • 这是最后的代码

    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;
        }
    }
    
    public类主扩展应用程序{
    公共静态void main(字符串[]args){
    应用程序启动(args);
    }
    @凌驾
    公共无效开始(阶段primaryStage){
    锚烷根=新锚烷();
    场景=新场景(根,300,300,颜色。浅灰色);
    圆形=新的圆形(150.0f、150.0f、100.0f,彩色。透明);
    圆整定行程(颜色为黑色);
    列表点=获取圆形点(16,圆形,3.0f);
    root.getChildren().add(圆);
    root.getChildren().addAll(点);
    初级阶段。场景(场景);
    primaryStage.show();
    }
    /**
    *函数创建围绕圆的点列表。
    */
    私有列表getCircledDots(整数点、圆、双点半径){
    列表点=新的ArrayList();
    双角度系数=2*Math.PI/点数;
    double originX=circle.getCenterX();
    double originY=circle.getCenterY();
    双半径=圆。getRadius();
    双角度;
    圆点=零;
    for(int i=0;i
    问题在于如何计算角度。您希望将圆圈周围的“进度”作为
    0
    1
    之间的值乘以将用于
    i=16
    2*PI
    )的值

    此方法是正确的,但您正在进行整数除法:

    (i / N)
    

    此划分的结果被截断,因为对于所有
    i
    0我这样做的方式是使用一个简单的for循环,以笛卡尔坐标查找
    x
    y
    坐标: 这是以
    [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;
    
        }
    
    双半径=5.0;
    双θ=数学环面(360/numpoint);
    double[]loc=新的double[3];
    
    对于(int i=1;我可以让你分享整个代码,而不仅仅是一个片段吗?@Fredlo2010抱歉,更新了它!他们认为你计算坐标的方式是错误的。它总是给你相同的坐标。你打印的16个圆圈正好在彼此的上方。
        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;
    
        }