http://poj.org/problem?id=1269
两条直线,平行输出NONE,共线输出LINE,相交输出交点坐标
p0为交点,求交点坐标的方法是(p1-p0)X(p2-p0)=0 && (p3-p0)X(p4-p0)=0(其中X代表向量叉乘),联立两个方程可求解
求得解分母为0时,判断一条直线中的一个点是否在另一条直线上(用上面叉乘的方法),如果是就共线,反之平行
View Code
#include <iostream> #include <stdio.h> using namespace std ; struct point{ int x,y ; } ; int main() { int n ; while(~scanf("%d",&n)) { puts("INTERSECTING LINES OUTPUT") ; point p1,p2,p3,p4 ; for(int i=0;i<n;i++) { scanf("%d%d%d%d%d%d%d%d",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y,&p4.x,&p4.y) ; if((((p3.y-p4.y)*(p2.x-p1.x)-(p1.y-p2.y)*(p4.x-p3.x))==0 || ((p1.y-p2.y)*(p4.x-p3.x)-(p3.y-p4.y)*(p2.x-p1.x))==0) && ((p3.y-p4.y)*p1.x+(p4.x-p3.x)*p1.y+p3.x*p4.y-p4.x*p3.y==0)) { puts("LINE") ; continue ; } if(((p3.y-p4.y)*(p2.x-p1.x)-(p1.y-p2.y)*(p4.x-p3.x))==0 || ((p1.y-p2.y)*(p4.x-p3.x)-(p3.y-p4.y)*(p2.x-p1.x))==0) { puts("NONE") ; continue ; } double x0=((p1.x*p2.y-p2.x*p1.y)*(p4.x-p3.x)-(p3.x*p4.y-p4.x*p3.y)*(p2.x-p1.x))*1.0/((p3.y-p4.y)*(p2.x-p1.x)-(p1.y-p2.y)*(p4.x-p3.x)) ; double y0=((p3.y-p4.y)*(p1.x*p2.y-p2.x*p1.y)-(p1.y-p2.y)*(p3.x*p4.y-p4.x*p3.y))*1.0/((p1.y-p2.y)*(p4.x-p3.x)-(p3.y-p4.y)*(p2.x-p1.x)) ; printf("POINT %.2lf %.2lf\n",x0,y0) ; } puts("END OF OUTPUT") ; } return 0 ; }