多边形的面积计算:
double PolygonArea(Point* p, int n)
{
double area=0;
for (int i=1; i<n-1; i++)
area+=Cross(p[i]-p[0],p[i+1]-p[0]);
return area/2;
}
点在多边形内判定:
bool isPointOnSegment(Point P, Point A, Point B) { return OnSegment(P,A,B); }
int isPointInPolygon(Point p, Point* poly, int n)//仍不是很理解,希望有大神详细解释下~
{
int wn=0;
for (int i=0; i<n; i++)
{
if (isPointOnSegment(p,poly[i],poly[(i+1)%n])) return -1;
int k=dcmp(Cross(poly[(i+1)%n]-poly[i],p-poly[i]));
int d1=dcmp(poly[i].y-p.y),d2=dcmp(poly[(i+1)%n].y-p.y);
if (k>0 && d1<=0 && d2>0) wn++;
if (k<0 && d1<=0 && d2>0) wn--;
if (wn!=0) return 1;
return 0;
}
}
凸包:
//Anderew算法
//输入点数组为p,个数为n,输出点数组ch。返回值为凸包定点数。
int ConvexHull(Point* p, int n, Point* ch)
{
int m=0;
sort(p,p+n);//数组已去重,x为第一关键字
for (int i=0; i<n; i++)
{
while (m>1 && dcmp(Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<=0) m--;
ch[m++]=p[i];
}
int k=m;
for (int i=n-2; i>=0; i--)
{
while (m>k && dcmp(Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<=0) m--;
ch[m++]=p[i];
}
if (n>1) m--;
return m;
}