極角排序詳解:


極角排序詳解

名詞釋義:

在平面內取一個定點O,叫極點,引一條射線Ox,叫做極軸,再選定一個長度單位和角度的正方向(通常取逆時針方向)。對於平面內任何一點M,用ρ表示線段OM的長度(有時也用r表示),θ表示從Ox到OM的角度,ρ叫做點M的極徑,θ叫做點M的極角,有序數對 (ρ,θ)就叫點M的極坐標

四種極角排序代碼詳解:

 

 1 struct point  2 {  3     double x,y;  4 };  5 
 6 double cross(double x1,double y1,double x2,double y2) //計算叉積
 7 {  8     return (x1*y2-x2*y1);  9 } 10 
11 double compare(point a,point b,point c) 12 { 13     return cross((b.x-a.x),(b.y-a.y),(c.x-a.x),(c.y-a.y)); 14 }

 

1、利用complex類按極角從小到大排序:

1 bool cmp0(const point& a, const point& b) // 利用complex類按極角從小到大排序
2 { 3     complex<double> c1(a.x,a.y);                   //頭文件 #include<complex>
4     complex<double> c2(b.x,b.y); 5     if( arg(c1) == arg(c2)) 6         return a.x<b.x; 7     return arg(c1) < arg(c2); 8 }

2、利用atan2()函數按極角從小到大排序

1 bool cmp1(point a,point b)//利用atan2()函數按極角從小到大排序
2 { 3     if(atan2(a.y,a.x)!=atan2(b.y,b.x)) 4         return atan2(a.y,a.x)<atan2(b.y,b.x); 5     else return a.x<b.x; 6 }

3、利用叉積按極角從小到大排序

1 bool cmp2(point a,point b) //利用叉積按極角從小到大排序
2 { 3     point c;//原點
4     c.x = 0; 5     c.y = 0; 6     if(compare(c,a,b)==0) 7         return a.x<b.x; 8     else return compare(c,a,b)>0; 9 }

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

 1 int Quadrant(point a)  //象限排序  2 {  3     if(a.x>0&&a.y>=0)  return 1;  4     if(a.x<=0&&a.y>0)  return 2;  5     if(a.x<0&&a.y<=0)  return 3;  6     if(a.x>=0&&a.y<0)  return 4;  7 }  8 
 9 
10 bool cmp3(point a,point b)  //先按象限從小到大排序 再按極角從小到大排序
11 { 12     if(Quadrant(a)==Quadrant(b)) 13         return cmp1(a,b); 14     else Quadrant(a)<Quadrant(b); 15 }

 


本文為個人隨筆,如有不當之處,望各位大佬多多指教.
若能為各位博友提供小小幫助,不勝榮幸.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM