4 Stimmen

Erkennen des Schnittpunkts von 2 Linien

Ich habe 2 (VisualBasic.PowerPacks)LineShapes in meinem Formular:

Alt-Text http://lh4.ggpht.com/_1TPOP7DzY1E/S2cIJan7eHI/AAAAAAAADAw/qwA0jFHEbBM/s800/intersection.png

Wenn ich auf einen dieser Einträge klicke, erscheint ein spezielles Kontextmenü. Die Zeilen können vom Benutzer verschoben werden. Ein Kontextmenü ist mit einer Zeile verbunden. Wenn der Benutzer jedoch auf den Schnittpunkt (falls vorhanden) klickt, muss ich ein anderes Menü anzeigen, das eine der Schnittlinien auswählt, um eine Aktion durchzuführen.

Nun frage ich mich, wie man erkennt, dass sich 2 (oder mehr) Linien im Klickpunkt schneiden, denn in diesem Fall sollte ein anderes Kontextmenü erscheinen.

Was ich versucht habe zu tun:

    private void shapeContainer1_MouseDown(object sender, MouseEventArgs e)
    {
        // right click only
        if (e.Button == MouseButtons.Right)
        {
            LineShape target = 
                (shapeContainer1.GetChildAtPoint(e.Location) as LineShape);

            if (target != null)
            {
                Console.WriteLine(new Point(target.X1, target.Y1));
            }

        }
    }

Ich nehme an, ich habe nur LineShapes im Container. Dies sagte, der ShapeContainer wird nicht ein MouseDown-Ereignis auslösen, wenn eine LineShape unter der Maus sein wird.

Aber dieser Code gibt mir nur die mostTop-Zeile, aber ich möchte auch eine Liste der anderen.

3voto

alemjerus Punkte 7563

In Ihrem Koordinatennetz haben Sie zwei Zeilen mit y1 = ax + c1 y y2 = bx + c2 . Finden Sie den Schnittpunkt, an dem x1=x2 y y1=y2
y = ax + c1, y = bx + c2
ax + c1 = bx + c2
x = (c2 - c1)/(a - b)
Prüfen Sie dann, ob der Schnittpunkt nicht außerhalb der Liniengrenzen liegt, und berechnen Sie den Abstand +- Pixel oder zwei.

2voto

Reed Copsey Punkte 536986

Sie müssen lediglich den Schnittpunkt von zwei Liniensegmenten berechnen. Das ist ziemlich einfach.

Eine vollständige, [Der Arbeitsalgorithmus wird hier beschrieben](http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm#intersect2D_SegSeg()) . Es arbeitet mit Liniensegmenten, die durch zwei Punkte definiert sind, und sollte sich daher leicht an Ihre Situation anpassen lassen.

0voto

Ian Punkte 32230

Serhio, so einfach ist das Mathe ...

Ermitteln Sie die Schnittpunkte Ihrer Linien (wahrscheinlich tun Sie dies, wenn sie hinzugefügt werden, und speichern Sie das Ergebnis), und prüfen Sie dann, ob die Maus nahe genug ist, um das Kontextmenü anzuzeigen, damit Sie nicht pixelgenau klicken müssen.

0voto

Adriaan Punkte 3262

Abgesehen vom Algorithmus zum Schneiden von Linien (wie von mehreren Personen auf dieser Seite gezeigt), müssen Sie das Kontextmenü von den Linien entkoppeln. In Pseudo-Code brauchen Sie etwas wie:

onLine1Click:
if intersection then handle intersection
else handle line1 click

onLine2Click:
if intersection then handle intersection
else handle line2 click

Diese Handhabung kann über das Kontextmenü erfolgen. Ich glaube, dass dieses if/then/else erforderlich ist, um Ihr verbleibendes Problem zu lösen.

0voto

serhio Punkte 27312
    /// obtains a list of shapes from a click point
    private List<LineShape> GetLinesFromAPoint(Point p) 
    {
        List<LineShape> result = new List<LineShape>();
        Point pt = shapeContainer1.PointToScreen(p);

        foreach (Shape item in shapeContainer1.Shapes)
        {
            LineShape line = (item as LineShape);
            if (line != null && line.HitTest(pt.X, pt.Y))
            {
                result.Add(line);                    
            }
        }
        return result;
    }

    private void shapeContainer1_MouseDown(object sender, MouseEventArgs e)
    {
        // right click only
        if (e.Button == MouseButtons.Right)
        {
            List<LineShape> shapesList = GetLinesFromAPoint(e.Location);
            Console.WriteLine(DateTime.Now);
            Console.WriteLine("At this point {0} there are {1} lines.", 
                e.Location, shapesList.Count);
        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X