gpt4 book ai didi

java - 表面有随机点的 3d 球

转载 作者:行者123 更新时间:2023-12-02 12:32:20 26 4
gpt4 key购买 nike

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

enter image description here

谁能看出我哪里出错了?

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 循环更改为

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

所以随机角度将在 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;
}
}

关于java - 表面有随机点的 3d 球,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45263325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com