計算幾何全家桶(一)
阿新 • • 發佈:2022-03-19
計算幾何全家桶(一)
【一】:圖形之間的位置關係
1.點與線段
- 判斷點是否線上段上
給定點 \(P\),線段的端點 \(A,B\),如果點 \(P\) 線上段 \(AB\) 上,則需滿足 \(PA\) 與 \(PB\) 共線,且 \(P\) 在 \(AB\) 之間。
bool check_xd(d p,d a,d b){//判斷點 p 是否線上段 AB 上 return !jd(cj(p-a,b-a))&&jd(dj(p-a,p-b))<=0; //用 len(p-a)+len(p-b)==len(a-b) 判斷更為直觀,但精度損失大 }//向量pa與pb共線且p在a,b之間
- 求點到線段的距離
給定點 \(P\),線段的端點 \(A,B\),點到線段距離情況分三種。
第一種: 最近距離是線段 \(PA\) 的長度
第二種: 最近距離是線段 \(BP\) 的長度
第三種: 最近距離是點 \(P\) 到線段 \(AB\) 的垂直距離
dd dis_xd(d p,d a,d b){//點 P 到線段 AB 的距離 if(a==b)return len(p-a);//特判線段兩端點重合的情況 d x=p-a,y=p-b,z=b-a;//x:PA y:PB z:BA if(jd(dj(x,z))<0)return len(x); if(jd(dj(y,z))>0)return len(y); return ABS(cj(x,z)/len(z));//用叉積計算面積除底邊長就是點到線段垂直距離 }
1.點與直線
- 判斷點是否在直線上
給定點 \(P\),直線上的兩點 \(A,B\),則只需判斷直線 \(AP\) 與直線 \(BP\) 共線即可。
bool check_zx(d p,d a,d b){//判斷點 P 是否在直線 AB 上
return !jd(cj(p-a,p-b));//PA,PB 共線
}