0

ポイントのセットの境界ボックスを計算する方法を知るためのリソースが本当に見つかりません。

境界ボックスを計算したい点の float/int 配列があります (境界ボックスの四角形の四隅をすべて知りたい)。どうすればこれを達成できますか?

4

3 に答える 3

1

配列をループできます:

int minX = Integer.MAX_VALUE, minY, maxX, maxY = Integer.MAX_VALUE;

for (int i=0;i<myArray.length;i++){
    if (myArray[i].x > maxX){
        maxX = myArray[i].x;
    } else if (myArray[i].x < minX) {
        minX = myArray[i].x;
    } else if (myArray[i].y > maxY){
        maxY = myArray[i].y;
    } else (myArray[i].y < minY) {
        minY = myArray[i].y;(
    }
}

使用しているリストの種類(ポイントの配列など)については言及していないため、必要に応じて調整する必要がありmyArray[i].yますmaxY = Integer.MAX_VALUE

于 2012-12-07T10:02:36.850 に答える
1

AABB (軸に合わせたバウンディング ボックス) の計算はかなり簡単です。各軸のポイントを並べ替えて、各軸の最小最大値を見つけます。これらの点からの 4 本の線の交点が AAB 長方形です。

OBB (指向性バウンディング ボックス) の計算は、少し複雑です。幸いなことに、まさにそれを行う GestureUtils のメソッドがあります。

GestureUtils.computeOrientedBoundingBox(float[] ポイント)

ポイントの浮動小数点配列を渡すと、人生は良いです:)

于 2013-03-18T19:12:39.613 に答える
0

参照しているポイントの種類を実際に指定していませんでしたが、このコードはまだ機能するはずです。モデルの頂点の周りに境界ボックスを作成するために使用します。また、回転は頂点のロードとは別に発生する必要があることに注意してください。明示的に述べられていない限り、または頂点データでシリアル化されていない限り、回転を検出できないことは確かです。また、AABB と OBB は技術的には (数学的な観点からは) 同じことです。したがって、質問に Oriented Bounding Box が具体的に記載されていても、次のコードは両方で機能します。ただし、後でボックスを回転させる必要があります。何らかの方法でローテーションをシリアル化しない限り。

        public void FromVertices(Vertex[] vertices)
        {
            // Calculate Bounding Box
            float minX = float.PositiveInfinity;
            float maxX = float.NegativeInfinity;
            float minY = float.PositiveInfinity;
            float maxY = float.NegativeInfinity;
            float minZ = float.PositiveInfinity;
            float maxZ = float.NegativeInfinity;
            for (int i = 0; i < vertices.Length; i++)
            {
                Vector3 vertex = vertices[i].Location;
                // Check for maximum
                if (vertex.X > maxX)
                {
                    maxX = vertex.X;
                }
                if (vertex.Y > maxY)
                {
                    maxY = vertex.Y;
                }
                if (vertex.Z > maxZ)
                {
                    maxZ = vertex.Z;
                }
                // Check for Minimum
                if (vertex.X < minX)
                {
                    minX = vertex.X;
                }
                if (vertex.Y < minY)
                {
                    minY = vertex.Y;
                }
                if (vertex.Z < minZ)
                {
                    minZ = vertex.Z;
                }
            }
            this.Minimum = new Vector3(minX, minY, minZ);
            this.Maximum = new Vector3(maxX, maxY, maxZ);
        }
于 2020-08-05T01:09:31.610 に答える