箱形三角碰撞试验的有效算法

时间:2018-01-14 01:22:48

标签: c# algorithm graphics 3d

我有三个三角形的顶点,即(x1,y1,z1); (x2,y2,z2)和(x3,y3,z3)。 我的三角形的边界框是长度=最大的立方体(xmax-xmin,ymax-ymin,zmax-zmin)。可以通过循环遍历三角形的所有顶点来计算xmax,xmin,....,zmin。

现在,考虑到特定的分辨率大小(h),我将边界框划分为网格。例如,如果我的边界框长度为10且分辨率为1,则为。网格将为1000(10 * 10 * 10)。

现在,我想找出所有那些与我的三角形相交的网格(立方体)以及位于我的三角形内的那些立方体。

我遵循以下方法: - >将我的边界框的所有网格存储在一个列表中(对于x,y,z使用3“for”循环。这涉及巨大的内存浪费) - >然后我循环遍历列表中的每个网格坐标,检查立方体是否位于我的平面上,如果立方体在我的平面上排列,那么我正在检查我的网格是否与三角形的三个边相交(或者如果我的网格位于我的三角形内。

我使用以下算法检查交叉点和内部标准:

 bool IfLineIntersectsPoint(float x, float y, float z)
    {
        bool checkifIntersects = false;
        FindProjectedPointonPlane(x, y, z);
       //Px,Py and Pz are projected points on the plane
        if ((((Px - vertex1x) / a) == ((Py - vertex1y) / b)) && (((Px - vertex1x) / a) == ((Pz - vertex1z) / c)))
        {
            checkifIntersects = true;
        }
        return checkifIntersects;
    }

bool PointInTriangle(Vector3[] TriangleVectors, Vector3 P)
        {
            Vector3 A = TriangleVectors[0], B = TriangleVectors[1], C = TriangleVectors[2];
            if (SameSide(P, A, B, C) && SameSide(P, B, A, C) && SameSide(P, C, A, B))
            {
                Vector3 AB = Vector3.Subtract(A, B);
                Vector3 AC = Vector3.Subtract(A, C);
                Vector3 AP = Vector3.Subtract(A, P);
                Vector3 vc1 = Vector3.Cross(AB, AC);

                float magnitude1 = AB.Length();
                float magnitude2 = vc1.Length();
                Vector3 NormAP = new Vector3(AP.X / magnitude1, AP.Y / magnitude1, AP.Z / magnitude1);
                Vector3 NormVC1 = new Vector3(vc1.X / magnitude2, vc1.Y / magnitude2, vc1.Z / magnitude2);
                float ftw = Math.Abs(Vector3.Dot(NormAP, NormVC1));
                if (ftw <= 0.1f)
                    return true;
            }

            return false;
        }

如果有人可以对我的算法和上述两个函数进行任何更改,我会很高兴,以便最大限度地减少我的计算时间。此外,如果我有一些8-9个三角形,每次,我正在检查所有1000个网格的所有这些标准。我可以获得这些1000个网格的一些子集(大约100-150个网格)并继续吗?

先谢谢。

0 个答案:

没有答案