3

今日は、MKMapViewでポリゴンを描画しています。次の擬似コードを使用してポリゴンを描画します。

CGContextMoveToPoint
CGContextAddLineToPoint
CGContextAddLineToPoint
CGContextAddLineToPoint
CGContextClosePath
CGContextFillPath

結果は次のようになる可能性があります。

データ表

一度に1行ずつデータを取得し、受信したデータに基づいてセルに色が付けられます。すべての同じ色のポリゴンをグループ化して(交差していると仮定して)1つの大きなポリゴンを作成する方法またはポリゴン削減アルゴリズムはありますか?したがって、この例では、すべての赤が1つの大きなポリゴンになります。

4

2 に答える 2

0

これはパス描画機能ではなく、矩形描画機能の仕事です。CGContextFillRect(), CGContextStrokeRect()およびを参照してくださいCGContextFillRects()。彼らははるかに高速になります。

于 2011-09-05T03:05:48.037 に答える
0

CoreGraphics は凹型ポリゴンをネイティブに処理できるため、問題の主な部分は、塗りつぶされた領域の境界を見つけるための塗りつぶしです。

即席に考えると、単純なアルゴリズムは、エッジ フラグを各セルに関連付けることである可能性があります。そのエッジがポリゴンの外部の一部である場合、エッジ フラグが設定されます。フラグは、その端で交わる 2 つのセルによって共有されます。

任意のセルを選択し、4 つのエッジ フラグすべてを設定します。他のすべてのセルのエッジ フラグをリセットします。次に、セルごとに次の再帰的メソッドを記述します。

  • 各エッジ フラグが設定されているかどうかを順番にテストします。
  • フラグが設定されている場合は、そのエッジを共有するセルが同じ色かどうかを確認します。
  • そうである場合、そのセルのエッジ フラグを反転し、再帰します。

反転は、「隣接していることがわかっているセルに接続し、まだ見ていないセルに隣接するエッジを境界の一部に設定する」と言っているのと同じです。

再帰は何百もの項目を深くする可能性があるため、実装の問題として、再帰ではなく、考慮すべきセルのリストを保持してそのリストに追加する価値があるかもしれません。セルにアクセスする順序は重要ではないため、結果は同じになります。

訪問するセルがなくなったら、フラグが設定されたエッジから境界全体を歩き回って、境界全体を再構築できます。黄色と緑のセルが 4 番目と 5 番目の列の間で接触する場所のように、セルの対角線上の会合に到達したときに、わずかに複雑になるだけです。現在のエッジから、頂点と正しい色のセルの両方を共有する次のエッジに移動するロジックを適用する必要があります。

于 2011-09-04T20:32:14.850 に答える