Autor Beitrag
kletzi
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 06.05.10 17:06 
Hallo Programmierer,

Ich versuche eine Kalibrierung für die WiiMote zu schreiben, die folgendes bewirken soll nämlich, dass eine WiiMote über einem A4 Blatt plaziert wird. Dieses A4 Blatt ist innerhalb des Bereiches der Infrarotkamera. Als nächstes speichere ich die 4 Eckpunkte des A4 Blattes indem ich mit einem LED stift bei den 4 Ecken ein Signal zur WiiMote sende. Somit erhalte ich meine Werte für die 4 Eckpunkte und weiß dadurch wo sich das Blatt innerhalb des Sichtfeldes der WiiMote befindet.

Nun möchte ich, dass wenn ich mich innerhalb dieses A4-Blatt Bereichs befinde, dies in der Form gezeichnet wird, aber an der richtigen Stelle. Klingt ja nicht schwer, aber sobald das Blatt schief liegt habe ich Probleme. Ich habe schon probiert über die HNF Formel die Position im Blatt zu berechnen, aber ich schaffe es nicht. Es ist für mich einfach zu komplex. Ich habe ein paar Screenshots angehängt um sich das ein Bisschen vorstellen zu können ...

Kann mir jemand helfen bzw. Tipps geben? DANKESCHÖN!
Einloggen, um Attachments anzusehen!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 06.05.10 17:28 
Was meinst mit HNF-Formel?

Zur Bestimmung der Position könntest Du aber mit Matrizzen rechnen: Anhand der 4 Eckpunkte 4 Gleichungen für die Matrix-Koeffizienten aufstellen und dann danach auflösen. Über das Inverse bekommst Du die Rücktransformation.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 06.05.10 17:42 
Ich würde mal so vorgehen:

Blatt.X/Blatt.Y ist die Position, wo das Blatt liegt (LinksOben die Ecke)
Seien u,v die Vektoren, die das Blatt aufspannen

Ursprung vom Blatt: Blatt.X/Blatt.Y
Eine Einheit aufm Blatt: u.X=(BlattRechtsOben.X-Blatt.X)/30;
Eine Einheit aufm Blatt: u.Y=(BlattRechtsOben.Y-Blatt.Y)/30;
(im Beispiel hat das Ballt 30 Einheiten nach rechts und 20 nach unten)
Eine Einheit aufm Blatt: v.X=(BlattRechtsLinksUnten.X-Blatt.X)/20;
Eine Einheit aufm Blatt: v.Y=(BlattRechtsLinksUnten.Y-Blatt.Y)/20;
Den Punkt RechtsUnten brauchst du ja eigentlich garnicht, solange das Blatt nicht 3-dimensional verzogen ist.

Jetzt kriegst du z.B. ne Position gemeldet (Pos)
Davon ziehst du erstmal den Ursprung (Blatt.X/Blatt.Y) ab.
Bleibt noch:

a*u+b*v = Pos

a und b wären dann die Koordinaten...*grübel*
Umgestellt:
0 + b*v = Pos - a*u

Das ist einfach der Schnittpunkt einer Geraden mit einer andren. 2 Gleichungen, 2 unbekannte, fertig.

(Da sind sicher noch Denkfehler drin, wie immer wenn ich was mathematisches fürs Programmieren brauche, aber der Denkansatz ist vermutlich nicht ganz verkehrt ;) )

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
kletzi Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 06.05.10 17:45 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Was meinst mit HNF-Formel?


Hessesche Normalform, das die Länger einer Gerade berechnet die Normal darauf steht oder so ... aber das ging über die Vektorrechnung ...

Matrizen usw. ist für mich noch eine unbekannte Sache ...

@Xion: Ich werde mir das mal durchdenken was du da geschrieben hast. Mit 30 & 20 nimmst du die Länge des A4 Blattes in cm?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 06.05.10 17:50 
user profile iconkletzi hat folgendes geschrieben Zum zitierten Posting springen:

