2016-04-15 8 views
0

PictureBoxにあるbmpに、マウスで移動できるGraphic.DrawLine()の行を描画したいとします。マウスがライン上にあるかどうかを確認する機能はありません。マウスがGraphic.FillPolygon()を超えているかどうかを確認する方法はたくさんありましたが、どれもDrawLine()については確認できませんでした。それをチェックする良い解決策はありますか?ラインオーバー時にマウスをキャプチャする(Graphic.DrawLine())

編集: だから提案で、私はそのような機能を作っ:

private bool IsPointInPolygon4(Point[] poly, Point p) 
{ 
    System.Drawing.Drawing2D.GraphicsPath test = new System.Drawing.Drawing2D.GraphicsPath(); 
    if (poly.Length == 2) // it means there are 2 points, so it's line not the polygon 
    { 
     test.AddLine(poly[0], poly[1]); 
     if (test.IsVisible(p, g)) 
     { 
      MessageBox.Show("You clicked on the line, congratulations", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      test.Dispose(); 
      return true; 
     } 
    } 
    else 
    { 
     test.AddPolygon(poly); 
     if (test.IsVisible(p, g)) 
     { 
      MessageBox.Show("You clicked on the polygon, congratulations", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      return true; 
     } 
    } 
    return false; 
} 

それはポリゴンのための素晴らしい作品。しかし、私はまだその行にマウスイベントを得ることはできません。助言がありますか?

+0

これは常に完全な水平線または垂直線ですか、それ以外の角度ですか? –

+0

いいえ、unfortunatelly任意の角度にすることができます、それ以上です、私は誰かが頂点をキャッチしたときに角度を変更する関数を追加したいです – Blabla

答えて

0

あなたの線は0度と90度以外の角度になる可能性があるため、2つのオプションがあります。

最初にLine Drawing Algorithmを使用して、線のポイントを計算し、マウスの位置とそれらの生成された線の位置を確認します。選択したラインアルゴリズムが、.NETがラインを描画するために使用するアルゴリズムと異なる場合、この一致はわずかに「あいまい」かもしれません。

もう一つは、あなたのlineを含むGraphicsPathを使用すると、パスはポイントが含まれている場合trueを返します。これは、それに.IsVisible(point)メソッドを呼び出すことです。

おそらく実装が簡単なのでオプション2をお勧めします。実際の行よりも太い「仮想パス」を使用できるようになり、ユーザーが操作するのが少し楽になります。

+0

だから私はあなたが提案した方法で関数を作りました。 私は複数の形をしていますが、ほとんどの機能がありますが、行を検出するのに問題がありました。これはポリゴンには効果的ですが、私はまだマウスの行を検出できません。 – Blabla

+0

OK、「int」という回答が見つかりました。ありがとうございます :) – Blabla

2

を超えることはありません。幾何学的な線は寸法がないためです。あなたはポイントをライン自体の一部にすることしかできませんが、無限の精度でヒットしなければ不可能です(二重でもここで仕事をしません)。ラインのために描画されたピクセル上にあることができますが、それは同じではありません。

2点の幾何学座標とマウスの座標を取る必要があります。次に、ラインからマウスポイントまでの距離を計算します(これについては、インターネット上に多くのドキュメントがあります)。

絶対距離が閾値未満である場合には(1 1.5 2???)あなたは「オンライン」と言って十分に近いです:

if (distance(px, py, qx, qy, mx, my) < 1.5) 
{ 
    // on the line 
} 

私はあなたにdistance()の実装を残します。

関連する問題