http://poj.org/problem?id=1269
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 13425 | Accepted: 5977 |
Description
Input
Output
Sample Input
5 0 0 4 4 0 4 4 0 5 0 7 6 1 0 2 3 5 0 7 6 3 -6 4 -3 2 0 2 27 1 5 18 5 0 3 4 0 1 2 2 5
Sample Output
INTERSECTING LINES OUTPUT POINT 2.00 2.00 NONE LINE POINT 2.00 5.00 POINT 1.07 2.20 END OF OUTPUT
①共线
②平行
③相交,输出交点坐标
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> using namespace std; #define N 5110 #define INF 0x3f3f3f3f #define MOD #define EPS 1e-8 #define met(a, b) memset(a, b, sizeof(a)) typedef long long LL; using namespace std; struct point { double x, y; }; struct Line { point a, b; }p1, p2; point ans; void Intersection (Line Q1, Line Q2)///计算两直线交点 { ans = Q1.a; double t = ((Q1.a.x-Q2.a.x) * (Q2.a.y-Q2.b.y) - (Q1.a.y-Q2.a.y) * (Q2.a.x-Q2.b.x)) /((Q1.a.x-Q1.b.x) * (Q2.a.y-Q2.b.y) - (Q1.a.y-Q1.b.y) * (Q2.a.x-Q2.b.x)); ans.x += (Q1.b.x - Q1.a.x) * t; ans.y += (Q1.b.y - Q1.a.y) * t; } int Solve (Line Q1, Line Q2) { if (fabs (Q1.a.x - Q1.b.x) < EPS && fabs (Q2.a.x - Q2.b.x) < EPS ///斜率不存在 && fabs(Q1.a.x-Q2.a.x)>EPS) return 0;///平行(竖直线) else if (fabs (Q1.a.x - Q1.b.x) < EPS && fabs (Q2.a.x - Q2.b.x) < EPS///斜率不存在 && fabs(Q1.a.x-Q2.a.x)<EPS) return 1;///共线(竖直线) double k1 = (Q1.a.y-Q1.b.y)/(Q1.a.x - Q1.b.x);///直线1的斜率 double k2 = (Q2.a.y-Q2.b.y)/(Q2.a.x - Q2.b.x);///直线2的斜率 double b1 = Q1.a.y - k1 * Q1.a.x; if (fabs(Q2.a.y - (Q2.a.x * k1 + b1)) < EPS) return 1;///两条直线共线 if (fabs (k1-k2) < EPS) return 0;///平行(竖直线) Intersection (Q1, Q2);///相交 return 2; } int main () { int n; while (scanf ("%d", &n) != EOF) { puts ("INTERSECTING LINES OUTPUT"); while (n--) { scanf ("%lf%lf%lf%lf", &p1.a.x, &p1.a.y, &p1.b.x, &p1.b.y); scanf ("%lf%lf%lf%lf", &p2.a.x, &p2.a.y, &p2.b.x, &p2.b.y); int flag = Solve (p1, p2); if (!flag) puts ("NONE"); if (flag == 1) puts ("LINE"); if (flag == 2) printf ("POINT %.2f %.2f\n", ans.x, ans.y); } puts ("END OF OUTPUT"); } return 0; }