點在多邊形內 一種尋找多邊形視覺中心的新演算法

2021-10-12 20:10:04 字數 1303 閱讀 6449

在乙個多邊形上放置文字標籤或工具提示的最佳位置通常位於其「視覺中心」的某個位置,即多邊形內部的乙個點,周圍有盡可能多的空間。

計算這樣乙個中心首先想到的是多邊形質心。你可以用乙個簡單快速的公式計算多邊形中心,但如果形狀是凹的或有乙個洞,點可以落在形狀外面。

不幸的是,計算不可訪問性的極點既複雜又緩慢。公布的解決方案需要約束delaunay三角化(constrained delaunay triangulation)或計算乙個直線骨架作為預處理步驟——這兩個步驟都是緩慢且容易出錯的。

對於我們的用例,我們不需要乙個精確解——我們願意犧牲一些精度來獲得更快的速度。當我們在地圖上放置標籤時,以毫秒為單位計算比精確計算更重要。我們為這個問題建立了乙個新的啟發式演算法。

然而,以這個想法為靈感,我們設法設計了乙個新的演算法來修復這兩個缺陷。四叉樹的主要概念是遞迴地將二維空間細分為四個象限。這在許多應用程式中都有應用——不僅是空間索引,而且有影象壓縮,甚至是物理模擬,在這些應用程式中,提高特定領域的自適應精度是有益的。

從覆蓋多邊形的幾個大單元開始。

遞迴地將它們細分為4個較小的單元,探索單元中心作為候選,丟棄那些不可能包含比我們已經找到的更好的解決方案的單元。

由於搜尋是徹底的,我們最終會找到乙個保證在全域性最優範圍內的單元。

我們如何知道某單元是否可以被丟棄?讓我們考慮乙個多邊形上的方形單元格:

為了使這個假設對任何單元格都能正確工作,不管它們的中心是否在多邊形內,我們需要使用到多邊形的有符號距離——如果乙個點在多邊形內為正,如果它在多邊形外為負。我們決定試試另一種方法。我們開始管理優先佇列中的單元格,按照單元格的「潛力(potential)」:dist + radius進行排序。通過這種方式,單元格按照其潛力的順序進行處理。差不多使演算法的效能提高了一倍。

我們可以做到的另乙個加速方法是把多邊形質心作為第乙個「最佳猜測」,這樣我們就可以丟棄所有更壞的單元格。這提高了形狀相對規則的多邊形的效能。

關注圖鯨科技mapwhale.com

點在多邊形內的判斷

凸多邊形考慮叉積,因為在凸多邊形中,我們假設圍繞多邊形走一圈,如果點在多邊形內,那麼這個點一直在我們的同一側。按照這個性質,我們順時針或者逆時針處理多邊形上的點,叉積運算,算參考的和多邊形上連續的兩個點,如何叉積的結果符號發生變化,那麼不再多邊形內。double det point p1,point...

多邊形問題( 判斷乙個點在不在多邊形內)

試題一 災區已經非常困難,災民需要帳篷 衣物 食品和血漿。可通往災區的道路到處都是塌方,70 以上的路面損壞,橋梁全部被毀。中國空軍立即啟動應急預案,展開史上最大強度非作戰空運行動,準備向災區空投急需物資。由於餘震不斷,天氣惡劣,怎樣知道空投的物資是否落在某災區的區域內呢?經過空中觀測,某災區為一凸...

判斷點在多邊形內演算法

點和多邊形關係的演算法實現 好了,現在我們已經了解了向量叉積的意義,以及判斷直線段是否有交點的演算法,現在回過頭看看文章開始部分的討論的問題 如何判斷乙個點是否在多邊形內部?根據射線法的描述,其核心是求解從p點發出的射線與多邊形的邊是否有交點。注意,這裡說的是射線,而我們前面討論的都是線段,好像不適...