题意:给出多个三角形,圆,正方形,问他们覆盖的点的个数。点的横纵坐标都是整数
思路:从-50到100.枚举每一个点。看是否被覆盖:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; const double PI = acos(-1.0); const double INF = 1e20 , EPS = 1E-6; bool zero(double x){ return -EPS<x&&x<EPS; } ///向量 struct cvector{ double x,y; cvector() {} cvector(double x,double y){ this->x=x,this->y=y; } }; cvector operator +(cvector p,cvector q){ return cvector(p.x+q.x,p.y+q.y); } cvector operator -(cvector p,cvector q){ return cvector(p.x-q.x,p.y-q.y); } cvector operator *(double k,cvector p){ return cvector(k*p.x,k*p.y); } double operator *(cvector p,cvector q){ return p.x*q.x+p.y*q.y; } double operator^(cvector p,cvector q){ ///叉积 return p.x*q.y-q.x*p.y; } double length(cvector p){ ///向量的模 return sqrt(p*p); } cvector unit(cvector p){ ///单位化 return 1/length(p)*p; } double project(cvector p,cvector n){ ///p在n上投影(可负) return p*unit(n); } ///点线 struct cpoint{ double x,y; cpoint(){} cpoint(double x,double y){ this->x = x;this->y =y; } }; struct cline{ cpoint a,b; cline(){} cline(cpoint a,cpoint b){ this->a=a;this->b=b; } }; cvector operator -(cpoint a, cpoint b){ ///向量ab return cvector(b.x-a.x, b.y-a.y); } cpoint operator +(cpoint a, cvector p){ ///点a 沿向量p移动 return cpoint(a.x+p.x,a.y+p.y); } double dist(cpoint p, cpoint q){ ///两点间距离 return length(p-q); } double dist(cpoint p, cline l){ ///点与线的距离 return fabs((p-l.a)^(l.b-l.a))/length(l.b-l.a); } bool parallel(cline u,cline v){ ///线线平行或共线 return zero((u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y)); } bool perpendicular(cline u,cline v){ ///线线垂直 return zero((u.b-u.a)^(v.b-v.a)) ; } bool dots_inline(cpoint p1,cpoint p2,cpoint p3){///判三点共线 return zero((p2-p1)^(p3-p1)); } cline parrllel(cpoint p, cline l){ ///过p点 作l平行线 return cline(p, p+(l.b-l.a)); } cpoint rotate(cpoint b, cpoint a,double alpha){ ///a绕b旋转alpha角(弧度) cvector p=b-a; return cpoint(a.x+(p.x*cos(alpha)-p.y*sin(alpha)), a.y+(p.x*sin(alpha)+p.y*cos(alpha))); } cpoint foot(cpoint p, cline l){ ///过p点 作l垂足 return l.a+project(p-l.a,l.b-l.a)*unit(l.b-l.a); } cline vertical(cpoint p, cline l){ ///过p点 作l垂线 return cline(p,p+(rotate(l.b,l.a,PI/2)-l.a)); } cpoint intersection(cline u,cline v){ ///线与线的交点 cpoint ret = u.a; double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x)) /((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x)); ret.x+=(u.b.x-u.a.x)*t; ret.y+=(u.b.y-u.a.y)*t; return ret; } bool dot_onseg(cpoint p,cline ll){ /// 点在线段上 if(!dots_inline(p,ll.a,ll.b)) return false; cvector v1=ll.b-ll.a,v2=p-ll.a; cvector v3=ll.a-ll.b,v4=p-ll.b; if(v1*v2>-EPS&&v3*v4>-EPS) return true; return false; } bool same_side(cpoint p1,cpoint p2,cline l){ ///两点在线段同侧 cvector v0=l.b-l.a; cvector v1=p1-l.a,v2=p2-l.a; return (v1^v0)*(v2^v0)>EPS; } bool opposite_side(cpoint p1,cpoint p2,cline l){ ///两点在线段异侧 cvector v0=l.b-l.a; cvector v1=p1-l.a,v2=p2-l.a; return (v1^v0)*(v2^v0)<-EPS; } bool intersect_in(cline u,cline v){ ///线段相交,包括交点和重合 if(!dots_inline(u.a,u.b,v.a)||!dots_inline(u.a,u.b,v.b)) return !same_side(u.a,u.b,v)&&!same_side(v.a,v.b,u); return dot_onseg(u.a,v)||dot_onseg(u.b,v) ||dot_onseg(v.a,u)||dot_onseg(v.b,u); } bool intersect_ex(cline u,cline v){ ///线段相交,不包括交点和重合 return opposite_side(u.a,u.b,v)&&opposite_side(v.a,v.b,u); } cpoint ptoseg(cpoint p,cline l){ ///点到线段的最近点 cvector pt=l.b-l.a; cvector pa=l.a-p,pb=l.b-p; if((pt^pa)*(pt*pb)>EPS) return dist(p,l.a)<dist(p,l.b)?l.a:l.b; return foot(p,l); } double distptoseg(cpoint p,cline l){ ///点到线段的距离 cvector pt=l.b-l.a; cvector pa=l.a-p,pb=l.b-p; if((pt^pa)*(pt*pb)>EPS) return min(dist(p,l.a),dist(p,l.b)); return dist(p,l); } double length(double k) { if(k<0) return -k; return k; } int n; struct T{ cpoint a[3]; bool in(cpoint t) { // cout<<">> "<<length((a[2]-a[1])^(a[2]-a[0]))<<endl; if(length((a[1]-a[0])^(t-a[0]))+length((a[2]-a[0])^(t-a[0]))+length((a[1]-a[2])^(t-a[2]))-length((a[2]-a[1])^(a[2]-a[0]))>EPS) return false; return true; } }t[59]; struct C{ cpoint a; double len; bool in(cpoint t) { if(length(a-t)-len>EPS) return false; return true; } } c[59]; struct S{ cpoint a; double len; bool in(cpoint t) { if(t.x<a.x||t.x>a.x+len) return false; if(t.y<a.y||t.y>a.y+len) return false; return true; } } s[59]; int ts=0,tt=0,tc=0; bool oor(int x,int y) { cpoint a = cpoint(x,y); for(int i=0;i<tt;i++) if(t[i].in(a)) return true; for(int i=0;i<ts;i++) if(s[i].in(a)) return true; for(int i=0;i<tc;i++) if(c[i].in(a)) return true; return false; } int main() { //freopen("in.txt","r",stdin); int cas; scanf("%d",&cas); int x1,y1,l; char ch[3]; while(cas--) { int n; scanf("%d",&n); ts=0,tt=0,tc=0; for(int i=0;i<n;i++) { scanf("%s",ch); if(ch[0]=='C') { scanf("%d%d%d",&x1,&y1,&l); c[tc].a=cpoint(x1,y1); c[tc].len = l; tc++; } else if(ch[0]=='S') { scanf("%d%d%d",&x1,&y1,&l); s[ts].a=cpoint(x1,y1); s[ts].len = l; ts++; } else if(ch[0]=='T') { for(int j =0;j<3;j++) { scanf("%d%d",&x1,&y1); t[tt].a[j] = cpoint(x1,y1); }tt++; } } int ans=0; for(int i=-50;i<101;i++) for(int j=-50;j<101;j++) { if(oor(i,j)) ans++; } printf("%d\n",ans); } return 0; }