- - PR -
Visioのコネクタ
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-04-12 08:55
“コネクタ”の話でしょうか、それとも“図形”の話でしょうか?
コネクタというと、線や図形を「つなげるポイント(赤いバッテン)」のことだと思っていたのですが、どうも話の内容は図形そのものだし・・・コネクタも含めて、図形のこと、VISIOと類似したものを作りたいということ? | ||||
|
投稿日時: 2004-04-12 10:11
おはようございます。
Visioまではいかないのですが、 図形を描くソフトが作りたいのです。 皆さんのレスを見させて頂くと、どうもGDI+で図形を描いていって、その座標とマウスの座標とを比べていくようですが、 斜めの線とかの場合、マウスがその線の上にあるのかどうか、どうやって判定するものやら・・・。 | ||||
|
投稿日時: 2004-04-12 11:02
昔、作成したことがありますが、簡単な数学がわかっているとフリーハンドとか
五角形以上の多角形を除けば、コントロール(オブジェクト)ではなく単なる描画で 対応可能かと。もちろん市販のものにはレスポンス等は負けますけどね。(以下考え方) 作り方の基本は、CADと同じです。(CADに比べて保持する属性値は少ないですが) とりあえず、図形を1つ決める為に必要な属性を決めておきましょう。 例えば、線分であれば、始点と終点、三角形であれば3点の座標を持つ、四角形であれば 4点(または対角にある2点)、円であれば中心と半径、楕円であれば...等。 これでクリックされた位置を図形の中心とするのか、周辺(線の部分)とするのかによって 異なりますが簡単に考えるなら、4角形であれば最初のクリック=左上頂点、次のクリック =右下頂点のようにしておいたほうがいいでしょう。 各図形の座標的属性が定義できれば、後はその図形内部か外部かの判定です。フリーハンド 等の閉じられた面の場合難しいですが、円や四角形ぐらいまでなら簡単ですよね。 最後にコネクタ関係ですが、各図形には接続情報は基本的には要りませんが、図形を動かした 際、コネクタも同時に動かす等、複数の図形を同時に処理するなら必要になります。 コネクタとしての点の数は図形によって決めます。四角形であれば4辺のそれぞれの中心 と四角形の中心とか。これも属性として持たせます。描画した際に各辺の中心の座標を 求めれば簡単です。 動作の基本は、機能選択→最初のクリック座標取得→2つめのクリック座標取得→... で座標取得回数は機能によってかわります。コネクタであれば始点と終点の2回です。 1回目のクリックで、最も近いコネクタポインタの決定1。 2回目のクリックで、最も近いコネクタポインタの決定2。 を行った後、この2点を結ぶ線を描画すれば終わりです。 (動作の間で、ラバーバンドで表示させるなら移動中の座標で描画してください。) このような感じで、クリックされた位置で、 ・一番上(前面)にある図形はどれか? ・図形の周上(線上)の点か? ・図形の内部の点か? ・一番近いコネクタ座標、頂点はどこか? 等の判定をクリックごとにして決定した座標に描画すればよろしいかと。 ちなみに、斜めの線の上がクリックされたかどうかは、線の方程式にあてはまるか どうかでできます。(ただし、そんなに正確にクリックできないのであれば誤差を 見込む必要があります。) 線分は、 Y=aX+b、c≦X≦d、e≦Y≦f となりますから、クリックされた点の座標が上記条件を満足すれば線上の点、満足 しなければ線外の点で判定します。 関数として、二元一次方程式の解、二次方程式の解、n次方程式の解(四角形までなら 不要)を求め、座標軸の第何象現であるかの判定で、ひとつ解を返すもの等は基本的に 必要になります。(行列式等、解き方によってレスポンスが変わります。) 後、描画に関してはXorで描画・削除してやればいいだけですね。 | ||||
|
投稿日時: 2004-04-12 11:55
>斜めの線とかの場合、マウスがその線の上にあるのかどうか、どうやって判定するものやら・・・。
System.Drawing.Drawing2D.GraphicsPath.IsOutlineVisible() などを使ったりします。 | ||||
|
投稿日時: 2004-04-12 13:25
チャチャ入れのようで恐縮ですが:
> 例えば、線分であれば、始点と終点、三角形であれば3点の座標を持つ、 > 四角形であれば4点(または対角にある2点)、円であれば中心と半径、 > 楕円であれば...等。 円、楕円と多角形の2つでいいかも。線分は「2つの角を持つ(角になっていないけど)」と考える、と。するとあとは角の数が増えるだけですから。何らかの計算をする際、三角と四角、線分は特別扱いする、とする方が、クラス管理が楽でしょう。フリーハンドも、nがきわめて多いn角形という考え方でいけると思います。 円は、縦横の比率が1:1なら正円、違うなら楕円。楕円の場合は直径が長い方が真横とした場合の回転角が必要ですが、円は回転角が0度とすれば(というか、何度回転しても同じに見えます)良いわけですから。 問題は『閉じているか、開いているか』ですね。たとえば、五芒星の場合、頂点の内側すべてを『図形内』とするか、中心の五角形を『図形外』とするかの判断です。 接続ポイントは、図形の中心座標からの相対座標を*個持たせればいいかな? なんにしても、代数幾何の知識が必要ですね。高校、大学の教科書を漁りましょう。私は、入社直後に3×3の行列計算(拡大縮小、ページ単位の回転)をしなければならなくなり、実家から送ってもらいました。。。 C Magazineに、特集があったような??? | ||||
|
投稿日時: 2004-04-12 14:13
ですね。 ただ、「描画する」という面ではn角形でもこれで良いのですが、仰るとおり「閉じられて いるか」「開いているか」ともうひとつ、凸か凹かの判定も厄介な判定ですね。 高校の数学とかでありましたね。 n角形の閉じられた平面Hの周上にある1点A(x,y)と定点P(a,b)とを結んだとき、 この線分が平面Hを横切るか(どうかの条件を求めよ。 なんてのが...(今じゃパッと解けないですが...(^^ゞ) | ||||
|
投稿日時: 2004-04-12 18:08
代数幾何・・・ですか・・・はは・・。
>描画に関してはXorで描画・削除してやればいいだけですね。 Xorで削除というのは、どういう意味なのでしょうか? | ||||
|
投稿日時: 2004-04-13 08:32
はい、代数幾何です。その乾いた笑いは、不得手ですね? Xorで削除というか、同じところに同じものをXorで描くと消える、と言うことです。ただ、その方法だと図形が重なったときに、重なった部分が消えたり、色が変わったりします。 | ||||
