摘要:原文鏈接前些日的一個小需求用戶在后臺劃不規(guī)則區(qū)域,區(qū)域之間不能重疊,如圖判斷分兩步判斷多變形是否有相交線段,無則進行第二步判斷公式判斷多變形之間是否存在頂點與多邊形的包含關(guān)系代碼如下點線面線段是否相交判斷兩多
原文鏈接: Fyerl"s Blog
前些日的一個小需求:
用戶在后臺劃不規(guī)則區(qū)域,區(qū)域之間不能重疊,如圖
判斷分兩步:
1、判斷多變形是否有相交線段,無則進行第二步判斷(公式)
2、判斷多變形之間是否存在頂點與多邊形的包含關(guān)系(BMapLib.GeoUtils.isPointInPolygon)
代碼如下:
/** * 點: { lat: xxx, lng: xxx } * 線: [{ lat: xxx, lng: xxx }, { lat: xxx, lng: xxx }] * 面: [{ lat: xxx, lng: xxx }, { lat: xxx, lng: xxx }, { lat: xxx, lng: xxx }...] * */ const { BMap, BMapLib } = window; /** * 線段是否相交 * seg: [{ lat: xxx, lng: xxx }, { lat: xxx, lng: xxx }] * */ function isSegmentsIntersectant(segA, segB) { const abc = (segA[0].lat - segB[0].lat) * (segA[1].lng - segB[0].lng) - (segA[0].lng - segB[0].lng) * (segA[1].lat - segB[0].lat); const abd = (segA[0].lat - segB[1].lat) * (segA[1].lng - segB[1].lng) - (segA[0].lng - segB[1].lng) * (segA[1].lat - segB[1].lat); if (abc * abd >= 0) { return false; } const cda = (segB[0].lat - segA[0].lat) * (segB[1].lng - segA[0].lng) - (segB[0].lng - segA[0].lng) * (segB[1].lat - segA[0].lat); const cdb = cda + abc - abd; return !(cda * cdb >= 0); } /** * 判斷兩多邊形邊界是否相交 */ function isPolygonsIntersectant(plyA, plyB) { for (let i = 0, il = plyA.length; i < il; i++) { for (let j = 0, jl = plyB.length; j < jl; j++) { const segA = [plyA[i], plyA[i === il - 1 ? 0 : i + 1]]; const segB = [plyB[j], plyB[j === jl - 1 ? 0 : j + 1]]; if (isSegmentsIntersectant(segA, segB)) { return true; } } } return false; } /** * 判斷兩多變形是否存在點與區(qū)域的包含關(guān)系(A的點在B的區(qū)域內(nèi)或B的點在A的區(qū)域內(nèi)) */ function isPointInPolygonBidirectional(plyA, plyB) { const [pA, pB] = [[], []]; plyA.forEach((item) => { pA.push(new BMap.Point(item.lng, item.lat)); }); plyB.forEach((item) => { pB.push(new BMap.Point(item.lng, item.lat)); }); let [a, b] = [false, false]; a = pA.some(item => BMapLib.GeoUtils.isPointInPolygon(item, new BMap.Polygon(pB))); if (!a) { b = pB.some(item => BMapLib.GeoUtils.isPointInPolygon(item, new BMap.Polygon(pA))); } return a || b; } /** * 判斷多邊形是否重疊 * */ export function isPolygonsOverlap(plyA, plyB) { return isPolygonsIntersectant(plyA, plyB) || isPointInPolygonBidirectional(plyA, plyB); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92712.html
摘要:一前言在使用百度地圖開發(fā)的過程中,查閱百度地圖官網(wǎng)基本上就能滿足開發(fā)的需求,但是有時候需要設(shè)置一些東西,很難在官網(wǎng)上查閱到相關(guān)的方法技巧。希望百度地圖能夠越來越強大,這樣開發(fā)者就可以愉快的開發(fā)了 一 前言 在使用百度地圖開發(fā)的過程中,查閱百度地圖官網(wǎng)demo基本上就能滿足開發(fā)的需求,但是有時候需要設(shè)置一些東西,很難在官網(wǎng)上查閱到相關(guān)的方法技巧。筆者特意把開發(fā)過程中遇到的一些疑難雜癥和解...
摘要:原文來自前端時間遇到個問題,就是判斷百度地圖里的多個任意多邊形區(qū)域是否重復,在網(wǎng)上看了很多的文章都沒有找到解決方案,功夫不負有心人,在網(wǎng)上找到個可以判斷是否重復的,但是在包含的情況下就不能判斷,后來自己加入根據(jù)點判斷點是否在多邊形內(nèi)來判斷重 原文來自 taoeer.top 前端時間遇到個問題,就是判斷百度地圖里的多個任意多邊形區(qū)域是否重復,在網(wǎng)上看了很多的文章都沒有找到解決方案,功夫不...
摘要:原文來自前端時間遇到個問題,就是判斷百度地圖里的多個任意多邊形區(qū)域是否重復,在網(wǎng)上看了很多的文章都沒有找到解決方案,功夫不負有心人,在網(wǎng)上找到個可以判斷是否重復的,但是在包含的情況下就不能判斷,后來自己加入根據(jù)點判斷點是否在多邊形內(nèi)來判斷重 原文來自 taoeer.top 前端時間遇到個問題,就是判斷百度地圖里的多個任意多邊形區(qū)域是否重復,在網(wǎng)上看了很多的文章都沒有找到解決方案,功夫不...
摘要:最近,物體識別已經(jīng)成為計算機視覺和最令人激動的領(lǐng)域之一。故事開始于年贏得了大規(guī)模視覺識別挑戰(zhàn)賽。感受野特征的輸入?yún)^(qū)輸入圖像區(qū)會影響特征的激活。的架構(gòu)決定了感受野是如何隨著層數(shù)的改變而改變的。這些被推出區(qū)域被裁剪并扭曲到固定大小的圖像。 最近,物體識別已經(jīng)成為計算機視覺和 AI 最令人激動的領(lǐng)域之一。即時地識別出場景中所有的物體的能力似乎已經(jīng)不再是秘密。隨著卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)的發(fā)展,以及大型訓練...
閱讀 2651·2021-11-19 09:56
閱讀 921·2021-09-24 10:25
閱讀 1707·2021-09-09 09:34
閱讀 2245·2021-09-09 09:33
閱讀 1082·2019-08-30 15:54
閱讀 595·2019-08-29 18:33
閱讀 1297·2019-08-29 17:19
閱讀 533·2019-08-29 14:19