2

ユーザーが線や多角形などを描画できるCADアプリケーションがあります。

私が直面している厄介な問題の 1 つは、ユーザーの描画が非常に不正確になる可能性があることです。たとえば、ユーザーは、互いに接続された 2 つの四角形を描画したい場合があります。したがって、2 つの長方形によって共有される 1 つの線が存在するはずです。ただし、ユーザーが線を描く代わりに、互いに非常に接近している2 つの線を描くのは簡単です。非常に接近しているため、画面から見たときに同じ線であると誤解される可能性があります。少しズームインすると、そうではありません。

私のアプリケーションでは、ユーザーが線を適切に描画する必要があります (または、前処理で自動修正を実行できる必要があります)。そうしないと、内部アルゴリズム (それをThe Algorithmと呼びましょう) が入力を正しく処理できません。

この種の問題に対処するための最善の戦略は何ですか? ポイント座標をある程度の精度で丸めることを考えていますが、このアプローチの問題を正確に特定することはできませんが、これは正しい方法ではないと感じています。これにより、新しいセットが導入されます問題の。

編集:議論のために、スナップは利用可能なオプションではありません。ちなみに、あらゆる種類の「入力側」のガイダンスは利用できません。修正は、描画が終了したときにコードの前処理を介して行う必要がありますが、アルゴリズムに送信する直前です。

クレイジーな制限、あなたは言います。しかし、ユーザーは自分のアプリケーションで入力を作成することも、他の CAD ソフトウェアで入力を作成してから私のエンジンに送信して計算を行うこともできます。彼らが他の CAD ソフトウェアに入力する方法を制御することはできません。

編集 2:発生する「クラスター半径」をユーザーに指定させることができますが、重要な点は、前処理アルゴリズムが一貫しており、実際に新しい一連の問題が発生しないことを確認する必要があることです。

何か案が?

4

3 に答える 3

3

私が見る 1 つの問題は、クラスタリング/スナップ アルゴリズムが、どのポイントに移動するかを独自に決定する必要があることです。

ライブ入力中のスナップは簡単です。最初のポイントはそのままで、2 番目のポイントが最初のポイントにスナップされます。オフライン モードで、一緒にスナップする必要があることがわかっている多数のポイントを取得した場合、結果のポイントがどこにあるべきかわかりません。平均を計算すると、まったく新しいポイントになる可能性がありますか? すべての候補の中から最も中心的なポイントを選択してください? ランダムに選ぶ?ポイントを x/y/z 軸上の他のポイントに合わせてみませんか?

プログラムでユーザーの操作がまったく許可されている場合は、マージの候補となる可能性のあるポイント クラスターを検出し、ユーザーが選択できるさまざまなマージ ターゲット ポイントを提示できます。
それ以外の場合は、この種の動作を構成可能にすることができます: マージ半径 (「2 つ以上の点が互いに n 単位以内にある場合...」) とマージアルゴリズム (「... それらを最も中心にマージする」指定されたポイント") をパラメーターとして設定し、構成ファイルから読み取ります。

于 2011-01-12T10:54:35.883 に答える
2

スナップポイント。ユーザーはエンドポイント(およびその他多数)にスナップできる必要があります。スナップを検出したら、ユーザーがクリックしたポイントをスナップポイントに変更するだけです。AutoCAD、関数行End、Middleなどを確認します。

編集:オフラインスナップが必要な場合は、ポイントのすべてのペアが互いに近いかどうかを確認する必要があります。問題は、これがNPの問題であるため、O(n ^ 2)の時間計算量を実際に下回ることができないため、多くの時間がかかることです。必要なこのアルゴリズムは、「クラスタリング」の下にある必要があります。

EDIT2:入力データが悪いと考えるべきではないと思います。しかし、本当にこれをやりたい場合は、簡単な方法は、各ポイントを取得し、ユーザーが定義した半径に他のポイントがあるかどうかを確認することです。ある場合は、1つのポイントにマージするグループ全体を見つけ、ポイントの座標の平均を見つけて、すべてをポイントします。その特定のポイントにそれら。ただし、覚えておいてください。ほとんどの設計者は、スナップポイントが何であるかを知っており、それらを使用しない場合は、そのための有効なアイデアを持っています。

于 2011-01-12T08:00:41.387 に答える
2

あなたの基本的な問題は、2行が「同じ」行であるかどうかを判断するように思えます(正しく理解できたと思います)。

私自身の経験からすると、入力の座標を丸めるのは良い考えではないかもしれません。

たぶん、入力の座標をそのままにしておく必要がありますが、関数を実装して、「アルゴリズム」で使用する IsSameLine という名前を付けましょう(説明を正しく理解した場合、2つの長方形が接続されているかどうかを他の人が判断します)。

IsSameLine は、特定の (場合によっては構成可能な) 画面解像度を考慮して、入力ラインの端点をソース座標から画面座標に変換し、それらが画面座標で同じかどうかを確認できます。

つまり、次のエクステント (左下) (右上) ((10,10), (24,53)) を持つ入力ファイルがあるとします。問題は、1600x1200 ピクセルの画面で「範囲にズーム」レベルで描画した場合、ポイント (11,15) と (11.1, 15.1) がどれだけ離れているかということです。したがって、ソース座標から「スクリーン座標」への変換を決定できます。次に、上記のように IsSameLine でこの変換を使用します。

しかし、これが実際にあなたにとって良い解決策になるかどうかはわかりません。

もう 1 つの (おそらくより良い?) 可能性は、IsSameLine を実装して、2 つの線の点が最大イプシロン距離離れている場合に true を返すことです。イプシロンは、入力ベクトル データの範囲に基づいて計算されたデフォルト値を持つことができ、ユーザーが別の値を指定できるようにすることをお勧めします。

于 2011-01-12T10:13:24.607 に答える