Wednesday, June 24, 2015

UVa 10242 - Fourth Point !!

// UVa 10242 - Fourth Point !!

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

struct point {
	double x, y;
};

bool operator !=(point a, point b) {
	return a.x != b.x || a.y != b.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;
}

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

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

void print(line l) {
	printf("%.1f x + %.1f y + %.1f = 0\n", l.a, l.b, l.c);
}

int main() {
	point p1, p2, p3, p4;
	while (cin >> p1.x >> p1.y >> p2.x >> p2.y >> p3.x >> p3.y >> p4.x >> p4.y) {
		line side1 = points_to_line(p1, p2);
		line side2 = points_to_line(p3, p4);
		line side3 = parallel(side1, (p3 != p1 && p3 != p2) ? p3 : p4);
		line side4 = parallel(side2, (p1 != p3 && p1 != p4) ? p1 : p2);
		point sol = intersection(side3, side4);
		printf("%.3f %.3f\n", sol.x, sol.y);
	}
	return 0;
}

No comments:

Post a Comment