
C#(.net framework 4.0)で現在業務に使用しているソフトで、地図画像に対して、ごく初歩的な図形(直線や矢印、円、四角形、文字程度)を挿入する事が必要になりそうでして、ドローソフト系のようなプログラミングを行いたいと思っています。(Excel上での図形挿入の様なイメージ)
Graphicsを使用して、線や塗りなどの描画はすぐにできると思うのですが、一度描画した線や四角を移動させたり大きさを調整したりするために、対象の図形をマウスでクリックして選択する方法がまるでうかびません。通常、この「図形を選択する」というのはどのように実現させているのでしょうか?思いつくものとしては、
図形をコントロールとして扱い、マウスイベントを直接受け取れるようにする?
(そもそもコントロールの使い方として間違っているような気がしますし、パフォーマンスにかなりの悪影響がありそう…)
別に座標マップを作り、どの図形がどのドットに対応しているかを記録する?
(線を引いた結果、どの座標がどの図形かをすべて計算する必要があると、かなりの計算とコード量になりそう…)
くらいです。基本的な、もしくは一般的な方法や考え方がありましたら是非教えてください。ペイント系ならそれなりにネット上に情報はあるような気もするのですが、ドロー系に関する情報はなかなか少ないようで困っています。ドロー系ソフト作成時に参考になるコードや情報や本などありましたら、そちらも教えていただけると助かります。よろしくお願いいたします。
P.S. 質問投稿時にさんざん迷ったのですが、C#(.Net Framework)のカテゴリーって、こちらの C・C++ でよろしかったんでしょうかw
No.3ベストアンサー
- 回答日時:
図形をコントロール(ウィンドウ)や、それを囲む矩形で判断すると、重なった部分に問題が出ます。
例えば、線分を描いたあとでその線分を囲むような円を描いた場合、円の方が(Z-orderで)上にある状態だと後ろにある線分を選択することができなくなります。
ソフトによっては、「前面に移動」、「背面に移動」といったコマンドを用意して回避している場合もあります。
クリックした点と図形の距離を計算し、範囲内で最も距離が近い図形を選択するようにしてはいかがでしょうか。
線分の場合の距離は、クリックした点から線分に垂線を引き、交点とクリックした点の距離を使います。ただし、交点が線分の延長線上になる場合は、クリックした点と線分の端点の距離のうち小さい方を使います。
円・円弧の場合は、中心点とクリックした点を通る直線を作り、その直線と円との交点を使用します。円弧の場合で交点が円弧の範囲外の場合は、線分と同様に円弧の端点を使用します。
矩形の場合は、矩形を4つの線分と考えて各線分との距離のうち小さいものを使用します。
すべて数学的な計算だけで済みます。ドットとの対応とかは使いません。
なるほど、交点とは思いつきませんでした。一次関数の嵐でなんとかなりそうですね。ただ、「数学的な計算だけ」とはいえ、そこが一番ネックになりそうです。複雑な計算は避けて通れそうにありませんね。ありがとうございます。もう少し楽して…というのは、無理でしょうか><
No.2
- 回答日時:
図形クラスを用意して、MouseMoveやMouseUp, Down毎にマウスポインタが図形と重なっているかどうかなどを検出して、選択や移動を行うのが一般的ではないでしょうか。
座標は正確に図形の形ではなくても図形全体を囲う矩形で通常は十分です。
描画も図形クラス自身に行わせます。
再描画ごとに登録している図形コレクションのすべてのDraw()メソッドを呼び出す感じです。
矩形で範囲が判断できれば確かにいうことはないのですが…、斜めの直線や四角形を回転させることもかなりの確率であり得ますのでなかなかどうしたものかと。
各図形のインスタンスのDrawメソッドで描画をすると便利なのは確かにその通りですね。参考にします。ありがとうございました。
No.1
- 回答日時:
ありがとうございます。「アルゴリズム入門 2章 CAD入門」内の「2.5.1 図形の選択処理 (1)内包処理」は、まさしく選択に関する記述でした。参考にさせていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
-
ピンとくる人とこない人の違いは?直感を鍛える方法を心理コンサルタントに聞いた!
根拠はないがなんとなくそう感じる……。そんな「直感がした」という経験がある人は少なくないだろう。ただ直感は目には見えず、具体的な説明が難しいこともあるため、その正体は理解しにくい。「教えて!goo」にも「...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ListBoxで改行したい
-
給紙トレイをダイアログを使わ...
-
線を引くには?
-
VB2010のChartで、何本もの線を...
-
ボタンの更新速度について
-
VB.NETでグラフィックを描くと...
-
CADとC言語のリンク
-
ピクチャーボックスのサイズを...
-
線の描画速度
-
C++/CLIを用いて画像をクリップ...
-
PowerPoint の VBA
-
excel2007 ではマクロの記録で...
-
VB.NETでphotoshopのレイヤーの...
-
VB .net Form_Load時、または関...
-
角が丸い長方形の描画
-
Visual C++ MaskedTextBoxの右...
-
vb2010でグラフを描く方法
-
エクセルのレーダーチャート 0...
-
ピクチャーボックスでの折線グ...
-
Windows10のC#のピクチャーボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ListBoxで改行したい
-
C#を用いて描画する四角形の角...
-
for文の実行速度を遅くしたいの...
-
給紙トレイをダイアログを使わ...
-
PowerPoint の VBA
-
VB.NETでグラフィックを描くと...
-
MFCでのコンボボックスについて
-
PictureBoxのダブルバッファリ...
-
Word:描画オブジェクト内の画...
-
VB PictureBoxの描画範囲
-
VC++ MFCチェックボックスの色...
-
Word 描画オブジェクトを削除...
-
Visual C++ MaskedTextBoxの右...
-
C++/CLIを用いて画像をクリップ...
-
VB.netで図形描画ができません^^;
-
VC;;6.0のMFCで線を簡単に引け...
-
VB.NETでphotoshopのレイヤーの...
-
角が丸い長方形の描画
-
図の削除直後の再描画
-
vb6のTEXTBOX
おすすめ情報