两条直线的位置判断
给你两条直线,判断这两条直线是否共线,相交,不相交(即平行),相交的话输出交点。
判断平行,然后通过叉积判断是否共线。
平行判断可以判断两条直线的斜率是否相等。
交点的话,相当于联立方程组求解了。
这些方程看模板理解的,刚才搜了下,有人讲得比较清楚,借鉴下http://blog.csdn.net/dreamvyps/archive/2011/01/25/6162690.aspx
如何判断是否同线?由叉积的原理知道如果p1,p2,p3共线的话那么(p2-p1)X(p3-p1)=0。因此如果p1,p2,p3共线,p1,p2,p4共线,那么两条直线共线。direction()求叉积,叉积为0说明共线。
如何判断是否平行?由向量可以判断出两直线是否平行。如果两直线平行,那么向量p1p2、p3p4也是平等的。即((p1.x-p2.x)*(p3.y-p4.y)-(p1.y-p2.y)*(p3.x-p4.x))==0说明向量平等。
如何求出交点?这里也用到叉积的原理。假设交点为p0(x0,y0)。则有:
(p1-p0)X(p2-p0)=0
(p3-p0)X(p4-p0)=0
展开后即是
(y1-y2)x0+(x2-x1)y0+x1y2-x2y1=0
(y3-y4)x0+(x4-x3)y0+x3y4-x4y3=0
将x0,y0作为变量求解二元一次方程组。
假设有二元一次方程组
a1x+b1y+c1=0;
a2x+b2y+c2=0
那么
x=(c1*b2-c2*b1)/(a2*b1-a1*b2);
y=(a2*c1-a1*c2)/(a1*b2-a2*b1);
因为此处两直线不会平行,所以分母不会为0。
- #include <queue>
- #include <stack>
- #include <math.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <iostream>
- #include <limits.h>
- #include <string.h>
- #include <algorithm>
- using namespace std;
- const double eps = 1e-6;
- struct point{ double x,y; };
- struct line{ point a,b; };
- bool dy(double x,double y) { return x > y + eps;} // x > y
- bool xy(double x,double y) { return x < y - eps;} // x < y
- bool dyd(double x,double y) { return x > y - eps;} // x >= y
- bool xyd(double x,double y) { return x < y + eps;} // x <= y
- bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y
- double crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向
- {
- return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y);
- }
- bool parallel(line u,line v)
- {
- return dd( (u.a.x - u.b.x)*(v.a.y - v.b.y) - (v.a.x - v.b.x)*(u.a.y - u.b.y), 0.0 );
- }
- point intersection(line u,line v)
- {
- point ans = u.a;
- double t = ((u.a.x - v.a.x)*(v.a.y - v.b.y) - (u.a.y - v.a.y)*(v.a.x - v.b.x))/
- ((u.a.x - u.b.x)*(v.a.y - v.b.y) - (u.a.y - u.b.y)*(v.a.x - v.b.x));
- ans.x += (u.b.x - u.a.x)*t;
- ans.y += (u.b.y - u.a.y)*t;
- return ans;
- }
- int main()
- {
- int n;
- line u,v;
- int flag = 0;
- while( ~scanf("%d",&n) )
- {
- printf("INTERSECTING LINES OUTPUT/n");
- while( n-- )
- {
- scanf("%lf %lf %lf %lf",&u.a.x,&u.a.y,&u.b.x,&u.b.y);
- scanf("%lf %lf %lf %lf",&v.a.x,&v.a.y,&v.b.x,&v.b.y);
- if( parallel(u,v) )
- if( dd(crossProduct(u.a,u.b,v.a),0.0) )
- printf("LINE/n");
- else
- printf("NONE/n");
- else
- {
- point ans = intersection(u,v);
- printf("POINT %.2lf %.2lf/n",ans.x,ans.y);
- }
- }
- printf("END OF OUTPUT/n");
- }
- return 0;
- }