叉积:又称向量积,结果为向量,计算向量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;
}