幾何 極角排序詳解

2022-05-09 02:48:09 字數 1452 閱讀 4945

關於極角排序:

在平面內取乙個定點o,叫極點,引一條射線ox,叫做極軸,再選定乙個長度單位和角度的正方向(通常取逆時針方向)。

對於平面內任何一點m,用ρ表示線段om的長度(有時也用r表示),θ表示從ox到om的角度,ρ叫做點m的極徑,θ叫做點m的極角,有序數對 (ρ,θ)就叫點m的極座標。

那麼給定平面上的一些點,把它們按照乙個選定的中心點排成順(逆)時針。

極角排序常用的四種方法:

在說四種方法之前,給出一會用到的函式和儲存點的結構體

struct point//

儲存點;

double cross(double x1,double y1,double x2,double y2) //

計算叉積

double compare(point a,point b,point c)//

計算極角

方法1:利用atan2()函式按極角從小到大排序。

關於atan2()函式:在c語言的math.h或c++中的cmath中有兩個求反正切的函式atan(double x)與atan2(double y,double x)  他們返回的值是弧度要轉化為角度再自己處理下。

前者接受的是乙個正切值(直線的斜率)得到夾角,但是由於正切的規律性本可以有兩個角度的但它卻只返回乙個,因為atan的值域是從-90~90 也就是它只處理一四象限,所以一般不用它。

第二個atan2(double y,double x) 其中y代表已知點的y座標,同理x ,返回值是此點與遠點連線與x軸正方向的夾角,這樣它就可以處理四個象限的任意情況了,它的值域相應的也就是-180~180了

bool cmp1(point a,point b)

方法2:利用叉積按極角從小到大排序。

關於叉積:叉積=0是指兩向量平行(重合);叉積》0,則向量a在向量b的順時針方向(粗略的理解為在a在b的下方);叉積<0,則向量a在向量b的逆時針方向(粗略的理解為在a在b的上方)

bool

cmp2(point a,point b)

方法3:先按象限從小到大排序 再按極角從小到大排序

int quadrant(point a)  //

象限排序,注意包含四個座標軸

bool c***(point a,point b) //

先按象限從小到大排序 再按極角從小到大排序

關於三種方法的比較:

第三種方法按象限從小到大排序 再按極角從小到大排序是在有特殊需求的時候才會用到,這裡不做比較。

關於第一種方法,利用atan2排序,他和利用叉積排序的主要區別在精度和時間上。

精度: atan2精度不如叉積高,做過乙個題用anat2因為精度問題wa了。

所以兩種方法根據情況選擇一種合適的使用。

計算幾何 極角排序

amphiphilic carbon molecules 儲存個極角排序的板子。極角排序有兩種。一種是atan2,速度快,但是有精度誤差。另一種是叉積,速度慢但是只用進行整數運算。注意用叉積極角排序的時候,要把上半區和下半區分開來排,而且每個點所在的半區要唯一。struct point intget...

極角排序詳解

極角排序詳解 名詞釋義 在平面內取乙個定點o,叫極點,引一條射線ox,叫做極軸,再選定乙個長度單位和角度的正方向 通常取逆時針方向 對於平面內任何一點m,用 表示線段om的長度 有時也用r表示 表示從ox到om的角度,叫做點m的極徑,叫做點m的極角,有序數對 就叫點m的極座標 四種極角排序 詳解 s...

極角排序理解

這裡我們說的極角排序,指的是對於二維座標中的點,當然也可以說是向量。極角排序的用途一般是預處理二維平面中的點,使之變得相對有序,接下來在有序的條件小用o n 或者o nlogn 處理,而不是無序條件下的o n n 的列舉。應用鏈結 關於叉積 叉積 0是指兩向量平行 重合 叉積 0,則向量a在向量b的...