快速轴对齐的长方体数据类型

本文关键字:长方体 数据类型 对齐 | 更新日期: 2023-09-27 18:36:12

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

类似于System.Drawing.Rectangle的东西,但在3d中,例如

struct AACuboid
{
    int posX, posY, posZ;
    int width, length, height;
}

使用C1等标准操作。包含(c2),c1。相交(c2),c1。旋转(轴,0/90/180)...以及基本操作,如相等,iComparable,hashCode...

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

与其重新发明轮子,并且可能忘记了一些基本的优化步骤,不如我可以使用免费提供的类?如果这也包括某种 R 树或类似的结构来加速交叉点,那就更好了,尽管这在这一点上是可选的。

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

快速轴对齐的长方体数据类型

到目前为止

,我所寻求的最佳匹配似乎是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 字节,是官方推荐的最大值的两倍)

现在让我感到困惑的主要事情是这些结构是可变的,并且实现的方法充分利用了这种可变性。我本以为这些类型是不可变的,或者至少没有公共的非只读变量。但我想Microsoft知道他们在做什么。

现在我不确定我是否应该为这些类型包含整个 xna 框架,或者只是简单地根据它们对我自己的类型进行建模。

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

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