Mausgesten erkennen

Du hast eine Idee für ein Projekt?
Antworten
Ekud
User
Beiträge: 5
Registriert: Montag 20. Oktober 2008, 19:50

Mittwoch 22. Oktober 2008, 19:57

Kennt jemand Black&White?
Man war ein Gott, mit bestimmten Mausgesten konnt man Zauber auswählen.
Man muss lediglich einfache geometrische Formen zeichnen - und das Spiel hat erkannt was man wollte.
Wenn man mit seiner Maus ein W gezeichnet hat, bekam man einen Zauber zum Regen machen - wollt man den nicht, konnt man den wieder "abschütteln" - einfach die Maus schnell hin und her bewegt

Ich würde mich gern mal an soetwas versuchen - wollt aber ein paar Anregungen von anderen hören.

----- Ab hier stehen meine Denkansätze----- (wer es selbst mal probieren möchte, soll nicht weiterlesen ;) )

Man müsst die Maus selbstverständlich verfolgen,
am sinnvollsten für die Berechnungen wäre Vektorrechnung (ich hatte nur Mathe Grundkurs - kenn mich daher nur mit der Basis von Vektorrechnung aus).


Nehmen wir mal als Beispiel ein W - wenn der Benutzer ein W zeichnet, soll einfach nur mal etwas ausgegeben werden. (das W muss von Links nach Rechts gezeichnet werden)
Wir bauen uns eine Klasse "W"
Das W hat insgesamt 5 wichtige Punkte (die 3 oben, 2 unten), daraus machen wir ein Tuple für unsere Klasse "W"
((-2,1),(-1,-1),(0,1),(1,-1),(2,1))
Wir benötigen eine Information an welchem Punkt der Mauszeiger zu letzt war, deshalb nehmen wir iPunkt als Attribut.
Es muss in einem gewissen Zeitrahmen der Mauszeiger überprüft werden und dies muss Klasse W erfahren deshalb als Methode "TestPunkt(rx,ry)" rx und ry sind relative Pfade, die anhand der letzten und der momentanen Mausposition errechnet werden.
(Schlagt mich, wenn ich was falsches erzähl - ich hab die Schule schon hinter mir gelassen)
Die Methode TestPunkt(rx,ry) funktioniert in etwa so:
Das übergebene rx ist 50 und ry -100 (also ein Vektor (50,-100))
self.iPunkt ist 0 also hol dir den Vektor von Punkt 0 zu Punkt1
Der Vektor von Punkt0 zu Punkt1 ist (1,-2)

Nun zu meinen Mathematischen Gedanken - ich kenn die Begriffe nicht mehr, und entschuldige mich dafür.
Es wird der übergebene Vektor durch den von P0 zu P1 geteilt
50 / 1 = 50
-100 / -2 = 50
Dann wird der übergeben Wert, durch den der eben bei der anderen Koordinate rauskommt geteilt
50 / 50 = 1
-100 / 50 = -2
und zu guter letzt mit dem Vektor von P0 zu P1 überprüft
1 == 1
-2 == -2
Ja - das waren absichtlich werte von denen genau das rauskam.
-----
das ganze mal mit einem Vektor, bei dem nicht genau die Zahlen rauskommen
rx = 60 und ry = -110
60 / 1 = 60
-110 / -2 = 55
dann:
60 / 55 = 1,09090909090909090909
-110 / 60 = -1,83333333333333333333

Dann käme raus
1,09 != 1
-1,83 != 2
Aber wir sehen, die Ergebnise sind sich ähnlich! Ein wenig Toleranz muss man lassen (kein Benutzer kann schließlich eine genau gerade Linie zeichnen)


Ich wollt eigentlich nicht soviel schreiben, aber wenn einem gerade soviel einfällt...
Habt ihr eigene Ideen? Verbesserungsvorschläge? Vorschläge wie man alles realisieren könnt?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 22. Oktober 2008, 20:20

Damit ich es auch richtig verstehe: Du willst eine Anwendung mit einem eigenen Fenster, indem du mit der Maus bestimmte Figuren beschreibst (sollen die dort sichtbar sein?), die dazu führen, dass daraufhin bestimmte Aktionen ausgeführt werden, richtig?

Das Problem dabei dürfte vor allem das sein, was du am Ende mit "ein wenig Toleranz" beschreibst, denn im Grunde geht das, was du vor hast in Richtung OCR/Handschriftenerkennung.

Evtl. wird es etwas einfacher dadurch, dass man verlangt, dass nicht die Figur - in deinem Bsp. das "W" abgefahren wird (z.B. mit dauerhaft gedrückter Maustaste), sondern die Eckpunkte dieser Figur durch Mausklick markiert werden. Dann könntest du die Streckenlängen und die Winkel zwischen den einzelnen Teilstrecken ermitteln und unter Berücksichtigung einer gewissen Toleranz prüfen, ob ein bekanntes Muster dabei herausgekommen ist. Dann wäre man allerdings beschränkt auf solche Gesten, die als Streckenzüge darstellbar sind.

Auf einem Tkinter-Canvas z.B. sollte das gehen.
Ekud
User
Beiträge: 5
Registriert: Montag 20. Oktober 2008, 19:50

Mittwoch 22. Oktober 2008, 20:29

Fenster oder nicht, momentan geht es mir einfach um die theoretische Idee.
Die Figuren sollen nicht sichtbar sein.
Handschrifterkennung dürfte es ganz gut beschreiben, auch wenn es nicht so genau werden soll.

Die Idee mit dem Eckpunkte klicken klingt gut, danke.
DasIch
User
Beiträge: 2452
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 22. Oktober 2008, 21:26

Eventuell ist Gestikk einen Blick wert. Damit ist es möglicht mithilfe von Mausgesten Befehle auszuführen. Zwar nur für Linux wenn ich dass richtig sehe aber vielleicht lässt sich ja trotzdem was gebrauchen.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Donnerstag 23. Oktober 2008, 08:27

wxPython scheint das auch zu koennen: http://wiki.wxpython.org/AnotherTutoria ... 7154e3e1ef Hab's aber nicht ausprobiert.

EDIT: Dazu gibt's in der wxPython-Demo auch ein Beispiel. Funktioniert super! :D
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Ekud
User
Beiträge: 5
Registriert: Montag 20. Oktober 2008, 19:50

Freitag 24. Oktober 2008, 23:17

grml! Hät nicht gedacht, das es schon soviel gibt
Naja, werd trotzdem mal versuchen meine eigenes Modul für Mausgestik zu bauen, klingt ja auf die schnelle nicht sonderlich schwer, aber mal sehen :P
Antworten