在圆上绘制 N 个等距点,只给出一个点
Plot N equidistant points on a circle, only giving one point
所以我需要沿着圆的圆周绘制 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();
}
}
我假设点(圆)的位置应该随着 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;
}
}
问题在于您计算角度的方式。您想要将圆周围的 "progress" 作为 0
和 1
之间的值乘以将用于 i=16
(2 * PI
) 的值。
这种方法是正确的,但你做的是 整数除法:
(i / N)
这个除法的结果被截断,因为对于所有 i
: 0 <= 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
并且像 Math.PI
这样的 double
和 int
相乘得到 double
.
我的方法是使用一个简单的 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;
}
所以我需要沿着圆的圆周绘制 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();
}
}
我假设点(圆)的位置应该随着 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;
}
}
问题在于您计算角度的方式。您想要将圆周围的 "progress" 作为 0
和 1
之间的值乘以将用于 i=16
(2 * PI
) 的值。
这种方法是正确的,但你做的是 整数除法:
(i / N)
这个除法的结果被截断,因为对于所有 i
: 0 <= 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
并且像 Math.PI
这样的 double
和 int
相乘得到 double
.
我的方法是使用一个简单的 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;
}