UVA 478

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值