我真的找不到任何资源来知道如何计算一组点的边界框。
我有一个浮点数/ int数组,我希望计算边界框(我想知道边界框矩形的所有四个角)。我该如何做到这一点?
答案 0 :(得分: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
。
答案 1 :(得分:1)
计算AABB(轴对齐边界框)非常简单。只需对每个轴上的点进行排序,找到每个轴上的最小最大值。这些点的4条线的交点是您的AAB矩形。
计算OBB(定向边界框)有点不重要。幸运的是,GestureUtils上有一种方法就是这样做,即:
GestureUtils.computeOrientedBoundingBox(float[] points)
传递你的浮点阵点,生活很好:)
答案 2 :(得分: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);
}