UVA 478 Points in Figures: Rectangles…(判定点在多边形内)
来源:互联网 发布:mac os x cdr下载 编辑:程序博客网 时间:2024/05/17 03:10
UVA 478 Points in Figures: Rectangles…(判定点在多边形内)
题意:
有n(n<=10)个图形,可能是三角形或矩形或圆.现在给你多个点,然后要你判断每个点分别在哪些图形内? 如果正好在图形边上,不算.
分析:
对于三角形,直接判断指定点与三角形三边的叉积是否同时大于0或同时小与0即可(也可以用点在多边形内的模板判断).
对于矩形,只要给定点的x和y坐标属于(x1,x2)与(y1,y2)这两个开区间即可.
对于圆,只要给定点到圆心的距离小于半径即可说该点在圆内.
程序中对于每个点依次用3种类别的所有图形去匹配该点,因为图形数目很少,所以只要该点在图形i内,那么标记数组的in[i]=true即可.
AC代码:
#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>#include<vector>using namespace std;const int maxn=10+5;const double eps=1e-10;int dcmp(double x){ if(fabs(x)<eps) return 0; return x<0?-1:1;}struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){}};typedef Point Vector;Vector operator-(Point A,Point B){ return Vector(A.x-B.x,A.y-B.y);}double Cross(Vector A,Vector B){ return A.x*B.y-A.y*B.x;}struct Rectangle{ int id; double x1,y1,x2,y2;//注意这里y1表示最小y坐标,y2表示最大y坐标,与输入不同 Rectangle(int id,double x1,double y1,double x2,double y2):id(id),x1(x1),y1(y1),x2(x2),y2(y2){} bool InRectangle(Point p) { return p.x<x2&&p.x>x1&&p.y>y1&&p.y<y2; }};struct Triangle{ int id; Point a1,a2,a3; Triangle(int id,Point a1,Point a2,Point a3):id(id),a1(a1),a2(a2),a3(a3){} bool InTriangle(Point p) { int v1=dcmp(Cross(a1-a2,p-a2)); int v2=dcmp(Cross(a2-a3,p-a3)); int v3=dcmp(Cross(a3-a1,p-a1)); return (v1<0&&v2<0&&v3<0) || (v1>0&&v2>0&&v3>0); }};struct Circle{ int id; double x,y; double r; Circle(int id,double x,double y,double r):id(id),x(x),y(y),r(r){} bool InCircle(Point p) { double dist2= (p.x-x)*(p.x-x)+(p.y-y)*(p.y-y); return dist2<r*r; }};vector<Rectangle> R;//保存所有矩形vector<Triangle> T; //保存所有三角形vector<Circle> C; //保存所有圆int main(){ char type; int n=0; while(scanf(" %c",&type)==1 && type!='*') { if(type=='r') { double x1,y1,x2,y2; scanf("%lf%lf%lf%lf",&x1,&y2,&x2,&y1); R.push_back(Rectangle(++n,x1,y1,x2,y2)); } else if(type=='t') { Point p1,p2,p3; scanf("%lf%lf%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y); T.push_back(Triangle(++n,p1,p2,p3)); } else if(type=='c') { double x,y,r; scanf("%lf%lf%lf",&x,&y,&r); C.push_back(Circle(++n,x,y,r)); } } int num=1; Point p; while(scanf("%lf%lf",&p.x,&p.y)==2) { if(dcmp(p.x-9999.9)==0 && dcmp(p.y-9999.9)==0 ) break; bool in[maxn]; memset(in,0,sizeof(in)); bool flag=false;//flag==true表示该点至少在一个图形内 for(int i=0;i<R.size();++i) if(R[i].InRectangle(p)) in[R[i].id]=flag=true; for(int i=0;i<T.size();++i) if(T[i].InTriangle(p)) in[T[i].id]=flag=true; for(int i=0;i<C.size();++i) if(C[i].InCircle(p)) in[C[i].id]=flag=true; if(!flag) printf("Point %d is not contained in any figure\n",num); else { for(int i=1;i<=n;++i)if(in[i]) printf("Point %d is contained in figure %d\n",num,i); } ++num; } return 0;}
0 0
- UVA 478 Points in Figures: Rectangles…(判定点在多边形内)
- UVA 478 Points in Figures: Rectangles, Circles, and Triangles
- UVa 478 - Points in Figures: Rectangles, Circles, Triangles
- UVa 476 - Points in Figures: Rectangles
- UVa 477 - Points in Figures: Rectangles and Circles
- UVA 11072 - Points(凸包+点在多边形内判定)
- ZOJ 1081 Points Within(点在多边形内判定)
- ZOJ 1081 Points Within(点在多边形内判定)
- 点在多边形内判定
- UVA 634 Polygon(模板题:判定点在多边形内)
- (beginer) 凸包+点在多边形内 UVA 11072 Points
- ZOJ1081 Points Within,判断点是否在多边形 内
- zoj 1081 Points Within[判断点在简单多边形内]
- ZOJ 1081 Points Within 判断点是否在多边形内
- POJ 2318 TOYS(点在多边形内判定)
- HDU 1756 Cupid's Arrow(判定点在多边形内)
- HDU 1756 Cupid's Arrow(点在多边形内判定)
- POJ 2318 TOYS(点在多边形内判定 刘汝佳模板)
- 模版方法设计模式
- vi+ctags阅读源码
- Android开发之裁剪照片
- OC中ARC forbids explicit message send of release错误
- HDU2054 A == B?
- UVA 478 Points in Figures: Rectangles…(判定点在多边形内)
- Authentic Louis Vuitton Outlet mxfUm
- Louis Vuitton Outlet Bags npA1A
- CCNP路由实验之十六 策略路由(PBR)
- Discount Louis Vuitton Online 2Whyf
- Discount Louis Vuitton Outlet gBCkM
- 自定义异常
- Swift自动引用计数 - 解决内存泄露
- OCUnit and GHUnit