Friday, June 19, 2015

UVa 10195 - The Knights Of The Round Table

// UVa 10195 - The Knights Of The Round Table

#include <iostream>
#include <cmath>
#include <stdio.h>
using namespace std;

struct point {
	double x, y;
};

struct line {
	double a, b, c;
};

line points_to_line(point p, point q) {
	line l;
	l.a = p.y - q.y;
	l.b = q.x - p.x;
	l.c = -l.a * p.x - l.b * p.y;
	return l;
}

point middle(point p, point q) {
	point m = { (p.x + q.x) / 2, (p.y + q.y) / 2 };
	return m;
}

line perpendicular(line l, point p) {
	line per;
	per.a = -l.b;
	per.b = l.a;
	per.c = -per.a * p.x - per.b * p.y;
	return per;
}

point intersection(line l1, line l2) {
	point p;
	p.y = (l2.c * l1.a - l1.c * l2.a) / (l1.b * l2.a - l2.b * l1.a);
	p.x = (l2.c * l1.b - l1.c * l2.b) / (l1.a * l2.b - l2.a * l1.b);
	return p;
}

double dist(point p, point q) {
	return sqrt((p.x - q.x) * (p.x - q.x) + (p.y - q.y) * (p.y - q.y));
}

double dist(point p, line l) {
	line per = perpendicular(l, p);
	point inter = intersection(l, per);
	return dist(p, inter);
}

point point_in_direction(point p, point q, double r) {
	double dx = q.x - p.x;
	double dy = q.y - p.y;
	double rat = r / dist(p, q);
	point m = { p.x + rat * dx, p.y + rat * dy };
	return m;
}

line bisectrix(point p1, point p2, point p3) {
	point q1 = point_in_direction(p1, p2, 5);
	point q2 = point_in_direction(p1, p3, 5);
	return points_to_line(p1, middle(q1, q2));
}

int main() {
	double a, b, c;
	while (cin >> a >> b >> c) {
		point p1 = { 0, 0 };
		point p2 = { a, 0 };
		double x = (b * b + a * a - c * c) / (2 * a);
		double y = sqrt(b * b - x * x);
		point p3 = { x, y };

		line b1 = bisectrix(p1, p2, p3);
		line b2 = bisectrix(p2, p3, p1);

		point center = intersection(b1, b2);
		line side = points_to_line(p1, p2);
		double sol = dist(center, side);
		if (sol != sol)
			sol = 0;
		printf("The radius of the round table is: %.3f\n", sol);
	}
}

No comments:

Post a Comment