求两条直线的交点

 大致思路是利用向量求交点的坐标

向量\underset{OX}{\rightarrow}就是交点坐标

\underset{OX}{\rightarrow}\underset{OA}{\rightarrow} +\underset{AB}{\rightarrow}*\frac{ax}{ab}

\frac{ax}{ab}就= \frac{\Delta acd }{\Delta acd +\Delta bcd } 

最后化简其实有更简单点的,这种一是好理解好计算,二是分母不容易为0

下面是代码实现,前面尽量用上判断平行再求交点

#define dou double
const dou EXP=1e-6;
struct P{
    double x,y;
    P(double x=0,double y=0):x(x),y(y){}
};
struct L{
    P a,b;
    L(){}
    L(P a,P b):a(a),b(b){}
};
double area(P a,P b,P c){                //求面积
    return fabs((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y))/2;
}
P find(L x,L y)
{
    dou k=area(x.a,y.a,y.b)/(area(x.b,y.a,y.b)+area(x.a,y.a,y.b));
    return P(x.a.x+(x.b.x-x.a.x)*k,x.a.y+(x.b.y-x.a.y)*k);
}
					
bool par(L a,L b){                  //判断两线相平行(重合或平行)
    return fabs((a.b.x-a.a.x)*(b.b.y-b.a.y)-(b.b.x-b.a.x)*(a.b.y-a.a.y))<EXP;
}

main()

        if(par(x,y)){           //两线平行
            if(area(y.a,x.a,x.b)>EXP) 1;        //平行
            else 2;         //重合
        }
        else{
            P res=find(x,y);        //求交点
        }

if(par())是判断两条直线平行与否

如果平行(重合),那么不再求交点左边

反之,res接受结果

猜你喜欢

转载自blog.csdn.net/m0_58177653/article/details/123582254