計算幾何基本操作總結

2021-09-05 11:22:53 字數 2960 閱讀 6692

挖坑自用,可能又不全面的地方歡迎指出

//double已被define為db

點與向量

點與向量是乙個二元組,在運算方面相似,因此可以定義成乙個結構體

struct point  

point ( db _x , db _y )

point operator + ( const point &a ) const

point operator - ( const point &a ) const

point operator * ( const db &a ) const

point operator / ( const db &a ) const

db mo ( )

}

其中模長,數乘是針對向量的,加法可以理解為 點+向量=點 或 向量+向量=向量 。減法可以是點-點=向量

基本操作有:點積和叉積,這兩個運算都是針對向量的,點積定義為兩向量投影的長度之積,公式為x1x2+y1y2,常被用於判垂直(點積為0),叉積 值等於兩向量構成的平行四邊形的面積,公式為x1y2-y1x2,可用來判斷a向量在b向量的順時針或逆時針方向,若值為0,則重合;若值大於0,則a在b的順時針;若值小於0,則a在b的逆時針。

db cha ( point a , point b ) 

db dian ( point a , point b )

對於乙個角度,只需記錄其sin與cos即可在0-2π中唯一確定,而且用角也是用sin與cos偏多,所以用sin與cos來表示乙個角,角相加則直接用公式sin(a+b)=sin(a)cos(b)+cos(a)sin(b)計算,cos亦然(數乘可以用類似快速冪求)。

struct ang  

ang ( db _si , db _co )

ang operator + ( const ang &a ) const

ang operator - ( const ang &a ) const

} ;

操作 : 把乙個向量逆時針旋轉乙個角度。

先取向量的起點為原點,則需要求的是a(x,y)繞原點旋轉之後的點座標,原向量可表示為(kcos(a),ksin(a)),k為a到原點的距離,注意到旋轉後a到原點距離不變,只是角度加了一下,所以旋轉過後點座標為(kcos(a+b),ksin(a+b)) 用類似角與角相加的做法即可。我定義的角的第乙個元素是sin,所以要換一下。

point rota ( point a , ang alp ) //逆時針 

直線

兩點確定乙個直線,所以可以用不同的兩點來存直線(點+向量亦可)

struct line  

line ( point _d , point _e )

} ;

操作:判斷直線是否過一點a。兩點到a的向量的叉積為0。

操作:判斷兩直線位置關係。兩直線的向量的叉積為0時平行或重合,否則相交。

操作:求中垂線。先獲得乙個中點m,再旋轉am向量後相加得到另乙個點

操作:兩直線求交點。(推薦畫圖理解)。設a,b是a上兩點,c,d是b上兩點,交點為e,則向量a->c與a->d的叉積是三角形acd的面積s1*2。同理b->c與b->d的叉積是三角形bcd的面積s2*2,因為acd與bcd同底,再根據三角形相似,s1/s2=ae/be,也就是得到了ae與be長度之比,e=a+(b-a)*(s1 / (s1-s2))。用點與向量計算繞開了分母為0的討論(唯一情況s1=s2,但這代表a==b,即a的表示不合法),並且因為叉積自帶方向性不需討論正負,比列方程更方便。

point line_and_line ( line a , line b ) 

圓心加半徑存圓

struct cir  

cir ( point _md , db _r )

} ;

操作:3點定最小覆蓋圓。

先判斷3點共線,共線則以

最長的線段為半徑做圓。否則求三角形外接圓,就是三角形三邊中垂線的交點。

cir made_2 ( point a , point b ) 

cir made_3 ( point a , point b , point c )

point mp = a + ( ( b - a ) / 2 ) , det = a - mp ;

line g1 ( mp , mp + rota ( det , ang ( 1.0 , 0.0 ) ) ) ;

mp = a + ( ( c - a ) / 2 ) , det = a - mp ;

line g2 ( mp , mp + rota ( det , ang ( 1.0 , 0.0 ) ) ) ;

point _md = line_and_line ( g1 , g2 ) ;

return cir ( _md , dist ( _md , a ) ) ;

}

操作:求圓與直線交點

設求的交點為b,首先可以用圓心+垂直向量獲得過圓心與l相垂直的直線,兩直線求交得交點a,然後勾股定理求出ab距離,與l的向量的模長做個比即可求出向量ab了。(一般情況有兩個對應加和減)

point cir_and_line ( cir p , line l ) 

操作:求過一點圓的切線

設點n與圓的交點為a,則角oan是直角,求出an的長度,直接旋轉即可

line point_cut_cir ( cir p , point n ) 

待更......

計算幾何總結

hdu1392 surround the trees 凸包模版題 poj 1228 grandpa s estate 穩定凸包 poj2187 beauty contest 旋轉卡殼,求凸包中任意兩點的距離 hdu2036 改革春風吹滿地 多邊形面積模版題 hdu 2892 area 凸多邊形與圓的...

計算幾何基本模板

上傳一下計算幾何的基本模板,自己也可以看 include include include using namespace std struct point typedef point vector point point double x,double y 向量與向量的 點積 叉積 vector o...

計算幾何基本模板

const double eps 1e 8 const double pi acos 1.0 判浮點數符號 int sgn double x point定義 struct point point double x double y point operator const point b const...