JS判斷點(diǎn)是否在線(xiàn)段上的代碼
說(shuō)明
點(diǎn)積可以用來(lái)判斷兩個(gè)向量的夾角,如果這個(gè)夾角是0或者180度,說(shuō)明這個(gè)點(diǎn)在直線(xiàn)上;叉積可以用來(lái)判斷一個(gè)點(diǎn)到一條直線(xiàn)的距離,如果這個(gè)距離是0,說(shuō)明這個(gè)點(diǎn)在直線(xiàn)上。
假設(shè)有a、b、c三點(diǎn),其中a和b是線(xiàn)段的兩個(gè)端點(diǎn),c是要判斷的點(diǎn):
- 計(jì)算向量ab和ac的點(diǎn)積,記為dot。
- 如果dot小于0,說(shuō)明c在ab的垂直平分線(xiàn)上;
- 如果dot等于ab的模長(zhǎng)的平方,說(shuō)明c在ab的延長(zhǎng)線(xiàn)上;
- 如果dot在0和ab的模長(zhǎng)的平方之間,說(shuō)明c在ab的方向上,可能在ab線(xiàn)段上;
- 如果dot小于0或者大于ab的模長(zhǎng)的平方,說(shuō)明c不在ab的直線(xiàn)上,也不在ab線(xiàn)段上。
- 計(jì)算向量ab和ac的叉積,記為cross。
- 如果cross不等于0,說(shuō)明c不在ab的直線(xiàn)上,也不在ab線(xiàn)段上;
- 如果cross等于0,說(shuō)明c在ab的直線(xiàn)上。
- 當(dāng)判斷出c在ab的直線(xiàn)上時(shí),還需要判斷c的x坐標(biāo)或者y坐標(biāo)是否在a和b的x坐標(biāo)或者y坐標(biāo)之間,才能確定c是否在ab的線(xiàn)段上。
綜合上面兩個(gè)條件,叉積和點(diǎn)積都可以用來(lái)判斷一個(gè)點(diǎn)是否在一條直線(xiàn)上,但是叉積更簡(jiǎn)單一些,因?yàn)樗枰臈l件更少。
JS代碼
/** * 判斷點(diǎn)c是否在ab組成的線(xiàn)段上 * @param {x,y} a 點(diǎn) * @param {x,y} b 點(diǎn) * @param {x,y} c 點(diǎn) * @returns boolean */ function isPointOnLineSegment(a, b, c) { // 計(jì)算向量ab和ac的叉積 let crossProduct = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x); // 如果不等于0,說(shuō)明不共線(xiàn),直接返回false if (crossProduct !== 0) { return false; } // 否則,檢查c點(diǎn)是否在ab線(xiàn)段的范圍內(nèi) return ( Math.min(a.x, b.x) <= c.x && c.x <= Math.max(a.x, b.x) && Math.min(a.y, b.y) <= c.y && c.y <= Math.max(a.y, b.y) ); } // 測(cè)試 const a = {x:0,y:0} const b = {x:0,y:1} const c = {x:0,y:2} const d = {x:1,y:1} const e = {x:1,y:2} const f = {x:2,y:2} console.log(isPointOnLineSegment(a, c, b)); // true console.log(isPointOnLineSegment(a, f, d)); // true console.log(isPointOnLineSegment(c, f, e)); // true console.log(isPointOnLineSegment(a, b, c)); // false console.log(isPointOnLineSegment(a, f, c)); // false console.log(isPointOnLineSegment(a, c, f)); // false
到此這篇關(guān)于JS判斷點(diǎn)是否在線(xiàn)段上的文章就介紹到這了,更多相關(guān)JS判斷點(diǎn)是否在線(xiàn)段上內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將json當(dāng)數(shù)據(jù)庫(kù)一樣操作的javascript lib
使用javascript操作JSON的類(lèi)庫(kù)TAFFY DB,具體介紹了:查詢(xún)數(shù)據(jù)、添加數(shù)據(jù)、刪除數(shù)據(jù)、修改數(shù)據(jù)。2013-10-10詳解webpack 多頁(yè)面/入口支持&公共組件單獨(dú)打包
這篇文章主要介紹了詳解webpack 多頁(yè)面/入口支持&公共組件單獨(dú)打包,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06JavaScript 浮動(dòng)定位提示效果實(shí)現(xiàn)代碼
本來(lái)想做一個(gè)集合浮動(dòng)定位和鼠標(biāo)跟隨的tooltips效果,但發(fā)現(xiàn)定位和鼠標(biāo)跟隨在一些關(guān)鍵的地方還是不同的,還是分開(kāi)來(lái)吧。2009-09-09uniapp實(shí)現(xiàn)上拉加載更多功能的全過(guò)程
我們?cè)陧?xiàng)目中經(jīng)常使用到上拉加載更多,下面這篇文章主要給大家介紹了關(guān)于uniapp實(shí)現(xiàn)上拉加載更多功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10javascript事件函數(shù)中獲得事件源的兩種不錯(cuò)方法
許多情況我們需要獲得事件源對(duì)象來(lái)對(duì)其屬性進(jìn)行更改,在事件響應(yīng)函數(shù)中獲得事件源的方法有如下兩種2014-03-03