计算几何基础

Posted Stump

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算几何基础相关的知识,希望对你有一定的参考价值。

凸包算法

http://poj.org/problem?id=3348

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=5e5+11;
int n,m;
struct point{
	int x,y;
	point(){}
	point(int _x,int _y):
		x(_x),y(_y){}
	friend inline point operator -(const point A,const point B){
		return point(A.x-B.x,A.y-B.y);
	}
	friend inline int operator *(const point A,const point B){
		return A.x*B.y-A.y*B.x;
	}
	inline int norm(){
		return x*x+y*y;
	}
}p[N],q[N];
inline bool operator <(const point A,const point B){
	int det=(A-p[1])*(B-p[1]);	
	if(det!=0)return det>0;
	return (A-p[1]).norm()<(B-p[1]).norm();
}
inline void Graham(){
	int id=1;
	for(register int i=2;i<=n;++i)
		if(p[i].x<p[id].x||p[i].x==p[id].x&&p[i].y<p[id].y)
			swap(p[i],p[id]);
	sort(p+2,p+n+1);
	q[++m]=p[1];
	for(register int i=2;i<=n;++i){
		while(m>=2&&(p[i]-q[m-1])*(q[m]-q[m-1])>=0)--m;
		q[++m]=p[i];
	}
}
inline int Area(){
	int res=0;
	q[m+1]=q[1];
	for(register int i=1;i<=m;++i)
		res+=q[i]*q[i+1];
	return (res>>1);
}
int main(){
	scanf("%d",&n);
	for(register int i=1;i<=n;++i)scanf("%d%d",&p[i].x,&p[i].y);
	Graham();
	printf("%d\n",Area()/50);
	return 0;
}

  

以上是关于计算几何基础的主要内容,如果未能解决你的问题,请参考以下文章

计算几何基础知识--求两个线段的交点

计算几何基础知识--求两个线段的交点

计算几何基础知识--求两个线段的交点

计算几何基础知识--求两个线段的交点

计算几何及其应用——计算几何基础

kuangbin专题计算几何基础(极角相关)