1. 程式人生 > 其它 >計算幾何全家桶(一)

計算幾何全家桶(一)

計算幾何全家桶(一)

【一】:圖形之間的位置關係

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 共線
}