这是个旋转正方体的java代码,请高手添加注释和必要的说明

2025-02-25 12:13:22
推荐回答(3个)
回答1:

import java.awt.*;
import java.applet.*;
public class Wuerfel extends Applet {
double p[][] = new double[9][4]; //绘制正方体的顶点的数组
int x=1, y=2, z=3;
public void init() {
setSize(600, 480);
setBackground(new Color(255,255,255)); //背景色设置为白色
p[1][x] = -100; p[1][y] = -100; p[1][z] = -100; //下列数组为正方体的各个边
p[2][x] = +100; p[2][y] = -100; p[2][z] = -100;
p[3][x] = +100; p[3][y] = -100; p[3][z] = +100;
p[4][x] = -100; p[4][y] = -100; p[4][z] = +100;
p[5][x] = -100; p[5][y] = +100; p[5][z] = -100;
p[6][x] = +100; p[6][y] = +100; p[6][z] = -100;
p[7][x] = +100; p[7][y] = +100; p[7][z] = +100;
p[8][x] = -100; p[8][y] = +100; p[8][z] = +100;
}
double angle_x = 0.01; //X轴旋转速度,参数越大,转速越大
double angle_y = 0.0075; //Y轴旋转速度,参数越大,转速越大
double angle_z = 0.005; //Z轴旋转速度,参数越大,转速越大
Image buffer;
Graphics2D gBuffer;

public void paint(Graphics g) { //绘图方法
if (buffer==null) {//判定程序是否为初始化,即正方体是否已经被绘制
buffer=createImage(this.getSize().width, this.getSize().height);
//获取关于Image的Graphics2D对象,用于绘图
gBuffer=(Graphics2D)buffer.getGraphics();
}
//清空绘图区域
gBuffer.clearRect(0,0,this.getSize().width, this.getSize().height);
//设置图像的表现模式,此处设置图形抗锯齿
gBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//以下为汇整整个正方体
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,(int)(p[2][x])+200,(int)(p[2][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,(int)(p[3][x])+200,(int)(p[3][y])+200);
gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,(int)(p[4][x])+200,(int)(p[4][y])+200);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,(int)(p[1][x])+200,(int)(p[1][y])+200);
gBuffer.drawLine((int)(p[5][x])+200,(int)(p[5][y])+200,(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[6][x])+200,(int)(p[6][y])+200,(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.drawLine((int)(p[7][x])+200,(int)(p[7][y])+200,(int)(p[8][x])+200,(int)(p[8][y])+200);
gBuffer.drawLine((int)(p[8][x])+200,(int)(p[8][y])+200,(int)(p[5][x])+200,(int)(p[5][y])+200);
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,(int)(p[5][x])+200,(int)(p[5][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,(int)(p[8][x])+200,(int)(p[8][y])+200);
g.drawImage (buffer, 0, 0, this);//完成整个空间的绘制

try {
//线程休眠10毫秒,此处的作用相当于给旋转正方体一个时间间隔,若不休眠,正方体的旋转式不容易看出的
Thread.sleep(10);
} catch (InterruptedException e) {}
double px, py, pz; //正方体顶点旋转后坐标
for (int i=1;i<9;i++) {
px = p[i][x]; //顶点旋转前X坐标
py = p[i][y]; //顶点旋转前Y坐标
pz = p[i][z]; //顶点旋转前Z坐标
//X轴旋转变换
p[i][y] = py*Math.cos(angle_x)-pz*Math.sin(angle_x);
p[i][z] = py*Math.sin(angle_x)+pz*Math.cos(angle_x);
py = p[i][y]; //X轴变换后坐标
pz = p[i][z];
//Y轴旋转变换
p[i][x] = px*Math.cos(angle_y)+pz*Math.sin(angle_y);
p[i][z] =-px*Math.sin(angle_y)+pz*Math.cos(angle_y);
px = p[i][x]; //变换后坐标
//Z轴旋转变换
p[i][x] = px*Math.cos(angle_z)-py*Math.sin(angle_z);
p[i][y] = py*Math.cos(angle_z)+px*Math.sin(angle_z);
}
repaint(); //重绘,即重新调用paint方法
}

public void update(Graphics g) {paint(g);}
}

这个类最核心的地方还是在paint方法,paint中最核心的部分又是关于坐标的旋转变换和sleep休眠,整个程序看下来还是不难理解的.
程序通过二维数组存储正方体的顶点坐标,初次绘制,然后调用线程重复旋转变换顶点坐标,然后重绘变换后的顶点坐标.因为有sleep,所以每次时间间隔后重绘的图像会和前一图像连续形成整体旋转动画。
关于旋转速度参数很重要,整个程序可以通过改变它来控制转速。

回答2:

import java.awt.*;
import java.applet.*;
public class Wuerfel extends Applet {
// 定义一个2维数组
double p[][] = new double[9][4];
// 这个不知道,那么多的代码,没兴趣去读,而且对绘图也没兴趣
int x=1, y=2, z=3;
// 图形初始化方法
public void init() {
// 设置背景颜色
setBackground(new Color(255,255,255));
/* 为2维数组赋值,具体干什么用的不知道 */
p[1][x] = -100; p[1][y] = -100; p[1][z] = -100;
p[2][x] = +100; p[2][y] = -100; p[2][z] = -100;
p[3][x] = +100; p[3][y] = -100; p[3][z] = +100;
p[4][x] = -100; p[4][y] = -100; p[4][z] = +100;
p[5][x] = -100; p[5][y] = +100; p[5][z] = -100;
p[6][x] = +100; p[6][y] = +100; p[6][z] = -100;
p[7][x] = +100; p[7][y] = +100; p[7][z] = +100;
p[8][x] = -100; p[8][y] = +100; p[8][z] = +100;
}
double angle_x = 0.01;
double angle_y = 0.0075;
double angle_z = 0.005;
// 图片类
Image buffer;
// 画布,所有绘制,都是他来执行
Graphics2D gBuffer;
// 画图方法
public void paint(Graphics g) {
if (buffer==null) {
// 创建图片
buffer=createImage(this.getSize().width, this.getSize().height);
// 得到图片(在得到的图片的基础上画图)
gBuffer=(Graphics2D)buffer.getGraphics();
}
/* 开始绘图 */
gBuffer.clearRect(0,0,this.getSize().width, this.getSize().height);
gBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,(int)(p[2][x])+200,(int)(p[2][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,(int)(p[3][x])+200,(int)(p[3][y])+200);
gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,(int)(p[4][x])+200,(int)(p[4][y])+200);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,(int)(p[1][x])+200,(int)(p[1][y])+200);
gBuffer.drawLine((int)(p[5][x])+200,(int)(p[5][y])+200,(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[6][x])+200,(int)(p[6][y])+200,(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.drawLine((int)(p[7][x])+200,(int)(p[7][y])+200,(int)(p[8][x])+200,(int)(p[8][y])+200);
gBuffer.drawLine((int)(p[8][x])+200,(int)(p[8][y])+200,(int)(p[5][x])+200,(int)(p[5][y])+200);
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,(int)(p[5][x])+200,(int)(p[5][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,(int)(p[8][x])+200,(int)(p[8][y])+200);
// 绘制图片
g.drawImage (buffer, 0, 0, this);

try {
// 暂停10毫毛
// 因为此方法会引发异常,所以要try
Thread.sleep(10);
} catch (InterruptedException e) {}
/* 好像是定坐标吧 */
double px, py, pz;
for (int i=1;i<9;i++) {
px = p[i][x];
py = p[i][y];
pz = p[i][z];
p[i][y] = py*Math.cos(angle_x)-pz*Math.sin(angle_x);
p[i][z] = py*Math.sin(angle_x)+pz*Math.cos(angle_x);
py = p[i][y];
pz = p[i][z];
p[i][x] = px*Math.cos(angle_y)+pz*Math.sin(angle_y);
p[i][z] =-px*Math.sin(angle_y)+pz*Math.cos(angle_y);
px = p[i][x];
p[i][x] = px*Math.cos(angle_z)-py*Math.sin(angle_z);
p[i][y] = py*Math.cos(angle_z)+px*Math.sin(angle_z);
}
repaint();
}
public void update(Graphics g) {paint(g);}
}

回答3:

楼上是不是傻了,楼主会连基本的定义一个二维数组这样的东西都不知道吗,实质性,人家不懂的关键的地方一个没讲,你这注释算什么,不如我给你的注释做个注释吧:这是一个注释!