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);}
- POJ 1264 UVA 109 简单的计算几何
- POJ 2624 简单计算几何
- POJ 1675 简单计算几何
- Uva live 4043 Ants( KM+简单的计算几何)
- UVA 11178 - Morley's Theorem 简单的计算几何
- Myacm Triangles hoj,poj,uva 计算几何
- uva 11437 Triangle Fun (简单计算几何)
- POJ 2850 Stacking Cylinders 简单计算几何
- POJ 1106 Transmitters (简单计算几何)
- poj 1113 凸包+简单几何计算
- POJ 1269 Intersecting Lines 简单计算几何
- poj1269 简单的计算几何
- UVa 270 / POJ 1118 Lining Up (计算几何)
- uva 1531 & poj 1518 Problem Bee(几何计算+贪心)
- uva 11178 计算几何
- UVA-11178-计算几何
- UVA-11796-计算几何
- uva 10112 - Myacm Triangles 简单计算几何+枚举
- 漫话网络带宽估计
- String和StringBuffer的区别?
- Erlang聊天程序后端(二)
- socket 编程
- 面向对象的特征有哪些?
- POJ 1264 UVA 109 简单的计算几何
- R语言与机器学习学习笔记(分类算法)(1)K-近邻算法
- JAVA WEB
- java中的匿名内部类
- python学习(基础知识)
- ARM汇编指令的一些总结[转]
- T4模版引擎之生成数据库实体类
- 冒泡和for循环
- MPP,SMP,NUMA概念介绍