題目鏈接:Scrambled Polygon
先給出知識點的講解鏈接:傳送門
極角就是高中學的,極座標系中的極角。
sort對結構體排序,不都有一個cmp的函數嗎?就是這個函數。
我們都會按照一個參數來改,這回我們就按照極角來排序。
bool cmp(node a,node b)
{
int f=mul(a,b,edge[0]);//以edge[0]點爲三角形的角點,求他們的叉積,下面判斷是順時針方向,還是逆時針方向。
if(f>0||f==0&&dis(a,edge[0])<dis(b,edge[0])) return 1;
return 0;
}
思路:直接排序即可。
代碼:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e5+9;
struct node
{
int x,y;
}edge[maxn];
double dis(node a,node b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
double mul(node a,node b,node c)
{
return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
bool cmp(node a,node b)
{
int f=mul(a,b,edge[0]);
if(f>0||f==0&&dis(a,edge[0])<dis(b,edge[0])) return 1;
return 0;
}
int main()
{
int len=0;
while(~scanf("%d%d",&edge[len].x,&edge[len].y))len++;
sort(edge,edge+len,cmp);
for(int i=0;i<len;i++)
printf("(%d,%d)\n",edge[i].x,edge[i].y);
return 0;
}