Element finden, das dem angeklickten Punkt am nächsten ist

8

Brauchen Sie Hilfe hier. Ich bin ein UI-Designer, der nicht gut in Zahlen ist, die ein experimentelles Webformular entwerfen, und ich muss wissen, welches Eingabeelement einem angeklickten Punkt auf einer Webseite am nächsten kommt. Ich weiß, wie man den nächsten Nachbarn mit Punkten macht, aber die Eingabeelemente sind Rechtecke, keine Punkte, also stecke ich fest.

Ich benutze jQuery. Ich brauche nur Hilfe mit diesem kleinen Algo. Sobald ich mit meinem Experiment fertig bin, zeige ich euch, was ich mache.

AKTUALISIEREN

Ich habe darüber nachgedacht, wie es funktionieren kann. Schau dir dieses Diagramm an:

Jedes Rechteck hat 8 Punkte (oder besser 4 Punkte und 4 Zeilen), die signifikant sind. Nur der x-Wert ist für horizontale Punkte signifikant (roter Punkt) und nur der y-Wert ist für vertikale Punkte signifikant (grüner Punkt). Sowohl x als auch y sind signifikant für die Ecken.

Orange Kreuze sind die zu messenden Punkte gegen - Mausklicks in meinem Anwendungsfall. Die hellpurpurnen Linien sind die Abstände zwischen dem orangefarbenen Kreuz und dem nächstgelegenen Punkt.

Also ... bei jedem gegebenen orangefarbenen Kreuz durch jeden der 8 Punkte jedes Rechtecks ​​schlingen, um die nächstgelegene Kante oder Ecke zu finden, die dem orangefarbenen Kreuz am nächsten ist. Das Rechteck mit dem niedrigsten Wert ist das nächste.

Ich kann es konzeptualisieren und visualisieren, kann es aber nicht in Code schreiben. Hilfe!

    
Aen Tan 06.09.2011, 15:38
quelle

6 Antworten

3

Ihr Algorithmus ist korrekt. Da Sie Hilfe im Code und nicht im Algorithmus benötigen, hier ist der Code:

Es ist vielleicht nicht die effizienteste Methode. Aber es funktioniert.

%Vor%     
uzyn 09.09.2011, 11:06
quelle
2

Sie können nach dem nächsten Eckpunkt aller Rechtecke suchen. Dies funktioniert in den meisten Fällen, ist schnell und einfach zu implementieren. Solange Ihre Rechtecke in einem regelmäßigen Raster ausgerichtet sind, gibt Ihnen diese Methode das nächste Rechteck.

    
rocksportrocker 06.09.2011 15:44
quelle
2

Das Hinzufügen der relativ neuen elementFromPoint () API ermöglicht es uns ein alternativer, potentiell leichterer Ansatz: Wir können den Test um den Mauszeiger herum durchführen, indem wir in größere Kreise gehen, bis wir das nächste Element gefunden haben.

Ich habe hier ein schnelles, nicht produktionsbezogenes Beispiel zusammengestellt: Ссылка (Chrome / Safari nur aufgrund der Verwendung von webkitMatchesSelector). Die Leistung kann aufgrund der bei der Visualisierung des Algorithmus verwendeten Punkte verzögert werden.

Der Kern des Codes außerhalb der Lichtleistungsoptimierungen und der Ereignisbindungen ist dieses Bit:

%Vor%     
Dean Hunt 18.10.2013 22:29
quelle
0

Ich würde es nicht mit Zahlen machen, sondern mit Logik.

Ich nehme an, dass Sie mit etwas enden wollen, das sagt: "Wenn x das nächste Element ist, dann tu etwas, wenn ich anderswo klicke, dann tu etwas zu x"

Sie könnten dies tun, wenn jedes der Elemente, mit denen Sie etwas tun möchten, in einfachen <div> -Containern liegt, die größer sind als das Element, das Sie behandeln möchten, aber nicht größer als die Hälfte zwischen dem Objekt und dem nächsten Objekt. Ein Raster in der Tat.

Geben Sie allen Containern die gleiche Klasse.

Dann könnten Sie sagen: "Wenn y geklickt wird, machen Sie etwas mit x", Sie würden bereits wissen, welches Element in jedem Container ist.

Ich würde den Code schreiben, aber ich verlasse die Arbeit ...

    
T9b 06.09.2011 15:52
quelle
0

Wenn Sie den Abstand zwischen zwei Punkten in einem 2D-Raster finden möchten, können Sie die folgende Formel verwenden:

(für 2D-Punkte A und B)

distanceX = A.x - B.x

EntfernungY = A.y - B.y

totalDistance = QuadratRoot ((distX * distX) + (distY * distY))

Sobald Sie den Abstand zwischen zwei Punkten überprüfen können, können Sie ziemlich leicht herausfinden, welche Ecke Ihres Mausklicks am nächsten ist. Es gibt viele Dinge, die Sie tun können, um Ihren beabsichtigten Algorithmus zu optimieren, aber das sollte Ihnen einen guten Start geben.

    
5hoom 07.09.2011 15:30
quelle
0

lol, die Frage ist, warum denkst du an Formen? Ihre Frage ist wirklich "wenn ich auf eine Koordinate klicke, finde ich den nächsten Knoten / Punkt zu meinem Klick", der eine Frage der verschiedenen Knoten und der Berechnung von Entfernungen ist.

Wenn dasselbe X verwendet wird, verwenden Sie die Differenz

Wenn dasselbe y, verwende x Unterschied

Verwenden Sie andernfalls hypotheuseuse

Sobald Sie den nächsten Punkt finden, können Sie die Elternform richtig bekommen? Dies funktioniert, weil Sie versuchen, den nächsten Punkt zu fangen. So wird es sogar mit ausgefallenen Formen wie Sternen funktionieren.

    
Gary 07.09.2011 15:32
quelle