如何判断2条线段是否相交(编程实现)?
来源:互联网 发布:长兴人民法院淘宝拍卖 编辑:程序博客网 时间:2024/06/06 19:50
我们在编程中有时可能会碰到一些问题,比如怎么判断2条线段是否相交,最常规的一种思路可能就是解方程,看是否有交点,但这种方法用代码实现感觉稍显复杂,时间复杂度大,且控制条件多,很容易出错,那我们有没有更简单的方法呢?
我们在大约高中的时候应该都学过向量的叉积,2个向量做叉积,比如a向量 叉乘 b向量, 大小为|a||b|*sin(theta), 方向遵循右手定则,用右手4根指头从a向量指向b向量,则右手大拇指的方向即为叉积结果的方向。
由上图,若线段AB和CD相交,连接AC,BC,AD,BD,那么 AC向量叉乘AB向量的结果的方向垂直于纸面(屏幕)向外(设为向量a), AB向量叉乘AD向量的结果的方向垂直于纸面向外(设为向量b), 那么向量a*b结果大于0,设该结果为res1.
如上图,若线段AB和CD相交,连接AC,BC,AD,BD,那么 AC向量叉乘AB向量的结果的方向垂直于纸面(屏幕)向外(设为向量a), AB向量叉乘AD向量的结果的方向垂直于纸面向里(设为向量b), 那么向量a*b结果小于0,设该结果为res2.
那么如果线段AB和CD相交,则res1*res2>0, 若不想交,则res1*res2<0. 那么如何计算叉积呢?
上面这个图是三维的向量,若为二维的向量,就把第3列去掉即可,这其实就是一个简单的求行列式的问题了,就不用多介绍了。
至此,判断2条线段是否相交的思路以及很清晰了。 首先,我们可以简单的用一下边界条件,如果某线段的横(纵)坐标的最小值大于另一条线段的横纵坐标的最大值,或反之,则肯定不相交,如果满足上述条件,则使用上述方法计算叉积,若2个叉积结果大于0,则相交,否则,不想交。这样代码就so easy了,就不用我写出来啦~
阅读全文
1 0
- 如何判断2条线段是否相交(编程实现)?
- zju1648 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交 模板
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断是否两条线段相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- LeedCode Add Two Numbers
- HDU 1698-Just a Hook
- POJ 2154 Color(polya定理+欧拉函数)
- leetcode 334. Increasing Triplet Subsequence 自增序列3个元素
- GYM 100801J Journey to the “The World's Start”【二分+Dp+单调队列】
- 如何判断2条线段是否相交(编程实现)?
- Nginx ngx_http_referer_module模块根据referer屏蔽或禁止访问
- PAT 甲级 1069. The Black Hole of Numbers (20)
- java-工厂模式
- 字段级
- UVA 144 Student Grants
- 《数据结构与算法-Python语言描述》读书笔记(5)第5章栈和队列(关键词:数据结构/算法/Python/栈/队列)
- 排序算法之懒人排序
- Qt学习: QListWidget程序示例