@Xion: Ich werde mir das mal durchdenken was du da geschrieben hast. Mit 30 & 20 nimmst du die Länge des A4 Blattes in cm?


Das ist sozusagen die Auflösung des Blattes...Du kannst auch ganz ohne diese Werte arbeiten, dann hast du halt Prozente...vielleicht garnicht mal so ne schelchte Idee.

Dann kriegst du raus z. B.

0.5*u + 0.5*v = Pos, was soviel heißt dass du in der Mitte des Blattes bist...das lässt sich leichter auf deine Form übertragen.

So wie ich es gespostet habe wäre 15*u+10*v die Mitte des Blattes.

//nochmal anders ausgedrückt:
In meinem Beispiel teile ich die eine Kante in 30 Teile auf, die andre in 20. Ist natürlich Quatsch, denn wenn das Blatt um 90° gedreht wäre, dann würde ich die kurze Seite durch mehr teilen als die Lange...ok, das macht nix...aber am besten ganz weglassen ^^

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
kletzi Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 06.05.10 18:06 
Also ich habe dir die Skizze nochmals angehängt habe ich das mit den 3 Punkten jetzten mal verstanden? Ich hab die Punkte eingezeichnet ... Was nun? Du hast gemeint jetzt einheiten egal und dann gibts auf einmal Pos usw. ... *verwirrt*
Einloggen, um Attachments anzusehen!
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 06.05.10 18:26 
Die eingezeichneten Punkte hast du? Die liest du ja per LED-Stift stand oben.

Dann berechnest du die Vektoren, die das Blatt aufspannen:

u.X=(BlattRechtsOben.X-Blatt.X);
u.Y=(BlattRechtsOben.Y-Blatt.Y);
v.X=(BlattRechtsLinksUnten.X-Blatt.X);
v.Y=(BlattRechtsLinksUnten.Y-Blatt.Y);

So.

Pos kriegst du ja wieder durch den Sensor:

user profile iconkletzi hat folgendes geschrieben Zum zitierten Posting springen:
Nun möchte ich, dass wenn ich mich innerhalb dieses A4-Blatt Bereichs befinde, dies in der Form gezeichnet wird, aber an der richtigen Stelle.


Und dann musst du Pos eben umrechnen.

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
a*u+b*v = Pos

Du hast die Vektoren des Blattes (u und v) und willst nun wissen, wie weit du in u und v Richtung gehen musst um nach Pos zu kommen.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
kletzi Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 06.05.10 18:30 
jetzt hab ichs verstanden ... jaja alles richtig mit dem Pos usw. ok ... ich werd mich sofort hinsetzen und implementieren ^^" wenn ich Fragen hab probier ichs weiterhin in dem Thread hier ... Ich danke dir schon einmal sehr und versuche mein Bestes ...
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 06.05.10 20:06 
Washier noch nicht ganz beachtet ist, ist die Tatsache, dass durch die 4 Punkte nicht zwingend ein Rechteck aufgespannt wird. Genausogut kann es ein Trapez oder Rhombus sein. Daher die Geschichte mit den 4 Gleichungen:

Sei v unser Vector auf dem Blatt, sowie M die Transformationsmatrix, die eine Abbildung f:R³-->R³ eines Punktes P vom Koordinatensystem des Blattes auf dein Messkoordinatensystem abbildet, dann muss für v' = f(v) = v*M gelten:

ausblenden Quelltext
1:
2:
3:
4:
f({0,0}) = P1
f({0,1}) = P2
f({1,0}) = P3
f({1,1}) = P4


