三维几何-三角形
程序员文章站
2022-04-01 14:47:01
...
三角形的有向面积的二倍。和二维情形一样,注意求出叉积后要取长度。
double Area2(const Vector3 &A,const Vector3 &B, const Point3 &C)
{
return Length(Cross(B-A, C-A));
}
判断点是否在三角形内。先判断点是否在三角形所在平面上,然后利用简单的面积关系即可。
这里我们假定P在P0、P1和P2确定的平面上。
bool PointInTri(const Point3 &P, const Point3 &P0, const Point3 &P1, const Point3 &P2)
{
double area1, area2, area3;
area1 = Area2(P, P0, P1);
area2 = Area2(P, P2, P0);
area3 = Area2(P, P1, P2);
return (dcmp(area1+area2+area3 - Area2(P0, P1, P2)) == 0);
}
判断线段是否和三角形相交。利用上面的函数不难得到。
bool TriSegIntersection(const Point3 &P0, const Point3 &P1, const Point3 &P2, const Point3 &A, const Point3 &B, Point3 &P)
{
Vector3 n;
double t;
n = Cross(P1-P0, P2-P0);
if(dcmp(Dot(B-A, n)) == 0) //线段AB和平面P0P1P2平行或共面
return false;
else //平面A和直线P1-P2有唯一交点
{
t = Dot(n, P0-A) / Dot(n, B-A);
if(dcmp(t) < 0 || dcmp(t-1) > 0) //线段不在线段AB上
return false;
P = A + (B-A)*t; //计算交点
return PointInTri(P, P0, P1, P2); //判断交点是否在三角形p0-p1-p2内
}
}
判断两个三角形是否有公共点,三角形的内部,边,顶点都算作三角形的一部分。
如果相交,那么必然有一个三角形的一条边经过另一个三角形的内部、边上或者顶点。
bool TriTriIntersection(Point3 *T1, Point3 *T2)
{
int i;
Point3 P;
for(i = 0; i < 3; i++)
{
if(TriSegIntersection(T1[0], T1[1], T1[2], T2[i], T2[(i+1)%3], P))
return true;
if(TriSegIntersection(T2[0], T2[1], T2[2], T1[i], T1[(i+1)%3], P))
return true;
}
return false;
}
上一篇: [POJ2653]Pick-up sticks(计算几何-叉积)
下一篇: Pair.cpp