我正在尝试在圆上绘制一些点,使得每个点与下一个点的距离相同。最终我将在所有点之间绘制线条以进行一点绘制。我正在处理的当前障碍是圆点不均匀地出现在圆圈上。我计算点的方法是,对于角度θ的给定点,X坐标和Y坐标计算如下
xc = radius *(Math.cos(theta))+水平中心
yc = radius *(Math.sin(theta))+垂直中心
我还有一个额外的变量,所以我可以制作旋转动画。这是代码:
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.util.Random;
import java.awt.event.*;
import java.lang.*;
import java.awt.geom.Line2D;
import java.awt.geom.Ellipse2D;
class JavaPaintUI extends JPanel{
int x,y,rad,i;
static Random r = new Random();
BufferedImage image;
Graphics2D g2d;
Timer timer;
double vertices = 24.0;
double angle = 0.0;
double delta = 0.01;
double [] xs = new double[24];
double [] ys = new double[24];
JavaPaintUI(){
image = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB);
g2d = (Graphics2D)image.getGraphics();
setBackground(Color.black);
g2d.setColor(Color.white);
i=0;
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
angle += delta;
angle = angle % 360.0;
iterate();
}
};
timer = new Timer(100, listener);
timer.start();
}
public void iterate(){
g2d.setColor(Color.BLACK);
g2d.fillRect(0, 0, 600, 600);
g2d.setColor(Color.WHITE);
for(double i = 0; i < vertices; i++){
xs[(int)i] = 250.0 * (Math.cos(((2*Math.PI)/360) * (angle+(i*(360.0/vertices))))) + 300.0;
ys[(int)i] = 250.0 * (Math.sin(((2*Math.PI)/360) * (angle+(i*(360.0/vertices))))) + 300.0;
}
for(double i = 0; i < vertices; i++){
g2d.draw(new Ellipse2D.Double(xs[(int)i], ys[(int)i], 8.0, 8.0));
}
/*
for(double i = 0; i < vertices; i++){
for(double j = 0; j < vertices; j++){
g2d.draw(new Line2D.Double(xs[(int)i],ys[(int)i],xs[(int)j],ys[(int)j]));
}
} */
repaint();
if (i==1000){timer.stop();}
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(image,0,0,null);
}
}
我使用了来自另一个堆栈溢出帖子的代码。这是一张截至目前的圆圈图片。
如您所见,某些点之间有一些额外的空间。有谁知道是什么原因引起的?
修改
谢谢你们!看起来好多了!
答案 0 :(得分:0)
Math.sin()
和Math.cos()
以弧度为单位,您提供的角度为度。
答案 1 :(得分:0)
我相信Math
中的trig函数以弧度为单位,而不是度数。因此,您需要2 * Math.PI
代替360.0
。
答案 2 :(得分:0)
圆圈有360度 所以你需要一个
int numSteps = 32;
double angleStep = 360 / numStpes; // You also can do that with 2*Math.PI / numSteps
for (int i = 0; i < numSteps; i++) {
double angle = i * anglStep;
// now use the formula with x0 + r * sin(angle * toRadians);
}