【发布时间】:2015-06-23 01:56:10
【问题描述】:
所以我正在制作一个简单的 3D 图形程序。但是我有一个与图形没有直接关系的错误。
我有一个 Triangle 类,可以平移、旋转等。我还有一个 Shape 类,可以从这些三角形中生成形状。所以当我想移动一个形状时,我可以使用一个形状对象来统一移动所有的形状。
当我尝试移动一个形状时会出现这个错误。发生的事情是翻译意味着传递给连续的所有三角形。但其中一些人的翻译翻了一番。
经过大量调试,我发现了一些奇怪的结果,因为似乎某些顶点承担了上一次迭代顶点的平移,但只有其中一些。 因此,将翻译翻倍。
我会附上屏幕截图,但我的声望不够高。
到目前为止,我唯一的解释是某些顶点共享数据。或者其中一些顶点的数据在运行时被存储并被使用,因为这些顶点是相似的。
形状类 -> 持有三角形对象
三角形类 -> 拥有 3 个顶点对象 -> 还有显示和翻译的方法
顶点类 -> 持有双 x、双 y、双 z
可能值得注意的是 shape 类中不同三角形的一些顶点具有相同的顶点。但这应该不是问题,因为它们会传递给不同的三角形。
Index: 0 // First Triangle
next check: 1.0 // The z value of the first vertex int the next triangle(index 1)
1.0 // z val. before translation
1.010356248053852, dz: 0.009999833334166664 // z val. after translation
1.0 // z val. before translation
1.010356248053852, dz: 0.009999833334166664 // z val. after translation
1.0 // z val. before translation
1.010356248053852, dz: 0.009999833334166664 // z val. after translation
Index: 1 // Second triangle
next check: 1.5 // next check
1.010356248053852 // z val. before translation
1.0207124961077039, dz: 0.009999833334166664 // z val. after translation
最后两行是重要的。第一个应该说 1.0,正如索引 0 所说的那样(下一次检查:1.0)。 然而,当我们到达第二个三角形时,它已经平移了第一个三角形。因此,再次赋予效果。
这不会发生在所有人身上。
提前感谢您对文章的任何帮助或指导。
public Triangle(Point x, Point y, Point z, byte r, byte g, byte b, double fov)
{
points = new Point[]{x, y, z};
m_r = r;
m_g = g;
m_b = b;
FOV = fov;
}
public void move(double x, double y, double z, double delta)
{
for (int i = 0; i < 3; i++)
{
points[i].setDX(points[i].getDX() + (x * delta));
points[i].setDY(points[i].getDY() + (y * delta));
points[i].setDZ(points[i].getDZ() + (z * delta));
}
}
/\重要的三角码
public void move(double x, double y, double z, double delta)
{
for (int i = 0; i < index.length; i++)
{
rs.triMove(index[i], x, y, z, delta);
}
}
/\形状移动代码 rs 是所有三角形的集合空间,但在添加此错误之前就开始了。索引是三角形在 rs 数组中的位置。
public void triMove(int index, double x, double y, double z, double delta)
{
triangles.get(index).move(x, y, z, delta);
}
/\RS类动作代码。
一些可能有用的图片。 此刻很好/\当静止时
/\ 现在有点坏了。其中两个的 z 值翻了一番,另外两个没问题。
但是它们仍然是相同的点出错和相同的损坏量?
但有些东西非常奇怪的是,如果同一个记录是由四个三角形组成的。 但显然,这是一种破解方法,它不适用于更复杂的形状。
【问题讨论】:
-
如果您认为自己发现了编译器错误,那么您可能还没有。
-
您应该包含一个MCVE 以允许其他人从外部测试您的代码和相关问题。
-
没有源码很难说,但每次看到“不正确”的浮点值,很可能与对浮点数性质的理解泄露有关:epramono.blogspot.com.au/2005/01/double-vs-bigdecimal.html跨度>
-
是的,我认为这是我的错,但我一直在寻找这个错误的日子,但一无所获。所以我有些幼稚的乐观。