2

アプリケーションの 4 点画像変換に取り組んでいます。ユーザーは、各コーナーをドラッグして有効な四角形を作成するか、その「バウンディング ボックス」を使用して垂直方向、水平方向、および比例的にサイズを変更します。

これまでのところ、画像変換部分が機能しています。しかし、私はそれに制限を課すのに苦労しています...

  1. 頂点は互いに交差しません。つまり、ユーザーが砂時計の形を作成することを許可していません。常に四角形でなければなりません。
  2. 同様に、各コーナー間の角度は 0 より大きくする必要があります。そうしないと、頂点が直線になります。
  3. この画像には最小サイズがあります。つまり、各コーナーは、互いに、およびそれらの反対側の線から一定の距離離れている必要があります。
  4. ユーザーは、画像を裏側に「反転」することはできません。4 つのコーナー (p1、p2、p3、および p4) は、時計回りの順序で表示される必要があります。
  5. 凹型の凧の形と三角形が有効です。

これらの問題に関する公式または論文があるかどうか疑問に思っていました。私は現在、2 つの線分が交差するかどうか (およびどこで交差するか) を見つけるための式と、線上の別の点に最も近い点を見つけるための式を持っています。私の実装のほとんどは、私が好きなようにユーザーフレンドリーではありませんでした.

PS このプロジェクトでは、DirectX を使用して C# を使用しています。ただし、アプリケーションは 2D のみです。

4

2 に答える 2

2

私の提案は、制限を課すことではなく、受け入れられない場合は、赤いワイヤフレーム ポリゴンだけを描画することです。

これは多かれ少なかれ、プログラマがフォーム入力フィールドに制限を設けた場合に似ています。たとえば、開始日は終了日よりも前に来る必要があり、終了フィールドの日付より後の日付を開始フィールドに入力することはできません...ユーザーに強制的に最初にタブで終了フィールドに移動し、次に終了日を入力してから、タブで開始フィールドに戻り、正しい開始日を入力します。

フィールドを赤で表示するだけで、はるかに使いやすくなります...そして実際にはコーディングが少なくて済みます。

ユーザーのマウスの動きをトラップすることは、ほとんど賢明な考えではありません。ユーザーが求めているものを適用できない場合は、動きを制限するのではなく、これを明確にしてください...ユーザーが最初の頂点を移動していて、後で別の頂点を変換を有効にする位置に移動したい可能性があります(まさに2 つの日付フィールドの例)。

無効な位置を常に防止する必要があると本当に考えている場合 (たとえば、変換によって問題なく反転操作が許可されていても、ユーザーが画像を反転することを禁止する場合)、私の頭に浮かぶ最も簡単な解決策は、isValid()機能し、キーポイントが無効な場合は新しい位置に移動しません。

無効な状態空間領域を「スライド」するコードを持つことは、無効な領域が「ほぼ無効な」領域に非常に近くなるため、うまく処理するのが非常に困難です。「スライド」が必要な場合でもisValid()、ユーザーが求めているポイントに最も近い有効なポイントを見つけるために、キーポイント位置の周りでローカル検索を行うことにより、暗黙のアプローチを実装することにおそらく行きます。

すべてのスライディングの可能性を明示的に計算することは、変換アルゴリズムで何かを変更する必要がある場合に正しく取得し、維持するのに悪夢です (結果として、有効なものとそうでないもの)。

于 2010-12-30T20:05:43.427 に答える
0

開始時、およびユーザーがハンドルを移動するたびに、他のハンドルが通過できない水平線と垂直線のセットを決定し、ドラッグ中にそれらの境界を強制します。これで最初の問題は解決します。

2 つ目は、ドラッグ中にマウスが移動したときに、カーソルと他の 3 つのハンドルのそれぞれの間の距離を計算します。定義した最小距離よりも短い場合は、ハンドルを他のハンドルの周りを円形に移動します。

于 2010-12-30T20:17:15.947 に答える