大致思路是利用向量求交点的坐标
向量
就是交点坐标
而
=
+
*
就=
最后化简其实有更简单点的,这种一是好理解好计算,二是分母不容易为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接受结果
版权声明:本文为m0_58177653原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。