三維幾何-三角形
阿新 • • 發佈:2018-12-17
三角形的有向面積的二倍。和二維情形一樣,注意求出叉積後要取長度。
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內 } }