Java 曲面上具有随机点的三维球

Java 曲面上具有随机点的三维球,java,3d,Java,3d,我正在尝试创建一个3d球体的动画,由球体表面上的随机点制作而成。这是我的代码,我创建了500个随机极坐标点,然后将这些极坐标转换为笛卡尔坐标,然后将X和Y坐标映射到屏幕上。这就是我得到的。。。显然不对!尝试了一个小时来查看我代码中的任何错误 谁能看出我错在哪里 import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arr

我正在尝试创建一个3d球体的动画,由球体表面上的随机点制作而成。这是我的代码,我创建了500个随机极坐标点,然后将这些极坐标转换为笛卡尔坐标,然后将X和Y坐标映射到屏幕上。这就是我得到的。。。显然不对!尝试了一个小时来查看我代码中的任何错误

谁能看出我错在哪里

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Ball extends JFrame implements ActionListener{

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            new Ball();
        }
    }); 
}

ArrayList<Polarpoint> points = new ArrayList<>();

public Ball() {
    setSize(800, 600);
    setVisible(true);

    // declare some polar coords..

    for (int i=0; i<500; i++)
        points.add(new Polarpoint(Math.random()*2-1,Math.random()*2-1,50));

    Timer t = new Timer(50,this);
    t.start();      
}


@Override
public void paint(Graphics g) {
    g.clearRect(0, 0, getWidth(), getHeight());

    for (Polarpoint point: points) {

        // convert to Cartesian

        double x=point.length*Math.sin(point.xa)*Math.cos(point.ya);
        double y=point.length*Math.sin(point.xa)*Math.sin(point.ya);
        double z=point.length*Math.cos(point.xa);

        // project to 2d..

        int px=(int) (x+200);
        int py=(int) (y+200);
        g.fillRect(px, py, 1, 1);                       
    }   
}

@Override
public void actionPerformed(ActionEvent e) {
    for (Polarpoint p:points) {
        p.xa+=.03;
        p.ya+=.02;
    }

    repaint();
}


 private static class Polarpoint{

    public Polarpoint(double xa,double ya, double length) {
        this.xa=xa;
        this.ya=ya;
        this.length=length;
    }

    private double xa;
    private double ya;
    private double length;
 }

}
将for循环更改为

所以随机角度将在0-2PI之间

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Ball extends JFrame implements ActionListener{

    private static final double RADIUS = 50, MAX_ANGEL = 2*Math.PI;
    private static final int W = 400, H = 300,
                             CENTER_X = 200, CENTER_Y = 200,
                             DELAY= 50;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Ball();
            }
        });
    }

    ArrayList<Polarpoint> points = new ArrayList<>();


    public Ball() {
        setSize(W, H);
        setVisible(true);

        // declare some polar coords..

        for (int i=0; i<500; i++) {
            points.add(
                    new Polarpoint(((Math.random()*MAX_ANGEL)),
                            (Math.random()*MAX_ANGEL),RADIUS));
        }

        Timer t = new Timer(DELAY,this);
        t.start();
    }

    @Override
    public void paint(Graphics g) {
        g.clearRect(0, 0, getWidth(), getHeight());

        for (Polarpoint point: points) {

            // convert to Cartesian
            double x=point.length*Math.sin(point.xa)*Math.cos(point.ya);
            double y=point.length*Math.sin(point.xa)*Math.sin(point.ya);
            double z=point.length*Math.cos(point.xa);

            // project to 2d..
            int px=(int) (x+CENTER_X);
            int py=(int) (y+CENTER_Y);

            g.fillRect(px, py, 1, 1);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        for (Polarpoint p:points) {
            p.xa+=.03;
            p.ya+=.02;
        }
        repaint();
    }

    private static class Polarpoint{

        public Polarpoint(double xa,double ya, double length) {
            this.xa=xa;
            this.ya=ya;
            this.length=length;
        }

        private double xa;
        private double ya;
        private double length;
    }
}

为了得到一个完整的球表面,你需要仰角在-PI/2和PI/2之间,方位角在0和2*PI之间,或者在-PI和PI之间

所以你的随机点应该是:

new Polarpoint((Math.random()-0.5) * Math.PI,
               Math.random() * 2 * Math.PI,
               50);

啊。。。。我应该问‘我做错了什么!’你想要3d的吗?是的。。。。但是,不使用任何像OpenGL这样的3d api…,只是将定义为极坐标的3d点映射到2d视口的基础。不使用z投影到2d是不正确的不,这是不正确的。虽然z唯一能做的就是让离得更近的东西变大,而离得更远的东西变小。在我得到z后,我打算为它添加代码,使它成为类似球体的东西。。。。我甚至走不了那么远!在第二个Math.random之前缺少一个括号
new Polarpoint((Math.random()-0.5) * Math.PI,
               Math.random() * 2 * Math.PI,
               50);