Java: равномерное нанесение точек на окружность с использованием Graphics2d

Я пытаюсь нарисовать количество точек на окружности так, чтобы каждая точка находилась на одинаковом расстоянии от следующей. В конце концов я буду рисовать линии между всеми точками, чтобы сделать небольшой рисунок. Сегодняшнее препятствие, с которым я сталкиваюсь, состоит в том, что точки не выходят на круг равномерно. То, как я вычисляю точки, для данной точки с углом тета координата X и координата Y вычисляются следующим образом

xc = радиус * (Math.cos(theta)) + горизонтальный центр

yc = радиус * (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);
            }
        }

Я использовал код из другого поста переполнения стека. Вот изображение того, как выглядит круг на данный момент.

круг

Как видите, между некоторыми точками есть дополнительное пространство. Кто-нибудь знает, что вызывает это?

РЕДАКТИРОВАТЬ

Спасибо, парни! Это выглядит намного лучше!

circle2

3 ответа

Решение

Я считаю, что триг Math принять их параметры в радианах, а не в градусах. Так что вам нужно сделать 2 * Math.PI вместо 360.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);

}

Math.sin() а также Math.cos() принять угол в радианах, и вы предоставляете углы в градусах.

Другие вопросы по тегам