计算几何 之 判断两直线是否相交并求两直线交点 代码模板与证明

判断两直线是否相交 并 求两直线交点

首先判断两直线的向量 v ⃗ \vec v v w ⃗ \vec w w 叉积是否为0,若为0说明两向量作为邻边构成的平行四边形面积为0,说明两向量平行或重合,则两直线无交点。

否则就相交,然后根据下面的函数模板求交点。

代码模板

double cross(Point a,Point b)
{
 return a.x * b.y - b.x * a.y;
}

Point intersection(Point p,Vector v,Point q,Vector w)
{
	Vector u = p - q;
	double t = cross(w,u) / cross(v,w);
	return {p.first+t*v.first , p.second+t*v.second};	//p + t*v
}

判断方法与证明

直线用点向式表示,即 p = p 0 + t v ⃗ p = p_0 + t \vec v p=p0+tv ,p0是直线上的一定点,v是直线的一个向量,我们的每一个t都对应直线上的一个点。在计算几何中,直线最常用的就是点向式表示法。

那么我们问题就是如何求出这个t,从而求出交点呢?我们知道cross是求两向量叉积的,叉积的几何意义就是以这两个向量为邻边的三角形的面积的两倍。因为 a ⃗ × b ⃗ = ∣ a ⃗ ∣ ⋅ ∣ b ⃗ ∣ ⋅ s i n θ \vec a \times \vec b = |\vec a| \cdot |\vec b| \cdot sin\theta a ×b =a b sinθ
s
如何我们来看这个求交点的求法,如下图:
eg

如图,将 v ⃗ \vec v v 平移到同起点q处,有 u ⃗ = p − q \vec u = p-q u =pq,直线交点是F,然后cross(w,u)就是三角形PQB面积的两倍,cross(v,w)是三角形ABQ面积的两倍,然后他们的比值 t就是两三角形面积的比值,并且两三角形同底,共同BQ底边,所以这个比值就是两高之比 h 1 h_1 h1 h 2 h_2 h2

然后再看三角形FPC和三角形QAD,他们有一组内错角相等,还有一直角相等,所以两三角形相似,因此两三角形的高之比就是两斜边之比,即PD比AQ也是t,因此那段距离PD和 v ⃗ \vec v v 的比就是t,所以p加上 t v ⃗ t \vec v tv 就是交点F。

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值