POJ 1264 UVA 109 简单的计算几何

来源:互联网 发布:apache日志文件在哪 编辑:程序博客网 时间:2024/06/05 22:38

简单的计算几何题目  

1:求点集的凸包   2:判断导弹是否在凸包中    3:累计被导弹攻击中的凸包面积 

注意别重复判断    POJ G++提交的时候不能用%lf   用%f输出

#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define eps 1e-8using namespace std;int T = 0;struct Point{    int  x,y;    Point (int x = 0,int y = 0):x(x),y(y){}};struct King{    Point e[105],c[105];    int ok,l;}K[25];typedef Point Vector;Vector operator -(Vector A,Vector B){    return Vector(A.x-B.x,A.y-B.y);}int Cross(Vector A, Vector B){    return A.x*B.y -A.y*B.x;}int Dot(Vector A, Vector B)//点积{    return A.x*B.x+A.y*B.y;}int cmp(Point a,Point b){    if(a.x<b.x)return 1;    else if(a.x == b.x && a.y < b.y)return 1;    return 0;}int ConvexHull(Point *s,int n,Point *ch){    sort(s,s+n,cmp);    int m = 0;    for(int i = 0; i < n; i++)    {        while(m >1 && Cross(ch[m-1]-ch[m-2],s[i]-ch[m-2])<= 0)m--;        ch[m++] = s[i];    }    int k = m;    for(int i = n-2; i >=0; i--)    {        while(m > k && Cross(ch[m-1]-ch[m-2],s[i]-ch[m-2]) <= 0)m--;        ch[m++] = s[i];    }    if(n>1)m--;    return m;}double ConvexPolygonArea(Point *p, int n)//图多边形的面积{    int area = 0;    for(int i = 1 ; i < n-1; i++)        area += Cross(p[i] - p[0], p[i+1] - p[0]);    return area*1.0 / 2.0;}bool OnSegment(Point p, Point a1, Point a2)//有一个点在线段上(不包含端点){    return Cross(a1 - p, a2 - p) == 0 && Dot(a1 - p, a2 - p) < 0;}int isPointPolygon(Point p,Point *poly,int n){    int wn = 0;    for(int i = 0; i < n; i++)    {        if(OnSegment(p,poly[i],poly[(i+1)%n]))return -1;//在边界上        int k = Cross(poly[(i+1)%n] - poly[i],p-poly[i]);        int d1 = poly[i].y-p.y;        int d2 = poly[(i+1)%n].y - p.y;        if(k > 0 && d1 <= 0 && d2 > 0) wn++;        if(k < 0 && d2 <= 0 && d1 > 0) wn--;    }    if(wn != 0)return 1;//内部    return 0;//外部}void init()//初始化读入{    int l;    while(scanf("%d",&l))    {        if(l == -1)break;        K[T].l = l;        K[T].ok = 0;//标记刚开始都没被打中        for(int i = 0; i < l; i++)            scanf("%d%d",&K[T].e[i],&K[T].e[i].y);        K[T].l = ConvexHull(K[T].e,K[T].l,K[T].c);//凸包的点的个数        T++;    }}int main(){    #ifdef LOCAL    freopen("in.txt","r",stdin);    #endif // LOCAL    init();    struct Point m;    while(scanf("%d%d",&m.x,&m.y)!=EOF)    {        for(int i = 0; i < T; i++)        {            if(K[i].ok)continue;//ok为真则已经被导弹打中            if(isPointPolygon(m,K[i].c,K[i].l))//判断是否被打中            {                K[i].ok = 1;                break;            }        }    }    double area = 0;    for(int i = 0; i < T; i++)    {        if(K[i].ok == 0)continue;        area += ConvexPolygonArea(K[i].c,K[i].l);    }    printf("%.2lf\n",area);}