Daraus ergeben sich für M jetzt eine Reihe von Gleichungen. Die ausrechnen und M invertieren. Daraus ergibt sich dann M' = M^-1, sowie deine gesuchte Abbildung f'(v') = v ;-)

Edit: Definitionsbereich von f und f' geändert; Verzerrung ist in R² nicht linear ausführbar.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
kletzi Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 06.05.10 20:14 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Washier noch nicht ganz beachtet ist, ist die Tatsache, dass durch die 4 Punkte nicht zwingend ein Rechteck aufgespannt wird. Genausogut kann es ein Trapez oder Rhombus sein. Daher die Geschichte mit den 4 Gleichungen:

Sei v unser Vector auf dem Blatt, sowie M die Transformationsmatrix, die eine Abbildung f:R³-->R³ eines Punktes P vom Koordinatensystem des Blattes auf dein Messkoordinatensystem abbildet, dann muss für v' = f(v) = v*M gelten:

ausblenden Quelltext
1:
2:
3:
4:
f({0,0}) = P1
f({0,1}) = P2
f({1,0}) = P3
f({1,1}) = P4


Daraus ergeben sich für M jetzt eine Reihe von Gleichungen. Die ausrechnen und M invertieren. Daraus ergibt sich dann M' = M^-1, sowie deine gesuchte Abbildung f'(v') = v ;-)

Edit: Definitionsbereich von f und f' geändert; Verzerrung ist in R² nicht linear ausführbar.


Das mit dem Rechteck ist richtig nur versteh ich überhaupt nichts von dem was du da gerade geschrieben hast ._____.
Ich hab einfach keine Erfahrung mit Matrizen usw. aber ich würde es gerne durch euch erlernen, da ich es unbedingt benötige im Programm ...
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 06.05.10 20:21 
Ich muss ehrlich zugeben...wir haben so Zeug die Tage in Mathe in der Uni gemacht (Thema ist abgeschlossen). Allerdings nur soweit, dass man die Rechnung von oben auch per Matrizen machen kann. Wie das aber mit dem Trapez dann gehen soll, ist mir ein Rätsel...das mit den Matrizen muss ich mir eh nochmal angucken, ist mir irgendwie suspekt. Aber Trapez geht mit unsren Mittel nicht...

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
kletzi Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 06.05.10 20:26 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Ich muss ehrlich zugeben...wir haben so Zeug die Tage in Mathe in der Uni gemacht (Thema ist abgeschlossen). Allerdings nur soweit, dass man die Rechnung von oben auch per Matrizen machen kann. Wie das aber mit dem Trapez dann gehen soll, ist mir ein Rätsel...das mit den Matrizen muss ich mir eh nochmal angucken, ist mir irgendwie suspekt. Aber Trapez geht mit unsren Mittel nicht...


Ich denk nämlich auch, dass es eher ein Glückstreffer ist wenn man ein Rechteck zusammenbringt, eher ergiebt sich ein Trapez. Es ist einfach kompliziert ... ><
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Fr 07.05.10 00:10 
Also ich würde das Ganze etwas anders angehen:

Du hast die 4 Eckpunkte deines Trapez ( A,B,C,D )
Aufbau der Kanten als Vektoren( also AB, BC, CD, DA )

Jetzt zeigst du mit der Wiimote auf Punkt Z

Aufbau der Vektoren zu Punkt Z ( AZ, BZ, CZ, DZ )

jetzt kannst du rechwinkelige Dreiecke bilden.

Bsp:
ausblenden Quelltext
1:
2:
3:
4:
5:
A ---------- B
 \   |
  \  |
   \ |
    Z


Den Winkel bei A hast du durch die 2 Vektoren, über die Kante von AB nach Z hast du dann dank den Winkelfunktionen die Y Koordinate vom Blatt aus gesehen

Das Gleiche machst du mit AD um die X Koordinate zu bekommen.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 07.05.10 07:45 
hmmm, dann muss hier wohl kurz jemand Nachsitzen zum Thema Matrizzen.

Die Aussagen aus den beiden Tuts gelten ähnlich auch für 2D (nur halt mit etwas kleineren Matrizzen).

HTH.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.