0

我真的找不到任何资源来知道如何计算一组点的边界框。

我有一个浮点/整数数组,我希望为其计算边界框(我想知道边界框矩形的所有四个角)。我该如何做到这一点?

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 在技术上是相同的,正如我在这里证明的那样:https ://stackoverflow.com/a/63094985/3214889 。因此,即使您的问题特别说明了定向边界框,以下代码也适用于两者。但是,之后您需要旋转盒子;除非你以某种方式序列化旋转。

        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 回答