- ベストアンサー
C#(.net) ドロー系ソフト作成 図形選択方法
- C#(.NET)でドロー系ソフトを作成する場合、図形の選択方法について悩んでいます。図形をコントロールとして扱い、マウスイベントを直接受け取る方法や座標マップを作成する方法が考えられますが、一般的な方法や考え方があれば教えてください。
- C#(.NET)でドローソフトを開発中ですが、図形の選択方法がわかりません。マウスで図形を選択し、移動や大きさの調整ができる方法を知りたいです。図形をコントロールとして扱ったり、座標マップを作成する方法があるか教えてください。
- C#(.NET)でドローソフトを作成していますが、図形の選択方法がわかりません。マウスクリックで図形を選択し、移動や大きさの調整ができるようにしたいです。一般的な方法や参考になるコード、本などがあれば教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
図形をコントロール(ウィンドウ)や、それを囲む矩形で判断すると、重なった部分に問題が出ます。 例えば、線分を描いたあとでその線分を囲むような円を描いた場合、円の方が(Z-orderで)上にある状態だと後ろにある線分を選択することができなくなります。 ソフトによっては、「前面に移動」、「背面に移動」といったコマンドを用意して回避している場合もあります。 クリックした点と図形の距離を計算し、範囲内で最も距離が近い図形を選択するようにしてはいかがでしょうか。 線分の場合の距離は、クリックした点から線分に垂線を引き、交点とクリックした点の距離を使います。ただし、交点が線分の延長線上になる場合は、クリックした点と線分の端点の距離のうち小さい方を使います。 円・円弧の場合は、中心点とクリックした点を通る直線を作り、その直線と円との交点を使用します。円弧の場合で交点が円弧の範囲外の場合は、線分と同様に円弧の端点を使用します。 矩形の場合は、矩形を4つの線分と考えて各線分との距離のうち小さいものを使用します。 すべて数学的な計算だけで済みます。ドットとの対応とかは使いません。
その他の回答 (2)
- iavts4
- ベストアンサー率75% (3/4)
図形クラスを用意して、MouseMoveやMouseUp, Down毎にマウスポインタが図形と重なっているかどうかなどを検出して、選択や移動を行うのが一般的ではないでしょうか。 座標は正確に図形の形ではなくても図形全体を囲う矩形で通常は十分です。 描画も図形クラス自身に行わせます。 再描画ごとに登録している図形コレクションのすべてのDraw()メソッドを呼び出す感じです。
お礼
矩形で範囲が判断できれば確かにいうことはないのですが…、斜めの直線や四角形を回転させることもかなりの確率であり得ますのでなかなかどうしたものかと。 各図形のインスタンスのDrawメソッドで描画をすると便利なのは確かにその通りですね。参考にします。ありがとうございました。
- akayoroshi
- ベストアンサー率50% (46/91)
以下の参考URLの資料はいかがでしょうか
お礼
ありがとうございます。「アルゴリズム入門 2章 CAD入門」内の「2.5.1 図形の選択処理 (1)内包処理」は、まさしく選択に関する記述でした。参考にさせていただきます。
お礼
なるほど、交点とは思いつきませんでした。一次関数の嵐でなんとかなりそうですね。ただ、「数学的な計算だけ」とはいえ、そこが一番ネックになりそうです。複雑な計算は避けて通れそうにありませんね。ありがとうございます。もう少し楽して…というのは、無理でしょうか><