UVa 378 - Intersecting Lines

题目:给你平面上的两条直线,判断两直线关系,平行,重合,相交,如果相交求交点。


公式:p1xp2=x1*y2-x2*y1(外积)

判断q是否在线段p1-p2上面,根据(p1-q)x(p2-q)=0来判断q是否在直线p1-p2上。

两直线平行:(p1-p2)x(q1-q2)=0,为什么?把两条直线的斜率写出来并且令他们相等,这个等式就是这个公式。

p1-p2,q1-q2的交点:

(x,y)=p1+(p2-p1)*((q2-q1)x(q1-p1)/((q2-q1)x(p2-p1)));

推理:把p1-p2直线写成点p1+t(p2-p1),然后就是点和q1-q2直线了,最后计算得出上面的。


#include <iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define EPS 1e-10
struct point
{
    double a,b;
    point(){}
    point(double a,double b):a(a),b(b){}
    point operator +(point p)
    {
        return point(p.a+a,p.b+b);
    }
    point operator -(point p)
    {
        return point(a-p.a,b-p.b);
    }
    point operator *(double p)
    {
        return point(a*p,b*p);
    }
    double dot(point p)//内积
    {
        return (p.a*a+p.b*b);
    }
    double det(point p)//外积
    {
        return (a*p.b-b*p.a);
    }
};
//判断q是否在直线p1-p2上
bool on_str(point p1,point p2,point q)
{
    return (p1-q).det(p2-q)==0;//&&(p1-q).dot(p2-q)<=0;
}
//求两直线交点
point intersection(point p1,point p2,point q1,point q2)
{
    return p1+(p2-p1)*((q2-q1).det(q1-p1)/(q2-q1).det(p2-p1));
}
point p1,p2,q1,q2;
int main()
{
    int n;
    scanf("%d",&n);
    printf("INTERSECTING LINES OUTPUT\n");
    while(n--)
    {
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p1.a,&p1.b,&p2.a,&p2.b,&q1.a,&q1.b,&q2.a,&q2.b);
         if(abs((p1-p2).det(q1-q2))<EPS)//判断外积是否为0
         {
             if(on_str(p1,p2,q1))
                printf("LINE\n");
             else
             printf("NONE\n");
         }
         else
         {
             point r=intersection(p1,p2,q1,q2);
             printf("POINT %.2f %.2f\n",r.a,r.b);
         }
    }
    printf("END OF OUTPUT\n");
    return 0;
}


你可能感兴趣的:(uva,L,378两线相交)