多边形上点的顺序排序_一种寻找多边形视觉中心的新算法
生活随笔
收集整理的這篇文章主要介紹了
多边形上点的顺序排序_一种寻找多边形视觉中心的新算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
遇到的問題
在一個多邊形上放置文本標簽或工具提示的最佳位置通常位于其“視覺中心”的某個位置,即多邊形內部的一個點,周圍有盡可能多的空間。
計算這樣一個中心首先想到的是多邊形質心。你可以用一個簡單快速的公式計算多邊形中心,但如果形狀是凹的或有一個洞,點可以落在形狀外面。我們如何定義我們需要的點?一個更可靠的定義是”不可到達的極點”或”最大內接圓”:多邊形中離邊緣最遠的點。不幸的是,計算不可訪問性的極點既復雜又緩慢。公布的解決方案需要約束delaunay三角化(Constrained Delaunay Triangulation)或計算一個直線骨架作為預處理步驟——這兩個步驟都是緩慢且容易出錯的。對于我們的用例,我們不需要一個精確解——我們愿意犧牲一些精度來獲得更快的速度。當我們在地圖上放置標簽時,以毫秒為單位計算比精確計算更重要。我們為這個問題創建了一個新的啟發式算法。現有的解決方案
這項在線任務的唯一近似算法是由加西亞-卡斯特利亞諾斯和倫巴多在2007年的論文中描述的。算法是這樣的:
- 將點置于任意大小的網格上(本文中為24x24,或576個點),在其邊界框內探測多邊形,丟棄多邊形外的所有點。
- 計算每個點到多邊形的距離,選擇距離最長的點。
- 重復上面的步驟,但是在這一點上有一個更小的網格(比任意系數1.414小)。
- 該算法運行多次,直到搜索區域足夠小,達到我們想要的精度。
- 它不能保證找到一個好的解決方案,這取決于機會和外形相對良好的多邊形。
- 在較大的多邊形上運行速度較慢,因為有很多點檢查的過程。對于上圖中的每個藍點,你必須循環遍歷所有多邊形點。
新的解決方案
我們需要設計一種不依賴于任意常數的算法,并且能夠以可靠的增加精度對整個多邊形進行徹底搜索。那么就有一個熟悉的概念可以與這個問題直接相關——四叉樹。
四叉樹的主要概念是遞歸地將二維空間細分為四個象限。這在許多應用程序中都有應用——不僅是空間索引,而且有圖像壓縮,甚至是物理模擬,在這些應用程序中,提高特定領域的自適應精度是有益的。下面我們將介紹如何將四叉樹分區應用于查找不可訪問極點的問題。尋找更快的解決方案
越早發現一個遠離多邊形邊緣的“好的”單元格,我們在運行中丟棄的單元格就越多,搜索速度也就越快。那么我們如何更快地找到好的單元格呢?
我們決定試試另一種方法。我們開始管理優先隊列中的單元格,按照單元格的“潛力(potential)”:dist + radius進行排序。通過這種方式,單元格按照其潛力的順序進行處理。差不多使算法的性能提高了一倍。我們可以做到的另一個加速方法是把多邊形質心作為第一個“最佳猜測”,這樣我們就可以丟棄所有更壞的單元格。這提高了形狀相對規則的多邊形的性能。總結
最終得出來的算法就是Polylabel,這是一個快速而精確的JavaScript模塊,用于查找合適的點,以便在多邊形上放置標簽。它比我們開始時的算法快40倍,同時保證在所有情況下都能得到正確的結果。?
關注圖鯨科技??mapwhale.com總結
以上是生活随笔為你收集整理的多边形上点的顺序排序_一种寻找多边形视觉中心的新算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样在微信建群
- 下一篇: 神经网络中的最小二乘_深度神经网络:噪声