题意:给出多个三角形,圆,正方形,问他们覆盖的点的个数。点的横纵坐标都是整数
思路:从-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;
}