【问题标题】:cube shrinks successively, when i rotate it with mouse..立方体连续缩小,当我用鼠标旋转它时..
【发布时间】: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.sleepmouseDragged 是个坏主意
  • 自旋转网格不是一个好主意(在任何变量类型上,尤其是在 int 上,除非您仅执行 90 度旋转而不会损失精度)。更好的是拥有原始网格并根据需要创建旋转。这并不意味着您需要有 2 个网格。例如,您可以仅在需要时计算旋转的顶点位置,而无需记住它...
  • 是的,我知道,但我是这个主题的新手,所以不知道有什么功能可以得到它,请建议更好的主意.. @MadProgrammer
  • 取决于你想做什么,可能是 Swing TimerSwingWorker

标签: java netbeans graphics 3d cube


【解决方案1】:

您将坐标存储为ints。

每次进行旋转时,都会进行不产生整数的计算;当你投射时,你会截断整数,向零舍入。因此收缩。

请改用double,或者更好的是,只需计算一个旋转矩阵,然后在渲染时将其应用于坐标。

【讨论】:

  • 实际上我没有手动转换,netbeans 编译器建议我将 xcostheta-ysintheta 转换为 int @andyturner
  • 不管你为什么这样做,你是在截断数字。
猜你喜欢
  • 2017-01-19
  • 2023-04-06
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
相关资源
最近更新 更多