給定平面上一點p(x0,y0),判斷該點是否在三角形abc中,三角形頂點座標分別為a(xa,xb),b(xb,yb),c(xc,yc)。可以使用面積法來判斷,方法如下:其中s(a,b,c)表示三角形abc的面積。
1、 若abs( s(a,b,c) ) = abs( s(p,b,c) ) + abs( s(a,p,c) ) + abs( s(a,b,p) ) ,則p在三角形abc的內部或邊上;如果還有abs( s(p,b,c) )、abs( s(a,p,c) ) 和abs( s(a,b,p) )全都大於0,則說明p在三角形abc的內部,否則p在三角形abc的邊上,具體為:s(p,b,c)為0,則說明p在bc邊上,s(a,p,c)為0,則說明p在ac邊上,s(a,b,p)為0,則說明p在ab邊上;
2、 若abs( s(a,b,c) ) < abs( s(p,b,c) ) + abs( s(a,p,c) ) + abs( s(a,b,p) ) ,則p在三角形abc的外部;
3、 對abs( s(a,b,c) ) > abs( s(p,b,c) ) + abs( s(a,p,c) ) + abs( s(a,b,p) ) 情況在理論上是不存在的
此處又引出另乙個問題,如何求平面中三角形的面積?這個可以使用叉乘法來實現,即s(a,b,c)為向量ab叉乘ac所得向量模的1/2,再對該值求絕對值就是三角形abc的面積。
#include #include using namespace std; #define abs_float_0 0.0001 struct point_float ; /** * @brief 計算三角形面積 */ float get********squar(const point_float pt0, const point_float pt1, const point_float pt2) /** * @brief 判斷給定一點是否在三角形內或邊上 */ bool isin********(const point_float a, const point_float b, const point_float c, const point_float d) else } void main(void) else }
2D中判斷點是否在某一三角形內演算法
給定平面上一點p x0,y0 判斷該點是否在三角形abc中,三角形頂點座標分別為a xa,xb b xb,yb c xc,yc 可以使用面積法來判斷,方法如下 其中s a,b,c 表示三角形abc的面積。1 若abs s a,b,c abs s p,b,c abs s a,p,c abs s a,b...
平面中判斷點是否在某一三角形內演算法
引自 給定平面上一點p x0,y0 判斷該點是否在三角形abc中,三角形頂點座標分別為a xa,xb b xb,yb c xc,yc 可以使用面積法來判斷,方法如下 其中s a,b,c 表示三角形abc的面積。1 若abs s a,b,c abs s p,b,c abs s a,p,c abs s ...
判斷點是否在三角形內
概述 給定三角形abc和一點p x,y,z 判斷點p是否在abc內。這是遊戲設計中乙個常見的問題。需要注意的是,這裡假定點和三角形位於同乙個平面內。本文介紹三種不同的方法,由淺入深 一 內角和法 連線點p和三角形的三個頂點得到三條線段pa,pb和pc,求出這三條線段與三角形各邊的夾角,如果所有夾角之...