【計算幾何】點定位(線段,三角形,多邊形)
阿新 • • 發佈:2019-01-07
判斷是否點線上段上
1.滿足向量 AC×AB == 0,使C點滿足在AB的直線上
2.滿足C在AB構成的矩形內,使C點排除在AB的延長線和反向延長線上
注意:考慮豎直和水平的情況,橫座標和縱座標都要判斷。
bool dot_line(point a,point b,point c) { V v_line,v_dot; v_line.start = a; v_line.end = b; v_dot.start = a; v_dot.end = c; double temp = cross_mul(v_line,v_dot); if(fabs(temp) < esp && c.x >= min(a.x,b.x) && c.x <= max(a.x,b.x) && c.y >= min(a.y,b.y) && c.y <= max(a.y,b.y)) return true; return false; }
判斷點在三角形內外
點在平面內與三角形三個點構成的三個三角形的面積和 與 原三角形的面積比較
如果相等,即可判斷在三角形內
struct triangle { point a,b,c; }; bool dot_triangle(point x,triangle f) { V ax,bx,cx,ab,ac; ax.start = f.a; ax.end = x; bx.start = f.b; bx.end = x; cx.start = f.c; cx.end = x; ab.start = f.a; ab.end = f.b; ac.start = f.a; ac.end = f.c; double abx = fabs(cross_mul(ax,bx)); double acx = fabs(cross_mul(ax,cx)); double bcx = fabs(cross_mul(bx,cx)); double abc = fabs(cross_mul(ab,ac)); if(fabs(abx+acx+bcx - abc) < esp) return true; return false; }
判斷點在多邊形內外
1. 掃描線法
顧名思義,從要判斷的點構造任意射線,計算射線與多邊形的交點個數,一般情況下,個數為奇數則在多邊形裡面,反之在外面。
既然寫一般情況,那麼就有特殊情況。
除了要注意,在用多邊形的邊和射線相交來算交點,如果交於頂點處,射線與兩個邊相交,但只能算一個點
也有可能射線與邊重合,還有可能點在多邊形邊上,
另外最麻煩的是如下圖情況,只能算一個點,然而書上的解決方法(如果頂點是所屬邊上縱座標上較大的頂點)我不大認同,我想下圖反一下不就行不通了嗎,可能是我沒懂。。。
2. 叉乘判別法(只適用凸多邊形)
原理比較簡單,對於一個處於凸多邊形內部的點,與所有頂點連線,生成以此點開始的向量,根據頂點的順序運算相鄰向量的叉積,叉積的符號一直不變。
特殊情況:叉積為0,其實繼續判斷即可。
3. 角度和的判斷法
原理更簡單,在多邊形內部,點和多邊形頂點連線組成的所有三角形角度(以所求點為頂點)和為360。