C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: ラインに近づくとカーソルを変更する


(過去ログ 157 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■91387 / inTopicNo.1)  ラインに近づくとカーソルを変更する
  
□投稿者/ BBA (1回)-(2019/06/20(Thu) 14:02:04)

分類:[.NET 全般] 


PictureBox上にラインが描画してあり、
そのラインにカーソルを近づけると
カーソルを変更するという処理を行いたいのですが、

ポイントの場合には、
if x > x0 -dx AndAlso x < x0 + dx AndAlso y > y0 -dy AndAlso y < y0 + dy Then

End If
のようにして分岐してやればうまくいきますが、
ラインの場合にはどのようにしてやるのが簡単でしょうか?

あらかじめPictureBoxと同じサイズのBoolean配列を作成した上で
ライン上の各ピクセルで、上記のIf文を回して、
Boolean変数を設定、
その配列を使って分岐するしかないでしょうか?

ピクセルが重複している箇所が多く
かなり冗長的な処理になってしまいますが、
一般的にはこのようにして行うべきなのでしょうか?



引用返信 編集キー/
■91392 / inTopicNo.2)  Re[1]: ラインに近づくとカーソルを変更する
□投稿者/ hg (1回)-(2019/06/20(Thu) 16:39:20)
描画されたラインは何か数式で表せるようなものですか?
もし、ラインが数式で表せなくって、Boolean配列を用意しなくてはならないのならば、
あらかじめマウスカーソルを変えたい所もフラグを立てておけば、
マウスのX, Y位置のフラグが立っているかどうかで判断できそう。
引用返信 編集キー/
■91393 / inTopicNo.3)  Re[2]: ラインに近づくとカーソルを変更する
□投稿者/ BBA (2回)-(2019/06/20(Thu) 17:10:51)
描画されたラインはまっすぐな直線で数式で表せるものです。
ただし、位置は固定ではなく、
マウスのドラッグ操作で動かせるようになっています。

どうするのが適当でしょうか?

引用返信 編集キー/
■91394 / inTopicNo.4)  Re[3]: ラインに近づくとカーソルを変更する
□投稿者/ Hongliang (827回)-(2019/06/20(Thu) 17:25:48)
水平線または垂直線なら話は簡単ですが、そうではないんですよね?
「点と線分の距離」で検索するとプログラムレベルのものも見つかるようですが、それを使うのはどうでしょうか。
// 線分の始点・終点より"向こう"の場合にどうするかは考え方次第ですが。
引用返信 編集キー/
■91395 / inTopicNo.5)  Re[3]: ラインに近づくとカーソルを変更する
□投稿者/ hg (2回)-(2019/06/20(Thu) 17:34:11)
No91393 (BBA さん) に返信
> 描画されたラインはまっすぐな直線で数式で表せるものです。
> ただし、位置は固定ではなく、
> マウスのドラッグ操作で動かせるようになっています。
>

ラインの位置が固定でなくとも、
今の状態のラインの位置情報(開始座標・終了座標)は分かるのでしょうか?
もし分かれば計算できそうですね。
(例えばマウスのX座標より、マウスのY座標がどの範囲にあればOKか、のような。)
引用返信 編集キー/
■91396 / inTopicNo.6)  Re[4]: ラインに近づくとカーソルを変更する
□投稿者/ PANG2 (305回)-(2019/06/20(Thu) 18:04:38)
点と直線の距離
https://ja.wikipedia.org/wiki/%E7%82%B9%E3%81%A8%E7%9B%B4%E7%B7%9A%E3%81%AE%E8%B7%9D%E9%9B%A2

引用返信 編集キー/
■91397 / inTopicNo.7)  Re[5]: ラインに近づくとカーソルを変更する
□投稿者/ ぼーちゃん (10回)-(2019/06/20(Thu) 18:15:39)
https://qiita.com/boiledorange73/items/bcd4e150e7caa0210ee6

URLのプログラムをVB.NETで書いただけですが、
以下で線分 p1-p2と点p0の距離を取れます。
この返り値が一定以下の時に処理をすればよいでしょう。
p1, p2へラインの始点座標と終点座標を渡せるよう、
ドラッグ操作処理の終わりなどで座標を保持しておく必要があります。

Private Function GetDist(p0 As Point, p1 As Point, p2 As Point) As Double
    Dim a = p2.X - p1.X
    Dim b = p2.Y - p1.Y
    Dim a2 = a * a
    Dim b2 = b * b
    Dim r2 = a2 + b2
    Dim tt = -(a * (p1.X - p0.X) + b * (p1.Y - p0.Y))

    If tt < 0 Then Return (p1.X - p0.X) * (p1.X - p0.X) + (p1.Y - p0.Y) * (p1.Y - p0.Y)
    If tt > r2 Then Return (p2.X - p0.X) * (p2.X - p0.X) + (p2.Y - p0.Y) * (p2.Y - p0.Y)
    Dim f1 = a * (p1.Y - p0.Y) - b * (p1.X - p0.X)
    If f1 > 40000 Then Return Double.MaxValue 'f1*f1がオーバーフローしないようf1一定以上で足切り
    Return f1 * f1 / r2
End Function

引用返信 編集キー/
■91407 / inTopicNo.8)  Re[6]: ラインに近づくとカーソルを変更する
□投稿者/ BBA (3回)-(2019/06/21(Fri) 15:22:57)
このような式があるのですね
どうもありがとうございます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -