算法系列之九:计算几何与图形学有关的几种常用算法(二)

3.6 用矢量的叉积判断直线段是否有交       

        矢量叉积计算的另一个常用用途是直线段求交。求交算法是计算机图形学的核心算法,也是体现速度和稳定性的重要标志,高效并且稳定的求交算法是任何一个CAD软件都必需要重点关注的。求交包含两层概念,一个是判断是否相交,另一个是求出交点。直线(段)的求交算法相对来说是比较简单的,首先来看看如何判断两直线段是否相交。

        常规的代数计算通常分三步,首先根据线段还原出两条线段所在直线的方程,然后联立方程组求出交点,最后再判断交点是否在线段区间上。常规的代数方法非常繁琐,每次都要解方程组求交点,特别是交点不在线段区间的情况,计算交点就是做无用功。计算几何方法判断直线段是否有交点通常分两个步骤完成,这两个步骤分别是快速排斥试验和跨立试验。假设要判断线段P1P2和线段Q1Q2是否有交点,则:

 

(1)       快速排斥试验

    设以线段 P1P2 为对角线的矩形为R1, 设以线段 Q1Q2 为对角线的矩形为R2,如果R1和R2不相交,则两线段不会有交点;

 

(2)       跨立试验。

如果两线段相交,则两线段必然相互跨立对方,所谓跨立,指的是一条线段的两端点分别位于另一线段所在直线的两边。判断是否跨立,还是要用到矢量叉积的几何意义。以图3为例,若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即:

 

( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0

 

上式可改写成:

 

( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0

 

当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明线段P1P2和Q1Q2共线(但是不一定有交点)。同理判断Q1Q2跨立P1P2的依据是:

 

( Q1 - P1 ) × ( P2 - P1 ) * ( Q2 - P1 ) × ( P2 - P1 ) < 0

 

具体情况如下图所示:

 

图3 直线段跨立试验示意图

 

        根据矢量叉积的几何意义,跨立试验只能证明线段的两端点位于另一个线段所在直线的两边,但是不能保证是在另一直线段的两端,因此,跨立试验只是证明两条线段有交点的必要条件,必需和快速排斥试验一起才能组成直线段相交的充分必要条件。根据以上分析,两条线段有交点的完整判断依据就是:1)以两条线段为对角线的两个矩形有交集;2)两条线段相互跨立。

        判断直线段跨立用计算叉积算法的CrossProduct()函数即可,还需要一个判断两个矩形是否有交的算法。矩形求交也是最简单的求交算法之一,原理就是根据两个矩形的最大、最小坐标判断。图4展示了两个矩形没有交集的各种情况:

 

图4 矩形没有交集的几种情况

 

图5展示了两个矩形有交集的各种情况:

图5 矩形有交集的几种情况

 

从图4和图5可以分析出来两个矩形有交集的几何坐标规律,就是在x坐标方向和y坐标方向分别满足最大值最小值法则,简单解释这个法则就是每个矩形在每个方向上的坐标最大值都要大于另一个矩形在这个坐标方向上的坐标最小值,否则在这个方向上就不能保证一定有位置重叠。由以上分析,判断两个矩形是否相交的算法就可以如下实现:

186 bool IsRectIntersect(const Rect& rc1, const Rect& rc2)

187 {

188     return ( (std::max(rc1.p1.x, rc1.p2.x) >= std::min(rc2.p1.x, rc2.p2.x))

189              && (std::max(rc2.p1.x, rc2.p2.x) >= std::min(rc1.p1.x, rc1.p2.x))

190              && (std::max(rc1.p1.y, rc1.p2.y) >= std::min(rc2.p1.y, rc2.p2.y))

  • 9
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
《周培德 计算几何:算法设计与分析.pdf》是一本介绍计算几何算法的书籍。计算几何计算机科中的一个重要分支,研究的是如何通过计算机来处理和解决几何关的问题。 这本书的作者是周培德,他是计算几何领域的专家,曾经在华盛顿大任教,并发表了大量的计算几何关的研究论文。他的研究成果在术界有很高的影响力。 《周培德 计算几何:算法设计与分析.pdf》主要介绍了计算几何的基本概念和常用算法设计与分析方法。这本书的内容非常全面,涵盖了平面几何,立体几何以及高维几何等多个方面的知识。 这本书首先介绍了计算几何的基本概念,包括点,线,面等几何元素的表示和计算方式。然后,详细讲解了计算几何常用算法,如:点的位置关系判断算法,凸包算法,最近点对算法等。 此外,这本书还介绍了计算几何常用的数据结构,如:平衡树,网格树等,以及它们与算法设计和分析的关系。同时,还介绍了计算几何图形计算机模拟,机器人等领域的应用。 总的来说,《周培德 计算几何:算法设计与分析.pdf》是一本非常重要的计算几何教材,对于想要深入了解和研究计算几何生和专业人士来说是很有价值的参考资料。无论是术研究还是实际应用,这本书都可以提供很多有用的知识和方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吹泡泡的小猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值