凸包

叉积:又称向量积,结果为向量,计算向量a和向量b的叉积,为a与b的模乘上两者夹角的正弦值。
点积:计算向量a和向量b的点积,为a与b的模乘上两者夹角的余弦值。
凸包:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点。
Graham扫描法:
1.Graham扫描的思想是先找到凸包上的一个点,然后从那个点开始按逆时针方向逐个找凸包上的点,实际上就是进行极角排序,然后对其查询使用。
2.将找到的那个点移到坐标原点,然后计算个点与原点的直线与x轴的夹角,对夹角进行排序,第一个和最后一个点肯定在凸包上。
3.把原点和s1放到栈中,把刚刚的结果中s1后面的点作为当前点,连接原点和栈顶的点得到一条直线,判断当前点在直线哪侧,如果在右侧,则栈顶的点不是凸点。
若在左侧或者在直线上则当前点s2是凸点,压入栈中,如果此点不是第二步中最后的点,则把s2后面的点作为当前点,继续进行第二步,如果是的话就结束。
凸包

/*
凸包 最外围的点构成一个圈,把所有的点圈起来 
*/
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
	double x,y;
 };
node p[50050];
struct Node
{
 	int n;
 	node p[50050];
};
Node ps;
int n;
double mul(node s,node a,node b)//计算叉积 
{
	return (a.x-s.x)*(b.y-s.y)-(a.y-s.y)*(b.x-s.x);
}
double dis(node a,node b)//计算距离 
{
	return (b.y-a.y)*(b.y-a.y)+(b.x-a.x)*(b.x-a.x);
}
bool cmp(node a,node b)
{
	return (a.x<b.x)||(a.x==b.x&&a.y<b.y);
}
void so()
{
	sort(p,p+n,cmp);
	ps.p[0]=p[0];
	ps.p[1]=p[1];
	int top=1;
	for(int i=2;i<n;i++)
	{
		while(top>0&&mul(ps.p[top-1],ps.p[top],p[i])<=0)
		top--;
		top++;
		ps.p[top]=p[i];//控制<0或<=0可以控制重点 
	}
	int m=top;
	top++;
	ps.p[top]=p[n-2];
	for(int i=n-2;i>=0;i--)
	{
		while(top>m&&mul(ps.p[top-1],ps.p[top],p[i])<=0)
		top--;
		top++;
		ps.p[top]=p[i];
	}
	ps.n=top;
}
int main()
{
	while(cin>>n)
	{
		if(n==0)
		break;
		for(int i=0;i<n;i++)
		scanf("%lf%lf",&p[i].x,&p[i].y);
		so();
		double ans=0;
		for(int i=1;i<ps.n-1;i++)
		ans+=mul(ps.p[0],ps.p[i],ps.p[i+1]);//最后一个点和第一个点之间的距离 
		//cout<<(int)ans/100<<endl;
		printf("%d\n",(int)(ans/100));
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值