计算机图形学中点分割算法法 (线段与矩形关系的判断 向量)

这篇博客探讨了线段与矩形的三种关系,包括线段完全在矩形内、部分在矩形内以及完全在矩形外。重点介绍了如何使用中点分割法和向量方法判断线段是否与矩形相交,并求出交点。通过判断向量的跨立关系和向量积,可以确定线段与矩形的相交情况,甚至在不相交时找出交点坐标。
摘要由CSDN通过智能技术生成

线段与矩形的关系我理解的是三种:

1、线段完全在矩形内
2、线段完全在矩形外
3、线段有一部分在矩形内
点与矩形的关系比线段与矩形的关系更容易判断,所以以下都是通过端点的情况去判断线段与矩形的关系的。具体也是分为三种:
1、线段两端点都在矩形内
2、线段一个端点在矩形内一个在矩形外
3、线段两个端点都在矩形外

1、线段两端点都在矩形内:

  很容易得出这种情况下,线段是完全在矩形内部的。具体关系可以根据线段端点与矩形四个顶点的来判断,我就不细说了。

2、线段一个端点在矩形内一个在矩形外

  这种情况,线段有一部分在矩形内部,端点判断与情况1一样,也很容易得出。
  这里额外说一下这种情况下求线段与矩形的交点,可以用中点分割法:思路就是二分。贴一下图更容易懂。
  中点分割
  过程:当中点在矩形内部时,内部端点移向中点;当中点在矩形外部时,外部端点移向中点,直到中点与内部端点相等或者中点与外部端点相等。

3、线段两个端点都在矩形外

  这个是分析的重点,因为两个端点都在矩形外,线段与矩形的关系不止一种情况。可能线段完全在矩形外,可能线段有一部分在矩形内部。

  这时候需要通过线段是否与矩形的对角线是否相交,来区分这两种情况。如果与对角线没有交点,则线段完全在矩形外部,反之有一部分在矩形内部。
  这时候问题就转化成了求两条线段是否相交。因为两条线段的端点都是知道的,最容易想到的就是通过求解直线方程,通过有无交点来判断两线段是否相交。
  但是这里我给大家详细解说一下如何用向量方法去判断两线段是否相交,并且求交点。

向量方法判断两线段是否相交,并求出交点

  如果两向量相交,则两向量肯定相互跨立。向量的跨立是什么意思呢?
向量跨立
  如图有向量(p1-p2)和向量(Q2-Q1),如果跨立,则点Q1,点Q2在肯定在直线P1P2的两侧,意思就是向量(Q2-P1),(Q1-P1)在向量(P2-P1)的两侧。由向量的向量积(不懂可以看 向量的点乘与叉乘的几何意义)可以判断向量(Q2-P1),(Q1-P1)是不是在向量(P2-P1)的两侧(^代表叉乘):若d1 = (P2-P1)^(Q2-P1) * (P2-P1)^(Q1-P1) < 0代表异侧,否则>0代表同侧。
  同理,还要判断一次向量(P1-Q1),(P2-Q1)是不是在向量(Q2-Q1)两侧
向量跨立
即若d2 = (Q2-Q1)^(P2-Q1) * (Q2-Q1)^(P1-Q1) < 0代表异侧,否则>0代表同侧。
当d1 < 0 && d2 < 0,两线段相交,否则不相交。
上述过程也称为跨立实验,如果觉得我说得不好,大家可以网上百度下。
当然我们还要考虑两条线段重合的情况,也就是d1 == 0,d2 == 0的情况,这两种也代表了线段有一部分在矩形内部。
所以综上所述,当d1 <= 0 && d2 <= 0时,线段部分在矩形内,否则完全在矩形外。
到这里已经把线段与矩形的关系完全判断出来了。
  这里额外说一下,第三种情况下(两端点都在矩形外部)确定线段与矩形对角线有交点后如何不通过求直线方程来获得交点。已知线段两端点(p1x,p1y),(p2x,p2y),对角线两端点(q1x,q1y),(q2x,q2y),设交点为(x,y),则存在t,s,使
x = p1x + t * (p2x - p1x); —1
y = p1y + t * (p2y - p1y); —2
x = q1x + s * (q2x - q1x); —3
y = q1y + s * (q2y - q1y); —4
由1,3得
t * (p2x-p1x) - s * (q2x - q1x) = q1x - p1x; —5
由2,4得
t * (p2y-p1y) - s * (q2y - q1y) = q1y - p1y; —6
联立5,6得
t = [(q1x-p1x)(q2y-q1y)-(q1y-p1y)(q2x-q1x)] / [(p2x-p1x)(q2y-q1y)-(p2y-p1y)(q2x-q1x)]
可以观察得出分母就是向量(P2-P1)与向量(Q2-Q1)的向量积的模。t和s求一个就好了。之后根据
x = p1x + t * (p2x - p1x); —1
y = p1y + t * (p2y - p1y); —2
来求得交点坐标。找到交点之后,可以把点段当做两条,根据折半查找来确定线段与矩形的两个交点。

代码

以下是从裁剪框裁剪线的程序中截出来的部分,有些变量不懂耶不用管。对算法是实现

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值