2016-04-15 8 views
0

Ich möchte eine Linie in einem BMP, die in PictureBox mit einem Graphic.DrawLine() befindet, die ich mit der Maus bewegen kann. Ich kann keine Funktion finden, um zu überprüfen, ob die Maus in der Leitung ist oder nicht. Ich habe viele Methoden gefunden, um zu überprüfen, ob die Maus über Graphic.FillPolygon() liegt, aber keine über DrawLine(). Ist es eine gute Lösung, es zu überprüfen?Maus erfasst, wenn es über Linie ist (Graphic.DrawLine())

Edit: So durch den Vorschlag machte ich eine solche Funktion:

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; 
} 

Es funktioniert großartig für die Polygone. Aber ich kann das Mausereignis immer noch nicht auf die Linie bringen. Irgendwelche Vorschläge?

+0

Ist es immer eine perfekt horizontale oder vertikale Linie, keine anderen Winkel? –

+0

nein, leider kann es jeder Winkel, was mehr ist, ich möchte eine Funktion hinzufügen, um den Winkel zu ändern, wenn jemand die Vertex fangen – Blabla

Antwort

0

Da Ihre Linie in anderen Winkeln als 0 und 90 Grad sein kann, sehe ich 2 Optionen.

Die erste besteht darin, eine Line Drawing Algorithm zu verwenden, um die Punkte der Linie zu berechnen und die Position der Maus im Vergleich zu den generierten Koordinaten zu überprüfen. Diese Übereinstimmung kann leicht "unscharf" sein, wenn der von Ihnen gewählte Linienalgorithmus sich von dem unterscheidet, mit dem .NET die Linie zeichnet.

Das zweite ist ein mit Ihrem GraphicsPathline und rufen die .IsVisible(point) Methode auf, es zu benutzen, welche true zurückkehren wird, wenn der Pfad den Punkt enthält.

Ich würde Option 2 empfehlen, da es wahrscheinlich einfacher zu implementieren ist, und Sie einen "virtuellen Pfad" verwenden können, der dicker als die tatsächliche Linie ist, so dass es für Ihre Benutzer ein wenig einfacher ist, damit zu interagieren .

+0

Also habe ich eine Funktion in einer Weise, die Sie vorgeschlagen. Ich habe mehrere Formen, und ich habe die meisten Funktionen, aber es gab ein Problem, die Linie zu erkennen. Das funktioniert gut für das Polygon, aber ich kann immer noch nicht die Maus auf der Linie erkennen – Blabla

+0

Ok, ich fand die Antwort im "Duplikat" -Thread. Danke :) – Blabla

2

Sie können nie über eine geometrische Linie sein, weil es keine Dimension hat. Sie können nur einen Punkt als Teil der Linie selbst haben, aber das ist unmöglich, es sei denn, Sie treffen ihn mit unendlicher Präzision (selbst Doppelgänger können hier nicht arbeiten). Sie können sich auf einem Pixel befinden, das für die Linie gezeichnet wurde, aber das ist nicht das Gleiche.

Sie sollten die geometrischen Koordinaten der zwei Punkte und die Koordinaten der Maus nehmen. Berechnen Sie dann die Entfernung des Mauszeigers von der Linie (es ist ziemlich einfach, es gibt eine Menge Dokumentation dafür im Internet).

Wenn der absolute Abstand kleiner als ein Schwellenwert (1 1.5 2??), Dann sind Sie nah genug zu sagen, „auf der Linie“:

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

Ich lasse die Umsetzung von distance() Ihnen .

Verwandte Themen