// 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);
}
}
Friday, June 19, 2015
UVa 10195 - The Knights Of The Round Table
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment