0

我正在寻找一种表示轴对齐长方体的数据结构

类似于 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)... 以及基本操作如相等、iComparable、hashCode...

这样的数据类型很容易写,我担心的问题是写得快,因为我每秒会做很多立方体的交集和比较。

与其重新发明轮子,也可能忘记一些基本的优化步骤,有没有可以免费使用的类?如果这还包括某种 R-Tree 或类似结构来加速交叉点,那就更好了,尽管此时这是可选的。

否则,我不应该忘记的基本优化步骤是什么?(即结构或类?x、y、z 内部表示为单个类成员或单个数组或结构?)

4

2 回答 2

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 框架,或者只是在它们之后建模我自己的类型。

但是,我愿意接受其他建议。

于 2012-06-05T20:23:34.180 回答
0

如果速度是您最关心的问题,您是否有可能处理一点坡度(或随着您的长方体远离真正的立方体而增加坡度)?如果是这样,您可以测试球形相交,这既简单又快速

于 2012-06-01T14:56:59.007 回答