5

作業中のアプリに問題があります。かなり複雑な 2 つの CGPath があり、両方を CGMutablePath に追加するとします (つまり、それらを結合します)。さて、2 つのパスが交差する場所では、互いの内側にポイントが存在します。これらの内側の点を取り除き、本質的にパスの外側または輪郭を描きたいと思います。私はこれについてどうするかを理解するのに苦労しています。

編集:これは私が話していることの例です。青と赤のボックスは、CGPath に沿ったポイントを表します。赤いボックスは、両方のパス内にあるポイントです。どうにかして赤い点を消し、パスの輪郭だけを描き直したいと思います。

ここに画像の説明を入力

4

4 に答える 4

3

あなたが説明しているのは、パスの内部の結合です。

パスに曲線が含まれている場合、これは難しい問題です。

ただし、あなたの例は直線セグメントのみを示しているため、直線セグメントのみを含むパスのみを気にすると仮定します。

その場合、ポリゴン ユニオン関数が必要です。この種のアルゴリズムは、「計算幾何学」として知られる分野ではかなり基本的なものです。ポリゴン ユニオンの Objective-C 固有の実装については知りません。純粋な C ライブラリを見つけることができるかもしれませんが、C++ ライブラリを見つける方がはるかに簡単です。.mファイル拡張子を からに変更すると、C++ を使用できます.mm。多角形の結合を計算できる C++ ライブラリを次に示します。

CGPathApplyいずれの場合も、パスの頂点を別の形式でまだ持っていない場合は、を使用してパスの頂点を抽出する必要があることに注意してください。

于 2013-07-25T03:23:29.667 に答える
1

多角形問題の古典的なポイント。他の多角形を参照する 1 を返す各多角形のすべてのポイントを削除します。

int pnpoly(int npol, float *xp, float *yp, float x, float y)
{
  int i, j, c = 0;
  for (i = 0, j = npol-1; i < npol; j = i++) {
    if ((((yp[i] <= y) && (y < yp[j])) ||
         ((yp[j] <= y) && (y < yp[i]))) &&
        (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
      c = !c;
  }
  return c;
}

削除されたポイントで 2 つのパスを結合します。

手順全体の疑似コード:

define starPoly with 10 points
define simplePoly with 7 points

for each point in starPoly
    if ( pnpoly( 7, simplePoly.Xs[], simplePoly.Ys[], point.x, point.y ) == 0 )
        clipedStarPoly += point;

for each point in simplePoly
    if ( pnpoly( 10, starPoly.Xs[], starPoly.Ys[], point.x, point.y ) == 0 )
        clipedSimplePoly += point;

for each point in clipedStarPoly
    solutionPoly += point;

for each point in clipedSimplePoly
    solutionPoly += point;

solutionPoly += solutionPoly.point[0]

クリップされたポリゴンのエンドポイントをいじる必要がないと思われる場合は、ポイント テストからソリューション ポリゴンを直接構築するだけです。

ポイント イン ポリ テストにレイ トレーシングを使用する場合は、このページを参照してください。

于 2012-06-04T23:53:22.647 に答える
1

CGPathAddPathを使用します。とても使いやすいです。

于 2013-07-25T03:00:02.737 に答える
0

2 組のポイントを単純に結合するだけでは十分ではありません。結合されたポリゴンを決定するには、次の手順を実行する必要があります。申し訳ありませんが、疑似コードしかありません。この問題を調べ始めたばかりです。

2 つのポリゴンを A と B と見なします。どちらがどちらであるかは問題ではありません。

  • 多角形 A の周りを移動して、多角形 B の内側にない点を探します。
  • この点をポリゴンに追加します。
  • ポリゴンの周りを続け、各ポイントを順番にテストして追加します。
  • 多角形 B の内側にある点を見つけたら、その点と前の点の間の線を見てください。
  • 多角形 B のどの線がこの線と交差するかを調べます。
  • これらの 2 つの線の交点を決定し、それを多角形に追加します。
  • ポリゴン B に属する交差線を定義する 2 つのポイントのうち、ポリゴン A の内側にないポイントを特定し、それを新しいポリゴンに追加します。
  • 次のポイントが交線の反対側のポイントにならないように、ポリゴン B のどの方向に進む必要があるかを決定し、追加します。
  • ポリゴン A の代わりにポリゴン B を使用することを除いて、3 から繰り返します
  • 必要に応じてポリゴンを切り替えながら、開始点に到達するまで続行します。

このソリューションは、直線のポリゴンに対してのみ許容されることに注意してください。ベジェ パスが関係する場合、滑らかな角と鋭い角、または曲線と直線セグメントを組み合わせる複雑さは言うまでもなく、交点を計算することは非常に困難になります。

于 2013-12-08T09:24:32.410 に答える