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