Thinking: This is a simple computing geometry problem. But there are some points we need to pay attention to. Like: For triangles, the points that are input are not necessarily in a clockwise or anti-clockwise order.
AC code:
#include<iostream>
#include<cmath>
#define PI 3.14159265
using namespace std;
struct point{
double x, y;
};
struct figure{
char type;
double critical_value[6];// 0,1,2,3 are used for rectangle, 0,1,2 are used for circle; 0,1,2,3,4,5 are used for triangle
};
figure figures[1000];
int count_figure(0), count_point(0);
inline double calc_angle(point p1, point p2, point p)
{
point vec1, vec2,vec3;
vec1.x = p1.x - p.x;
vec1.y = p1.y - p.y;
vec2.x = p2.x - p.x;
vec2.y = p2.y - p.y;
vec3.x = p2.x - p1.x;
vec3.y = p2.y - p1.y;
double co = (vec1.x*vec2.x + vec1.y*vec2.y) / sqrt((vec1.x*vec1.x + vec1.y*vec1.y)*(vec2.x*vec2.x + vec2.y*vec2.y));
double ans= acos(co);
if (vec1.x*vec3.y - vec3.x*vec1.y < 0)
return -ans;
else return ans;
}
inline bool in_circle(double x, double y, int n)
{
double d_x, d_y;
d_x = x - figures[n].critical_value[0];
d_y = y - figures[n].critical_value[1];
if ((d_x*d_x + d_y*d_y) < figures[n].critical_value[2] * figures[n].critical_value[2])
return true;
else return false;
}
inline bool in_triangle(double x, double y, int n)
{
point p, tri[3];
int count = 0;
p.x = x, p.y = y;
double angle = 0;
//if (n == 9)
// cout << 3;
for (int i = 0; i <= 2; i++)
{
tri[i].x = figures[n].critical_value[2 * i];
tri[i].y = figures[n].critical_value[2 * i+1];
}
for (int i = 0; i <= 1; i++)
{
angle += calc_angle(tri[i], tri[i + 1], p);
}
angle += calc_angle(tri[2], tri[0], p);
double d1 = fabs(angle - 2 * PI);
double d2 = fabs(angle);
if (d1 > d2)
return false;
else return true;
}
inline bool inside(double x,double y,int n)
{
switch (figures[n].type)
{
case 'r':
if (x < figures[n].critical_value[2] && x > figures[n].critical_value[0] && y< figures[n].critical_value[1] && y > figures[n].critical_value[3])
return true;
else return false;
case 'c':
if (in_circle(x, y, n))
return true;
else return false;
case 't':
if (in_triangle(x, y, n))
return true;
else return false;
default:
break;
}
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
char shape;
double x, y;
while (scanf("%c",&shape))
{
if (shape == '*')
break;
count_figure++;
if (shape == 'r')
{
figures[count_figure].type = 'r';
scanf("%lf%lf%lf%lf", &figures[count_figure].critical_value[0], &figures[count_figure].critical_value[1], &figures[count_figure].critical_value[2], &figures[count_figure].critical_value[3]);
getchar();
}
else if (shape == 'c')
{
figures[count_figure].type = 'c';
scanf("%lf%lf%lf", &figures[count_figure].critical_value[0], &figures[count_figure].critical_value[1], &figures[count_figure].critical_value[2]);
getchar();
}
else if (shape == 't')
{
figures[count_figure].type = 't';
scanf("%lf%lf%lf%lf%lf%lf", &figures[count_figure].critical_value[0], &figures[count_figure].critical_value[1], &figures[count_figure].critical_value[2], &figures[count_figure].critical_value[3], &figures[count_figure].critical_value[4], &figures[count_figure].critical_value[5]);
point vec1, vec2;
vec1.x = figures[count_figure].critical_value[0] - figures[count_figure].critical_value[2];
vec1.y = figures[count_figure].critical_value[1] - figures[count_figure].critical_value[3];
vec2.x = figures[count_figure].critical_value[2] - figures[count_figure].critical_value[4];
vec2.y = figures[count_figure].critical_value[3] - figures[count_figure].critical_value[5];
if (vec2.x*vec1.y - vec2.y*vec1.x > 0)
{
double temp_x, temp_y;
temp_x = figures[count_figure].critical_value[0];
temp_y = figures[count_figure].critical_value[1];
figures[count_figure].critical_value[0] = figures[count_figure].critical_value[2];
figures[count_figure].critical_value[1] = figures[count_figure].critical_value[3];
figures[count_figure].critical_value[2] = temp_x;
figures[count_figure].critical_value[3] = temp_y;
}
getchar();
}
}
while (scanf("%lf%lf", &x, &y))
{
if (x == 9999.9&& y == 9999.9)
break;
count_point++;
bool in = false;
for (int i = 1; i <= count_figure; i++)
{
if (inside(x, y, i))
{
printf("Point %d is contained in figure %d\n", count_point, i);
in = true;
}
}
if (!in)
printf("Point %d is not contained in any figure\n", count_point);
}
return 0;
}