// 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