【发布时间】:2016-04-11 22:03:09
【问题描述】:
我为一个随着鼠标移动而旋转的立方体编写了以下代码, 但是当我旋转立方体或调整框架大小时,立方体会连续缩小。 这是要更改的代码还是框架.. 请帮助,,,
public class Cube extends javax.swing.JPanel implements MouseMotionListener {
int node0[] = {-100, -100, -100};
int node1[] = {-100, -100, 100};
int node2[] = {-100, 100, -100};
int node3[] = {-100, 100, 100};
int node4[] = {100, -100, -100};
int node5[] = { 100, -100, 100};
int node6[] = {100, 100, -100};
int node7[] = {100, 100, 100};
int nodes[][] = {node0, node1, node2, node3, node4, node5, node6, node7};
int edge0[] = {0, 1};
int edge1[] = {1, 3};
int edge2[] = {3, 2};
int edge3[] = {2, 0};
int edge4[] = {4, 5};
int edge5[] = {5, 7};
int edge6[] = {7, 6};
int edge7[] = {6, 4};
int edge8[] = {0, 4};
int edge9[] = {1, 5};
int edge10[] = {2, 6};
int edge11[] = {3, 7};
int edges[][] = {edge0, edge1, edge2, edge3, edge4, edge5, edge6, edge7, edge8, edge9, edge10, edge11};
// Rotate shape around the z-axis
public void rotateZ3D(int theta) {
double sinTheta = Math.sin(theta);
double cosTheta = Math.cos(theta);
for (int n=0; n<8; n++) {
int[] node = nodes[n];
int x = node[0];
int y = node[1];
node[0] = (int) (x * cosTheta - y * sinTheta);
node[1] = (int) (y * cosTheta + x * sinTheta);
}
};
public void rotateX3D(int theta) {
double sinTheta = Math.sin(theta);
double cosTheta = Math.cos(theta);
for (int n=0; n<8; n++) {
int[] node = nodes[n];
int y = node[1];
int z = node[2];
node[1] = (int) (y * cosTheta - z * sinTheta);
node[2] = (int) (z * cosTheta + y * sinTheta);
}
};
public void rotateY3D(int theta) {
double sinTheta = Math.sin(theta);
double cosTheta = Math.cos(theta);
for (int n=0; n<8; n++) {
int[] node = nodes[n];
int x = node[0];
int z = node[2];
node[0] = (int) (x * cosTheta - z * sinTheta);
node[2] = (int) (z * cosTheta + x * sinTheta);
}
};
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Draw edges
g.translate(150, 150);
rotateZ3D(60);
rotateY3D(60);
rotateX3D(60);
for (int e=0; e<12; e++) {
int n0 = edges[e][0];
int n1 = edges[e][1];
int node0[] = nodes[n0];
int node1[] = nodes[n1];
g.drawLine(node0[0], node0[1], node1[0], node1[1]);
}
// Draw nodes
for (int n=0; n<8; n++) {
int node[] = nodes[n];
g.drawOval(node[0], node[1], 5,5);
g.drawString(n+"", node[0], node[1]);
}
};
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JFrame j = new JFrame();
Cube p = new Cube();
j.add(p);
j.addMouseMotionListener(p);
j.setSize(500,500);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.show();
// TODO code application logic here
}
@Override
public void mouseDragged(MouseEvent me) {
int x0 = me.getX();
int y0 = me.getY();
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
Logger.getLogger(Cube.class.getName()).log(Level.SEVERE, null, ex);
}
int x1 = me.getX();
int y1 = me.getX();
rotateY3D(x1 - x0);
rotateX3D(y1 - y0);
repaint();
}
@Override
public void mouseMoved(MouseEvent me) {
}
}
建议它的解决方案代码.. 它工作正常,只是立方体正在缩小
【问题讨论】:
-
Thread.sleep在mouseDragged是个坏主意 -
自旋转网格不是一个好主意(在任何变量类型上,尤其是在
int上,除非您仅执行 90 度旋转而不会损失精度)。更好的是拥有原始网格并根据需要创建旋转。这并不意味着您需要有 2 个网格。例如,您可以仅在需要时计算旋转的顶点位置,而无需记住它... -
是的,我知道,但我是这个主题的新手,所以不知道有什么功能可以得到它,请建议更好的主意.. @MadProgrammer
-
取决于你想做什么,可能是 Swing
Timer或SwingWorker
标签: java netbeans graphics 3d cube