我正在寻找表示轴对齐长方体的数据结构
类似于System.Drawing.Rectangle,但在3d中,例如
struct AACuboid
{
int posX, posY, posZ;
int width, length, height;
}
使用标准操作,如c1.Contains(c2),c1.Intersects(c2),c1.Rotate(axis,0 / 90/180)...... 以及基本操作,如equality,iComparable,hashCode ......
这样的数据类型很容易编写,我担心的问题是快速编写,因为我将每秒进行大量的立方体交叉和比较。
我可以使用免费提供的课程,而不是重新发明轮子,并且可能忘记了一些基本的优化步骤? 如果这还包括某种R-Tree或类似的结构来加速交叉点,那就更好了,尽管此时这是可选的。
否则,我不应忘记的基本优化步骤是什么? (即结构或类?x,y,z内部表示为单个类成员或单个数组或结构?)
答案 0 :(得分:1)
到目前为止,我寻求的最佳匹配似乎是 Microsoft.Xna.Framework.BoundingBox,其研究证明既有启发性又令人困惑。
它是一个结构:
public struct BoundingBox : IEquatable<BoundingBox>
{
public Vector3 Min; public Vector3 Max;
...
}
Vector3是另一个结构:
public struct Vector3 : IEquatable<Vector3>
{
public float X,Y,Z;
...
}
所以我认为包含浮点数的结构对于这类数据来说是一个很好的设计选择,甚至认为它们相当大(24字节,是官方建议的结构最大值的两倍)
现在让我困惑的主要事情是这些结构是可变的,并且实现的方法充分利用了这种可变性。我原以为这些类型是不可变的,或者至少没有公共的非只读变量。 但我想微软知道他们在做什么。
现在我不确定是否应该为这些类型包含整个xna框架,或者只是在它们之后模拟我自己的类型。
但我愿意接受其他建议。
答案 1 :(得分:0)
如果速度是您的主要考虑因素,您是否有可能处理一些斜坡(或当您的长方体从真正的立方体进一步漂移时增加斜率)?如果是这样,你可以测试球形交叉点,这非常容易和非常快