Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 13481 | Accepted: 5997 |
Description
Your program will repeatedly read in four points that define two lines in the x-y plane and determine how and where the lines intersect. All numbers required by this problem will be reasonable, say between -1000 and 1000.
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
计算几何真的不容易AC。。。模板代码。。函数名自己用百度翻译起的。。
#include <iostream> #include <cstdio> #include <string.h> #include <math.h> #include <algorithm> using namespace std; const double eps = 1e-8; const int N = 105; struct Point { double x,y; } ; struct Line{ Point a,b; }; ///叉积 double mult(Point a, Point b, Point c) { return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y); } ///计算两条直线的交点 Point intersection(Point a,Point b,Point c,Point d){ Point p = a; double t = ((a.x-c.x)*(c.y-d.y)-(a.y-c.y)*(c.x-d.x))/((a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x)); p.x +=(b.x-a.x)*t; p.y +=(b.y-a.y)*t; return p; } double parallel(Point a,Point b,Point c,Point d){ ///判断平行 return fabs((a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x)); } int main() { int tcase; scanf("%d",&tcase); printf("INTERSECTING LINES OUTPUT\n"); while(tcase--){ Line l1,l2; scanf("%lf%lf%lf%lf",&l1.a.x,&l1.a.y,&l1.b.x,&l1.b.y); scanf("%lf%lf%lf%lf",&l2.a.x,&l2.a.y,&l2.b.x,&l2.b.y); if(parallel(l1.a,l1.b,l2.a,l2.b)<eps){ ///两直线平行 if(fabs(mult(l1.b,l2.a,l1.a))<eps){ ///判断共线 printf("LINE\n"); } else printf("NONE\n"); } else{ Point p = intersection(l1.a,l1.b,l2.a,l2.b); printf("POINT %.2lf %.2lf\n",p.x,p.y); } } printf("END OF OUTPUT\n"); return 0; }