[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/07/11(Wed) 19:44
投稿者名:なな
Eメール:
URL :
タイトル:
フリーハンドで描いたオブジェクトを選択したか?判定したい
いつもお世話になります。

VB歴3年のPGです。
環境:VB6(SP5) WinXp

PictureBoxにフリーハンドで描いたオブジェクトがあります。
そのオブジェクトを選択したかどうか?という判定を
どのように行えば良いか分かりません。

フリーハンドで描く処理は、以下の通りです。

よろしくお願いします。
----------------------------------------------------------------
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single,
Y As Single)

    Flag = True
    
    Picture1.PSet (X, Y)

End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)

    If Flag = True Then
            Picture1.Line -(X, Y)
    End If

End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single,
Y As Single)

    Flag = False

End Sub

投稿時間:2007/07/11(Wed) 19:57
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re: フリーハンドで描いたオブジェクトを選択したか?判定したい
線が見えるってことは、地の色と線の色が違うってことですね。
Point関数でマウスが押された点の色を調べて地の色と異なれば
線が選択されたってことですね。

(今回の質問はつまらなかった)

但しPsetで描かれた線をオブジェクトとしてどういう風に利用する
のかというのは興味があります。

投稿時間:2007/07/11(Wed) 20:14
投稿者名:なな
Eメール:
URL :
タイトル:
Re^2: フリーハンドで描いたオブジェクトを選択したか?判定したい
ダンボ様

早々のご回答ありがとうございます。

> 線が見えるってことは、地の色と線の色が違うってことですね。
> Point関数でマウスが押された点の色を調べて地の色と異なれば
> 線が選択されたってことですね。
確かにそうですが。PictureBoxには画像がある(カラーの可能性あり)ので、
色だけの判断は厳しいかと…。
説明不足でした。申し訳ないです<(_ _)>

> 但しPsetで描かれた線をオブジェクトとしてどういう風に利用する
> のかというのは興味があります。
先ほども書きましたが、オブジェクトの下に画像があります。
その画像へ目印を付ける意味で、フリーで描きたいです。

投稿時間:2007/07/11(Wed) 20:40
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: フリーハンドで描いたオブジェクトを選択したか?判定したい
描画したドットの位置を変数に格納しておけば。

線の太さがどの位か知りませんが、選択するのが大変だと思いますよ。


LineDDA Win32 API 関数を調べて見るとか、ここのサンプルの No.435 で使って
います。
 

投稿時間:2007/07/12(Thu) 08:27
投稿者名:y4yama
Eメール:
URL :
タイトル:
Re: フリーハンドで描いたオブジェクトを選択したか?判定したい
こんちは
AutoRedraw=Trueだと、Line()で描く線は前のが残るし・・・大変そうですね
花ちゃんさんのアドバイスにもあるように、座標を覚えておいて計算するのが楽でいいです

テストコードを載せておきます。オブジェクトを選択したか?に的を絞ったはなしですが
Picture1の中に、Line1 という線をあらかじめデザインで作っておいて下さい
Line1の始点付近をLクリックして、ドラッグしたら、Line1の始点が移動できます

Dim sx, sy
Dim flag

Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If dist(X, Y, Line1) < 14 Then
    flag = True
    sx = X: sy = Y
End If
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If flag = True Then
            Line1.X1 = Line1.X1 + X - sx
            Line1.Y1 = Line1.Y1 + Y - sy
           ' Line1.X2 = Line1.X2 + X - sx
           ' Line1.Y2 = Line1.Y2 + Y - sy
            sx = X: sy = Y
    End If
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    flag = False
End Sub

Function dist(X As Single, Y As Single, L1 As Line)
    dist = Sqr((X - L1.X1) * (X - L1.X1) + (Y - L1.Y1) * (Y - L1.Y1))
End Function

Line1のどこでもHitするようには、
点と線の距離を計算して、更に、線の始点と終点の間に点がある、という計算をするだけです。2Dの距離計算は、ネットでさがしてください
参考になれば・・・いいのですが・・・フリーハンドで描いた・・となると数百点を記録することになるんでしょうかねぇ〜

投稿時間:2007/07/12(Thu) 10:00
投稿者名:よねKEN
Eメール:
URL :
タイトル:
Re: フリーハンドで描いたオブジェクトを選択したか?判定したい
> PictureBoxにフリーハンドで描いたオブジェクトがあります。

「オブジェクトがある」というためにはまずオブジェクトを管理しておく必要がある、
ということは既に他の方からご指摘のあるところですね。

> そのオブジェクトを選択したかどうか?という判定を
> どのように行えば良いか分かりません。

まずはどう管理するかを考えましょう。

・点なら
  →(x,y)、太さ、z
・線なら
  →始点(x1,y1)、終点(x2,y2)、太さ、z
・フリーハンドなら
  →(x,y)の配列(要素数Nは動的)、太さ、z、

を持っておく必要があると思います。
オブジェクト同士が重ならないならzは不要です。太さも1固定であれば不要です。

さらにオブジェクトの有無を調べやすくするために、
各オブジェクトはそのオブジェクトのすべての点を内包する
長方形の左上、右下の座標も持っておいた方が便利かもしれません。
  
後は、ある点がどのオブジェクトに含まれているかの判定を行うことになりますね。
線上に点があるかどうかは、y = ax + b の式から計算できますね。
フリーハンドの場合はこれを点1と点2の線分、点2と点3の線分、・・・、
という風にチェックを繰り返すことになります。

ただし、この方法だと1ドット単位で正確にオブジェクトに触らないといけないことになるので、
厳密には線分上にあるかどうかではなく、線分から一定の距離内にあるかどうか?
を判定することになります。

投稿時間:2007/07/12(Thu) 13:41
投稿者名:なな
Eメール:
URL :
タイトル:
Re^2: フリーハンドで描いたオブジェクトを選択したか?判定したい
花ちゃん 様
y4yama 様 
よねKEN 様

こんにちは。たくさんのご回答ありがとうございます。
参考にさせていただきます。

解決後、ポイントをご連絡させていただきます。