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)... などの標準操作と、equality、iComparable、hashCode... などの基本操作を使用します。

このようなデータ型は簡単に記述できますが、1 秒間に多くのキューブの交差と比較を行うので、心配なのは高速に記述することです。

車輪を再発明するのではなく、おそらくいくつかの基本的な最適化ステップを忘れてしまうのではなく、私が使用できる自由に利用できるクラスはありますか? 現時点ではオプションですが、交差を高速化するためのある種の R ツリーまたは同様の構造も含まれているとさらに効果的です。

それ以外の場合、忘れてはならない基本的な最適化手順は何ですか? (つまり、構造体またはクラス? 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;
       ...
  }

したがって、float を含む構造体は、この種のデータには適切な設計選択であると思いますが、かなり大きくなります (24 バイト、公式に推奨されている構造体の最大値の 2 倍)。

今のところ私を混乱させているのは、これらの構造体が変更可能であり、実装されたメソッドがその変更可能性を大いに利用していることです。私は、これらの種類の型は不変であるか、少なくとも読み取り専用ではない公開変数を持たないと考えていたでしょう。しかし、マイクロソフトは彼らが何をしているかを知っていると思います。

今のところ、これらの型だけに xna フレームワーク全体を含めるか、単に独自の型をモデル化するかはわかりません。

しかし、私は他の提案を受け入れています。

于 2012-06-05T20:23:34.180 に答える
0

速度が主な関心事である場合、少しの傾斜 (または直方体が真の立方体から離れてドリフトするにつれて傾斜が大きくなる) に対処することは可能ですか? もしそうなら、球面交差をテストすることができます。これは非常に簡単で非常に高速です

于 2012-06-01T14:56:59.007 に答える