Java:使用Graphics2d在圆上统一绘制点

时间:2013-04-23 21:10:28

标签: java trigonometry graphics2d

我正在尝试在圆上绘制一些点,使得每个点与下一个点的距离相同。最终我将在所有点之间绘制线条以进行一点绘制。我正在处理的当前障碍是圆点不均匀地出现在圆圈上。我计算点的方法是,对于角度θ的给定点,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);
            }
        }

我使用了来自另一个堆栈溢出帖子的代码。这是一张截至目前的圆圈图片。

circle

如您所见,某些点之间有一些额外的空间。有谁知道是什么原因引起的?

修改

谢谢你们!看起来好多了!

circle2

3 个答案:

答案 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);

}