2012-10-24 31 views
3

我試圖用一組座標的外邊界來建立一個MKPolygon。使用一組座標的外邊界建立一個MKPolygon - 如何分割落在一條線兩側的座標?

從我所知道的,在Xcode(MKPolygon方法將使用所有點來構建多邊形,包括內部點)中沒有實現此功能。

經過一番研究,我發現凸包可以解決這個問題。 在研究了各種算法後,我可以最好地包裹頭腦去實現它的是QuickHull。

這需要外部的拉線,並在兩者之間畫一條線。從那裏開始,將基於該線的點分爲兩個子集,並處理外部拉脫維爾之間的距離,以開始構建三角形並消除內部點,直到您留下外部邊界。

我可以通過查看最小/最大拉特找到外部點,並可以在兩者之間繪製一條線(MKPolyline) - 但是,如何確定點是否落在此MKPolyline的一側或另一側?

後續的問題是是否有一個命中測試來確定點是否落在MKPolygon中。

謝謝!

+0

當你解決這個我敢肯定,這將是對其他開發人員的熱門類。完成後,您應該將其發佈並在此共享鏈接。 – Craig

+0

當我搞清楚我絕對會分享! – user1499007

回答

0

我最終使用了禮物包裝算法的變體。當然不是一件小事。

經與全電碼的格式的麻煩,所以我得只是把我的步驟(可能更好,因爲我有一些清理做!)

我開始MKPointAnnotations陣列

1)我得到了離最遠的最低點。爲了做到這一點,我循環了所有的點,並比較經緯度來獲得最低點。這一點肯定是在凸包,所以將它添加到一個NSMutableArray中,它將存儲我們的凸包點(cvp)

2)獲取最低點左側的所有點並循環遍歷它們,計算角度的cvp到左邊的剩餘點。無論哪個角度最大,都需要添加到陣列中。
ATAN(COS(LAT1)SIN(LAT2)-sin(LAT1)* COS(LAT2)* COS(lon2-lon1),SIN(lon2-lon1)* cos(LAT2))

  • 對於找到每個點,創建一個三角形(通過使用來自新點和距前一點較長的lat)並創建一個多邊形。我用這段代碼對我的多邊形做了一個命中測試: BOOL mapCoordinateIsInPolygon = CGPathContainsPoint(polygonView.path,NULL,polygonViewPoint,NO); 如果命中測試中發現任何東西,從比較陣列(所有這些原始陣列減去船體點的左邊)刪除

  • 一旦你在你的CVP陣列至少有3個點,另建多邊形與數組中的所有cvp,並使用命中測試刪除任何內容。

3)一旦你通過所有的左點的工作,創建仍未消除或添加到船體

4)使用相同的剩餘點的新的比較陣列計算和多邊形測試,以去除點,並添加CVP的發現 最後,你留下了點的,讓您的凸包的列表。

+0

我有一個類似的問題,我利用地圖快照和MKPolygon邊界轉換爲UIBeizierPath路徑和繪製其上的快照的頂部得到周圍。 優勢:我可以緩存這些快照快速重裝,並提供我的目的很好 DisAdv:我失去了地圖的靈活性,需要做大量的緯度/多頭和CGPoint 之間的轉換,我會,如果你曾經很感興趣用地圖發佈你的代碼 –

相關問題