2011-09-04 91 views
3

今天我們在MKMapView上繪製多邊形。我們使用下面的僞碼來繪製多邊形。在地圖上繪圖時減少多邊形

CGContextMoveToPoint 
CGContextAddLineToPoint 
CGContextAddLineToPoint 
CGContextAddLineToPoint 
CGContextClosePath 
CGContextFillPath 

結果可能是這樣的:

data table

我們得到的一行數據的時間,顏色會基於我們在我們收到的數據的單元格。有沒有一種方法或多邊形縮減算法將所有相同的彩色多邊形組合在一起(假設它們相交)以給我一個大的多邊形?所以在這個例子中,所有的紅色都會有一個大的多邊形。

+1

你見過[HazardMap](http://developer.apple.com/library/ios/#samplecode/HazardMap/Introduction/Intro.html)示例應用程序,它做了類似的事情(雖然不是「多邊形縮減」 )?另外,如果所有路徑都是rects,使用CGContextFillRect代替當前代碼可能會更快。 – Anna

+0

我看了HazardMap。上面的例子是誤導性的,它們不是完美的Rects,所以我需要使用上面的代碼。我們的縮放級別爲18的應用程序可能會渲染數百萬個多邊形,如果我們單獨執行每個多邊形的話,我們需要減少該數量才能使其執行一半的體面。 –

回答

0

CoreGraphics可以原生處理凹多邊形,因此問題的主要部分是填充填充區域以填充填充區域的邊界。

即時考慮,一個樸素的算法可能是將邊緣標誌與每個單元相關聯。如果邊緣是多邊形外部的一部分,則設置邊緣標誌。標誌由在該邊緣相遇的兩個單元共享。

選取任意單元格並設置所有四個邊緣標誌。重置所有其他單元格上的邊緣標誌。然後寫一個遞歸方法,對於每個單元格:

  • 依次測試是否設置每個邊緣標誌;
  • 如果設置了標誌,則檢查共享該邊的單元格是否具有相同的顏色;
  • 如果是,則反轉該單元格的邊緣標誌並向其遞歸。

反轉與「連接到任何您已知的旁邊的單元格,將尚未查看的單元格旁邊的任何邊緣設置爲尚未成爲邊界的一部分」相同。

遞歸可能會獲得數百個項目的深度,因此值得保留一個單元列表來考慮並添加到列表中而不是遞歸,就像實現一樣。不管你訪問細胞的順序如何,結果應該是一樣的。

一旦您用完了要訪問的單元格,您可以通過在任何標記的邊緣周圍漫遊來重建整個邊界。唯一輕微的複雜性是當你進入細胞的對角會議時,如黃色和綠色細胞在你的第四和第五列之間接觸的地方。您需要應用從當前邊緣移動到下一個邏輯,該邏輯共享正確顏色的頂點和單元格。

0

這是矩形繪圖功能的作業,而不是路徑繪圖功能。請參閱CGContextFillRect(), CGContextStrokeRect()CGContextFillRects()。他們會更快。

+0

在我的問題下面看到我的評論。我無法繪製和填充指令,它們並不是完美的指令,特別是在轉彎時。 –