知识大全 谈谈"求线段交点"的几种算法
Posted 线段
篇首语:生活可以五颜六色,但绝不能乱七八糟。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 谈谈"求线段交点"的几种算法相关的知识,希望对你有一定的参考价值。
求线段交点 是一种非常基础的几何计算 在很多游戏中都会被使用到
下面我就现学现卖的把最近才学会的一些 求线段交点 的算法说一说 希望对大家有所帮助
本文讲的内容都很初级 主要是面向和我一样的初学者 所以请各位算法帝们轻拍啊 嘎嘎
引用已知线段 (a b) 和线段 (c d) 其中a b c d为端点 求线段交点p (平行或共线视作不相交)
算法一 求两条线段所在直线的交点 再判断交点是否在两条线段上
求直线交点时 我们可通过直线的一般方程 ax+by+c= 求得(方程中的abc为系数 不是前面提到的端点 另外也可用点斜式方程和斜截式方程 此处暂且不论)
然后根据交点的与线段端点的位置关系来判断交点是否在线段上 公式如下图
【责编:at 】
算法二 判断每一条线段的两个端点是否都在另一条线段的两侧 是则求出两条线段所在直线的交点 否则不相交
第一步判断两个点是否在某条线段的两侧 通常可采用投影法
求出线段的法线向量 然后把点投影到法线上 最后根据投影的位置来判断点和线段的关系 见下图
点a和点b在线段cd法线上的投影如图所示 这时候我们还要做一次线段cd在自己法线上的投影(选择点c或点d中的一个即可)
主要用来做参考
图中点a投影和点b投影在点c投影的两侧 说明线段ab的端点在线段cd的两侧
同理 再判断一次cd是否在线段ab两侧即可
求法线 求投影 什么的听起来很复杂的样子 实际上对于我来说也确实挺复杂 在几个月前我也不会(念书那会儿的几何知识都忘光了 ( ) 不过好在学习和实现起来还不算复杂 皆有公式可循
求线段ab的法线
JavaScript Code复制内容到剪贴板var nx=b y a y ny=a x b x var normalLine = x nx y ny 注意 其中 normalLine x和normalLine y的几何意义表示法线的方向 而不是坐标
求点c在法线上的投影位置
JavaScript Code复制内容到剪贴板var dist= normalLine x*c x + normalLine y*c y
注意 这里的 投影位置 是一个标量 表示的是到法线原点的距离 而不是投影点的坐标
通常知道这个距离就足够了
当我们把图中 点a投影(distA) 点b投影(distB) 点c投影(distC) 都求出来之后 就可以很容易的根据各自的大小判断出相对位置
distA==distB==distC 时 两条线段共线distA==distB!=distC 时 两条线段平行distA 和 distB 在distC 同侧时 两条线段不相交
distA 和 distB 在distC 异侧时 两条线段是否相交需要再判断点c点d与线段ab的关系
前面的那些步骤 只是实现了 判断线段是否相交 当结果为true时 我们还需要进一步求交点
求交点的过程后面再说 先看一下该算法的完整实现
JavaScript Code复制内容到剪贴板function segmentsIntr(a b c d)
//线段ab的法线N var nx = (b y a y) ny = (a x b x)
//线段cd的法线N var nx = (d y c y) ny = (c x d x)
//两条法线做叉乘 如果结果为 说明线段ab和线段cd平行或共线 不相交var denominator = nx *ny ny *nx if (denominator== ) return false
//在法线N 上的投影var distC_N =nx * c x + ny * c y var distA_N =nx * a x + ny * a y distC_N var distB_N =nx * b x + ny * b y distC_N
// 点a投影和点b投影在点c投影同侧 (对点在线段上的情况 本例当作不相交处理) if ( distA_N *distB_N >= ) return false
// //判断点c点d 和线段ab的关系 原理同上// //在法线N 上的投影var distA_N =nx * a x + ny * a y var distC_N =nx * c x + ny * c y distA_N var distD_N =nx * d x + ny * d y distA_N if ( distC_N *distD_N >= ) return false
//计算交点坐标var fraction= distA_N / denominator var dx= fraction * ny dy= fraction * nx return x a x + dx y a y + dy
最后 求交点坐标的部分 所用的方法看起来有点奇怪 有种摸不著头脑的感觉
其实它和算法一 里面的算法是类似的 只是里面的很多计算项已经被提前计算好了
换句话说 算法二里求交点坐标的部分 其实也是用的直线的线性方程组来做的
现在来简单粗略 很不科学的对比一下算法一和算法二 最好情况下 两种算法的复杂度相同 最坏情况 算法一和算法二的计算量差不多 但是算法二提供了 更多的 提前结束条件 所以平均情况下 应该算法二更优
实际测试下来 实际情况也确实如此
【责编:at 】算法三 判断每一条线段的两个端点是否都在另一条线段的两侧 是则求出两条线段所在直线的交点 否则不相交
(咦? 怎么感觉和算法二一样啊? 不要怀疑 确实一样 …… 囧)
所谓算法三 其实只是对算法二的一个改良 改良的地方主要就是 不通过法线投影来判断点和线段的位置关系 而是通过点和线段构成的三角形面积来判断
先来复习下三角形面积公式 已知三角形三点a(x y) b(x y) c(x y) 三角形面积为
JavaScript Code复制内容到剪贴板var triArea=( (a x c x) * (b y c y) (a y c y) * (b x c x) ) /
因为 两向量叉乘==两向量构成的平行四边形(以两向量为邻边)的面积 所以上面的公式也不难理解
而且由于向量是有方向的 所以面积也是有方向的 通常我们以逆时针为正 顺时针为负数
改良算法关键点就是 如果 线段ab和点c构成的三角形面积 与 线段ab和点d构成的三角形面积 构成的三角形面积的正负符号相异 那么点c和点d位于线段ab两侧 如下图所示
【责编:at 】 cha138/Article/program/Java/Javascript/201311/25424相关参考
(1)前期高点;(2)上方均线,时间越长的均线阻力越大;(3)筹码密集区(成交密集平台...现货黄金阻力位的几种算法一、现货黄金阻力位的几种主要判断方法1.最简单的是看前期图形的高点和低点。现货黄金阻
导致牛皮癣的几种患病因素?目前牛皮癣的已经成为了第一大顽固疾病,已经引起社会及医学的广泛关注及重视。专家称牛皮癣的治疗因素中给每个人的情况都是不一样的,但是大概都是那么几个,今天我们就来谈谈导致牛皮癣
导致牛皮癣的几种患病因素?目前牛皮癣的已经成为了第一大顽固疾病,已经引起社会及医学的广泛关注及重视。专家称牛皮癣的治疗因素中给每个人的情况都是不一样的,但是大概都是那么几个,今天我们就来谈谈导致牛皮癣
部分农机手在使用农机时,由于不懂得保养技术或平时养成的一些不良操作习惯,导致农机在使用中受损,从而减少农机的使用寿命。一、机油累计添加:许多机手在更换机油时,不是全部更换而是向曲轴箱补充新机油,使机油
部分农机手在使用农机时,由于不懂得保养技术或平时养成的一些不良操作习惯,导致农机在使用中受损,从而减少农机的使用寿命。一、机油累计添加:许多机手在更换机油时,不是全部更换而是向曲轴箱补充新机油,使机油
Java单多线程求pair值算法比较 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 进程和线程的
知识大全 急求关于下边2个话题的文章 谈谈你对职业发展课程的认识 谈谈职业规划课程对你个人职业发展规划有什么启示
急求关于下边2个话题的文章谈谈你对职业发展课程的认识谈谈职业规划课程对你个人职业发展规划有什么启示下面具体的规划职业生涯应考虑的因素和步骤。1、确定志向。志向是事业成功的基本前提,没有志向,事业的成功
一道求单向链表倒数第N个结点的算法题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
代位求偿原则为确保代位求偿原则的顺利执行,中国《海商法》就代位求偿过程中可能出现的几种情况作了如下规定:①有时由于某种情势的需要,被保险人主动放弃了对第三人的一些权利,从而造成保险人在一些权利上无法代
易误诊为体癣的几种皮肤病?许多皮肤病会出现和体癣相类似症状,这样会造成疾病误诊。那哪些皮肤病易误诊为体癣呢?易误诊为体癣的几种皮肤病?易误诊为体癣的几种皮肤病?体癣在临床上呈圆形或多环形斑疹,伴有痒感