poj2007 基础计算几何—极角排序

题意:乱序给出凸多边形的顶点坐标,要求按逆时针顺序输出各顶点。给的第一个点一定是(0,0),没有其他点在坐标轴上,没有三点共线的情况。

首先了解一下什么是极角排序

在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标。那么给定平面上的一些点,把它们按照一个选定的中心点排成顺(逆)时针,就是极角排序。

说的通俗一点,其实你可以这样想象,就是平面上的点和原点连城一条线段,然后用一条在平面上为0度的直线逆时针旋转一直转到360度也就是一圈,这样一个接一个碰到的点就是极角排序的顺序

这题就是裸的极角排序,我觉得题目中的图片就是说明了基本极角排序的做法,图中的slop是斜率,通过斜率就可以将点排序。

这里利用向量叉积进行极角排序

做法就很简单了,将向量(0,0)和原点到每一个点的向量算叉乘,利用叉乘所得的值的正负来作cmp排序就好了。

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct node{
	double x,y;
}point[100];
double cross(const node &a,const node &b,const node &c,const node &d){
	return (d.y-c.y)*(b.x-a.x)-(d.x-c.x)*(b.y-a.y);
}
bool cmp(const node &a,const node &b){
	node o;
	o.x=o.y=0;
	return cross(o,b,o,a)<0;
}
int main(){
	int flag=0;
	while(cin>>point[flag].x>>point[flag].y){
		flag++;
	}
	sort(point+1,point+flag,cmp);
	for(int i=0;i<flag;i++){
		cout<<"("<<point[i].x<<","<<point[i].y<<")"<<endl;    
	}
}

猜你喜欢

转载自blog.csdn.net/samscream/article/details/82086036