我有三个三角形的顶点,即(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个网格)并继续吗?
先谢谢。