添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

我有一个float/int的点数组,我想计算它的边界框(我想知道边界框的所有矩形的四个角)。我怎样才能做到这一点?

2 个评论
你想知道触摸是否在矩形内吗?
我有一个矩形的手势叠加视图......我想找到手势的边框。
android
gesture-recognition
Aakash Anuj
Aakash Anuj
发布于 2012-12-07
3 个回答
Simon
Simon
发布于 2020-08-05
0 人赞同

你可以循环浏览数组。

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].ymaxY = Integer.MAX_VALUE

numan salati
numan salati
发布于 2020-08-05
0 人赞同

计算AABB(轴对齐的边界盒)是相当琐碎的。只要对每个轴上的点进行排序,找到每个轴上的最小最大值。这些点的4条线的交点就是你的AAB矩形。

计算OBB(oriented bounding box)略微有点不简单。幸运的是,在GestureUtils上有一个方法可以做到这一点,那就是:

GestureUtils.computeOrientedBoundingBox(float[] points)

把你的浮点数组传给它,生活就会变得很好 :)

Krythic
Krythic
发布于 2020-08-05
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;