1. 程式人生 > >計算幾何-常用幾何函式(模板)

計算幾何-常用幾何函式(模板)

浮點誤差與精度問題

實數是用浮點數運算的,精度受到限制,特別是乘除法之後,誤差比較大。此時>=<是可能出現誤差的。我們可以認為非常接近0的實數都是0,寫一個實數的三出口函式。

程式碼:

const double eps=1e-8;
int dcmp(double d)
{
    if(fabs(d)<eps) return 0;//fabs(x)返回實數x的絕對值
    return (d>0)? 1:-1;
}

叉積判斷方向

p1×p2 = x1y2 - x2y1 = - p2×p1

若p1×p2為正,則相對於原點(0,0)來說,p2位於p1逆時針方向;若p1×p2為負,p2位於p1順時針方向;若為0則方向相同,或相反。


判斷點是否線上段上

如果想判斷一個點是否線上段上,那麼要滿足以下兩個條件:

(1)(Q - P1) * (P2 - P1)= 0;

(2)Q在以P1,P2為對角頂點的矩形內;


struct point  
{  
    double x;  
    double y;  
};  
  
bool onSegment(point Pi , point Pj , point Q)  
{  
    if((Q.x - Pi.x) * (Pj.y - Pi.y) == (Pj.x - Pi.x) * (Q.y - Pi.y)  //叉乘   
       //保證Q點座標在pi,pj之間   
       && min(Pi.x , Pj.x) <= Q.x && Q.x <= max(Pi.x , Pj.x)      
       && min(Pi.y , Pj.y) <= Q.y && Q.y <= max(Pi.y , Pj.y))  
        return true;  
    else  
        return false;  
}