hdu 2948単純計算幾何学的判断点は三角形矩形の円形内にある
に言及
本質はタイトルのような計算ジオメトリです.2人でダーツゲームをして、いくつかの形のターゲットを提供しました.ダーツは試合ごとに3回ずつ投げます(Bob先手、Hannah後手)ダーツの得点は、1ダーツが何個のターゲットにあるかを示し、最後に勝者の名前を出力し、引き分けてTiedを出力する.まず、sがターゲットを表す個数を与え、その後、s行がターゲットを表す.Cは円形ターゲットを表し、円心座標と半径長を与える.Rは矩形ターゲットを表し、対角頂点の座標x 1問題解
直接シミュレーション判定点は円形内:点と円心の距離<=半径判定点は矩形内:点座標は対角頂点の間にある.すなわち(x 1<=x<=x 2,y 1<=y<=y 2)判断点が三角形内:点と三角形の各辺からなる三角形の面積=原三角形の面積
計算ジオメトリを習い始めたばかりで、コード変数関数の名前が少し長いので、許してください.
本質はタイトルのような計算ジオメトリです.2人でダーツゲームをして、いくつかの形のターゲットを提供しました.ダーツは試合ごとに3回ずつ投げます(Bob先手、Hannah後手)ダーツの得点は、1ダーツが何個のターゲットにあるかを示し、最後に勝者の名前を出力し、引き分けてTiedを出力する.まず、sがターゲットを表す個数を与え、その後、s行がターゲットを表す.Cは円形ターゲットを表し、円心座標と半径長を与える.Rは矩形ターゲットを表し、対角頂点の座標x 1
直接シミュレーション判定点は円形内:点と円心の距離<=半径判定点は矩形内:点座標は対角頂点の間にある.すなわち(x 1<=x<=x 2,y 1<=y<=y 2)判断点が三角形内:点と三角形の各辺からなる三角形の面積=原三角形の面積
計算ジオメトリを習い始めたばかりで、コード変数関数の名前が少し長いので、許してください.
#include
using namespace std;
typedef long long ll;
const double eps = 1e-6;
const double PI = acos(-1);
const int maxn = 1e3+5;
struct Point{
double x,y;
Point(double x=0,double y=0):x(x),y(y){}
// +
Point operator +(const Point &b)const
{
return Point(x+b.x,y+b.y);
}
// -
Point operator -(const Point &b)const
{
return Point(x-b.x,y-b.y);
}
//
double operator *(const Point &b)const
{
return x*b.x + y*b.y;
}
//
//P^Q>0,P Q ;<0,P Q ;=0,P,Q ,
double operator ^(const Point &b)const
{
return x*b.y - b.x*y;
}
};
typedef Point Vector;
struct Triangle{
Point A,B,C;
}triangle[maxn];
struct Circle{
Point O;
double R;
}circle[maxn];
struct rectangle{
Point A,B;
}rectangle[maxn];
// , double eps
int dcmp(double x)
{
if(fabs(x)return 0;
else
return x<0?-1:1;
}
// P ABC
bool InTriangle(Point A,Point B,Point C,Point P)
{
double Sabc = fabs((B-A)^(C-A));
double Spab = fabs((A-P)^(B-P));
double Spac = fabs((A-P)^(C-P));
double Spbc = fabs((B-P)^(C-P));
return dcmp(Sabc-Spab-Spac-Spbc)==0;
}
// P O R
bool InCircle(Point O,double R,Point P)
{
double pr = sqrt(pow(P.x-O.x,2)+pow(P.y-O.y,2));
return dcmp(pr-R)<=0;
}
// P A,B
bool InRectangle(Point A,Point B,Point P)
{
return (dcmp(P.x-A.x)>=0&&dcmp(P.y-A.y)>=0&&dcmp(P.x-B.x)<=0&&dcmp(P.y-B.y)<=0);
}
int main()
{
int t,triangle_num=0,circle_num=0,rectangle_num=0;
char str[5];
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
switch(str[0])
{
case 'C':
scanf("%lf %lf %lf",&circle[circle_num].O.x,&circle[circle_num].O.y,&circle[circle_num].R);
circle_num++;
break;
case 'R':
scanf("%lf %lf %lf %lf",&rectangle[rectangle_num].A.x,&rectangle[rectangle_num].A.y,&rectangle[rectangle_num].B.x,&rectangle[rectangle_num].B.y);
rectangle_num++;
break;
case 'T':
scanf("%lf %lf %lf %lf %lf %lf",&triangle[triangle_num].A.x,&triangle[triangle_num].A.y,&triangle[triangle_num].B.x,&triangle[triangle_num].B.y,&triangle[triangle_num].C.x,&triangle[triangle_num].C.y);
triangle_num++;
break;
}
}
scanf("%d",&t);
while(t--)
{
int ans1=0,ans2=0;
Point tmp;
for(int i=1;i<=3;i++)
{
scanf("%lf %lf",&tmp.x,&tmp.y);
for(int j=0;jif(InTriangle(triangle[j].A,triangle[j].B,triangle[j].C,tmp)) ans1++;
for(int j=0;jif(InRectangle(rectangle[j].A,rectangle[j].B,tmp)) ans1++;
for(int j=0;jif(InCircle(circle[j].O,circle[j].R,tmp)) ans1++;
}
for(int i=1;i<=3;i++)
{
scanf("%lf %lf",&tmp.x,&tmp.y);
for(int j=0;jif(InTriangle(triangle[j].A,triangle[j].B,triangle[j].C,tmp)) ans2++;
for(int j=0;jif(InRectangle(rectangle[j].A,rectangle[j].B,tmp)) ans2++;
for(int j=0;jif(InCircle(circle[j].O,circle[j].R,tmp)) ans2++;
}
if(ans1==ans2) printf("Tied
");
else printf("%s
",ans1"Hannah" : "Bob");
}
return 0;
}