Handgezeichnete Form erkennen


7

Ich möchte den Spieler bitten, eine einfache Form (Dreieck, Quadrat, Stern, alles, was mit einem Strich gemacht werden kann) mit der Maus oder auf einem Touchscreen nachzubilden.

Orientierung ist wichtig, Größe nicht. Beispiel: Geben Sie hier die Bildbeschreibung ein

Kann mir jemand Anweisungen geben, welche Techniken verwendet werden können?


Wirst du ein Stück Papier mit Zeichnungen scannen oder wird es direkt mit einem Tablet oder so eingegeben? Denn mit direkter Eingabe könnten Sie Eckpunkte erstellen, an denen der Spieler die Richtung ändert, und diese verwenden
Peethor

Es wird eine mausgesteuerte (möglicherweise berührungsempfindliche) Eingabe sein.
Gast-418

Antworten:


12

Sie müssen an die Formen in Vektorform denken. Für Ihr Dreieck kann die Form also als eine Reihe von Vektoren dargestellt werden: (-0,5, -0,5), (1, 0), (-0,5, 0,5). Da Sie die Form und Ausrichtung kennen, passen Sie die Fingerbewegung des Benutzers grundsätzlich an die erwartete Form an.

Vektordarstellung der Form

Sie bestimmen den Maßstab des Bildes, indem Sie den anfänglichen Berührungspunkt des Benutzers und dann bei jeder Aktualisierung den Punkt protokollieren, an dem sich sein Finger befindet, bis er das Ende der ersten Zeile erreicht (dazu später mehr). Die Länge des Vektors von der Stelle, an der die Berührung begonnen hat, bis zur Stelle, an der sich die erste Ecke befindet, ist der Maßstab des Bildes, das Sie voraussichtlich zeichnen werden. Sie multiplizieren Ihre Vektordarstellung der erwarteten Form mit dieser Skala, um die richtige Form zu erhalten, die sie zeichnen sollen.

Formskala bestimmen

Um die erste Ecke zu bestimmen, sollten Sie wahrscheinlich den Winkel des Vektors vom anfänglichen Abgriffspunkt bis zum aktuellen Abgriffort verfolgen. Sobald dieser Winkel um einen bestimmten Schwellenwert vom erwarteten Winkel abweicht, nehmen Sie an, dass der Benutzer die Zeichenrichtung geändert hat.

Die erste Ecke identifizieren

Da der Punkt, an dem wir die Richtungsänderung erkennen (unteres blaues Kreuz auf dem Bild oben), nicht die tatsächliche Ecke ist, sondern der Schwellenwinkel überschritten wurde, müssen wir immer noch den tatsächlichen Punkt bestimmen, um den richtigen Maßstab zu bestimmen. Dies geschieht durch Betrachten der ersten beiden Vektoren unserer Form - in unserem Fall (-0,5, -0,5) und (1, 0). Wir stellen sie so ein, dass der erste die Startposition des Hahns durchläuft und der zweite den Punkt durchläuft, an dem der Schwellenwinkel überschritten wird. Wir bleiben mit (-0,5 + x1, -0,5 + y1) und (1 + x2, 0 + y2), wobei x1, y1, x2 und y2 die Offsets sind, die erforderlich sind, um sicherzustellen, dass die Linien durch die angegebenen Punkte verlaufen. Dann finden wir den Schnittpunkt dieser beiden Linien. Dies ist der Punkt, an dem der X-Wert beider Linien gleich und der Y-Wert beider Linien gleich ist.

Bestimmen des richtigen Schnittpunkts

Um die Zeichenqualität zu berechnen, müssen Sie den Pfad des Benutzers in gleichen Abstandsintervallen abtasten.

Geben Sie hier die Bildbeschreibung ein

In jedem Intervall finden Sie den nächstgelegenen Punkt auf der richtigen Form. Die Entfernung ist der Fehler.

Geben Sie hier die Bildbeschreibung ein

Am Ende müssen Sie diesen Fehler auch basierend auf der gezeichneten Entfernung gegenüber der richtigen Entfernung normalisieren. Dies bedeutet, dass das Zeichnen einer längeren Form Ihren Fehler nicht erhöht und das Zeichnen einer kürzeren Form ihn nicht verringert.

adjusted_error = measured_error * (correct_shape_length / drawn_shape_length)

Viele der hier erwähnten Dinge haben alternative Ansätze. Ich könnte auch viel tiefer gehen in Bezug auf die lineare Algebra, die für die Berechnungen benötigt wird, oder die spezifischen Klassen und Methoden, die in Unity selbst verwendet werden. Ich benötige jedoch weitere Informationen darüber, welche zusätzliche Hilfe Sie benötigen, bevor ich das tun kann.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.