1

解決する必要があるかなり複雑なジオメトリの問題があり、誰かがそれを解決するためのリソースを教えてくれるかどうか疑問に思っていました.

縦と横のライクからなる不規則な形をしています。これは、パスを形成するために時計回りに進む一連の x、y ポイントによって記述されます。最後の点が最初の点と結合して、形状の境界を形成します。どの線も互いに交差することはありません。画面に図形を描いているときは、Y 軸に沿って古典的なスキャンライン アルゴリズムを使用して、図形を一連の四角形に変換し、それを塗りつぶします。

しかし今、ユーザーが境界上のある点から境界上の別の点まで、水平線または垂直線を使用してパスを再度描画することにより、形状を 2 つの部分にスライスできるようにしたいと考えています。ダイアグラムでは、ユーザーは 1 から描画し、スライスが行われる時点で 2 になります。

そこで、カットしなければならない種類の例をいくつか示します。元の形状は、ユーザーが描いた赤で示したカット パスを使用してパーツ A とパーツ B にカットされます。ユーザーが私の領域と同じ時計回りの方向にカットするという保証はないことに注意してください (つまり、以下の 1 と 2 が逆になる可能性があります)。

パス付きのシェイプの例

線は境界形状内に完全に含まれ、交差しません。つまり、パスでシェイプをカットすると、正確に 2 つの新しいシェイプが作成されます。

声に出して考えてみると、これの疑似コードはおそらく次のようになると思います。

  1. 0 から N までの番号が付けられた一連の x、y ポイントとして形状を記述します。N は 0 に結合して形状を閉じます。
  2. ユーザーがシェイプのパスのどこかで開始および終了するカット パスを描画できるようにします。UI は、ユーザーが独自の線をまたいだり、図形の外側に描画したりすることを防ぎます。
  3. カット パスが開始および終了するシェイプのライン インデックスを計算します。ライン インデックスは、ポイント インデックス 0->1、1->2、... N-1->N、N->0 で記述されます。
  4. ユーザーの切断パスが確実に形状と同じ方向に走るようにするには、次の場合にパスを逆にします: a) 形状の終了ライン インデックス < 開始形状のライン インデックス b) または形状の終了ライン インデックス == 形状の開始ライン インデックスであるが、終了カット ポイントがライン インデックスに近い場合出発地点
  5. ポイントの 2 つのリストを作成します。a) ライン >= 終了インデックスおよび <= 開始インデックス + カット パス、カット ポイントで開始/終了ラインをトリミング b) カット パス + ライン >= 開始および <= 終了インデックス、カット ポイントで開始/終了ラインをトリミング
  6. ポイント リストから新しいエリアを作成します。

これはおそらくうまくいくと思いますが、これをすでに実行している実際のコードがあれば、明らかに簡単です!

4

1 に答える 1

1

私はすでに仕事をしているコードを知りません。

実際には、2 つの新しいシェイプの 1 つでカット パスを反転する必要があり、もう 1 つは反転しない必要があります。(すべての形状が時計回りにトラバースされていることについてあなたが言ったことが正しい場合。) 各形状でそのパスをどのように取りたいかを確認する最も簡単な方法は次のとおりだと思います: (1) UI インタラクションから、どこにあるかがわかります。カット パスの形状。(2a) カット パスの一方の端から開始し、もう一方の端に到達するまでシェイプを時計回りに歩き、最初の端までカット パスをたどって 1 つのシェイプを作成します。(2b) 元の端から開始し、カット パスを反対方向にたどり、元のカット パスの終点に戻るまでシェイプの周りを時計回りに歩き、別のシェイプを作成します。

それを除けば、あなたの疑似コードは私には問題ないように見えます。

于 2012-05-01T09:05:35.473 に答える