Autor Beitrag
Max064
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Mo 26.07.10 15:15 
Hi,

ich füge ein Image in eine Graphics ein und drehe sie mit rotateat und einer Matrix. Nun möchte ich das Image verschieben. Dafür berechne ich die delta.X und delta.Y Position durch Verschieben der Maus und addiere sie zu der alten _rect.Location.

Die Rotation wird jedoch zeitlich IMMER später als der move ausgeführt. Wenn ich nun also das Objekt nur in x-Richtung bewege, bewegt sich das Image logischerweise auch nach oben mit. Dadurch wird es nahezu unmöglich eine gezielte Bewegung auszuführen.

Ich muss also mein "Bewegungsdelta" richtig berechnen, damit die _rect.Location "richtig" verschoben wird. Nur wie???

Zu einer Rotationsmatrix und der Berechnung des x' und y' habe ich was in meinem C# Buch gefunden, dessen Eintrag (nach Abgleich mit dem englischen Wikipedia) falsch ist. Stimmen müsste:
x'=x*cos(a) -y*sin(a)
y'=x*sin(a) +y*cos(a)

Doch ich glaube, dass durch einen Move mein Winkel nicht konstant bleibt?! Wie berechne ich dann aber mein "Bewegungsdelta"?

lg Marcel
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 26.07.10 19:33 
Mit einer Rotations- und Translationsmatrix brauchst du sicher keinen Sinus mehr. Zeig uns doch bitte mal, wie du die Matrizen bisher auf das Image anwendest.

_________________
>λ=
Max064 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Di 27.07.10 07:30 
Hi,

die Matrix wende ich letztendlich auf die Graphics an:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public override void Draw(Graphics g)
{
            GraphicsContainer containerState = g.BeginContainer();
            g.Transform = _mat;            
            g.DrawImage(_Image, _rect);
            g.EndContainer(containerState);
}


Das heißt, dass bei jedem Neuzeichnen das Bild gedreht wird. Das Bewegen des Objektes passiert (ohne das man es sieht) im ungedrehten Zustand des Image. Wenn ich nun also eine Translation in x-Richtung durchführe, wird durch die Drehung danach auch eine unbeabsichtigte Translation in y-Richtung durchgeführt. Genau diese Bewegung möchte ich letztenlich herausrechnen!

lg Max
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Di 27.07.10 09:32 
Es wäre vielleicht besser, wenn du den gesamten Code postest, mit dem du alle Bewegungen/Transformation ausführst. Deine Problembeschreibung ist doch sehr schwammig.

Wieso führt eine Drehung zu einer Bewegung in y-Richtung? Das dürfte nur passieren, wenn der Drehpunkt falsch gewählt ist. Dann hast du eine Nutatationsbewegung.
Max064 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Mi 28.07.10 07:51 
Hey,

vielen Dank für die Hilfe, aber ich habe es mittlerweile selber gelöst!

@norman: Nicht die Drehung verursach eine Bewegung in y-Richtung, sondern der nachträgliche Move Befehl.

Ich transformiere den Punkt _rect.Location mit der Drehmatrix. Danach verschiebe ich den Punkt um die Verschiebungsparamter (also den Move um deltaX und deltaY). Und dann transformiere ich zurück. Dann gehts ;-)

lg Max
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 28.07.10 13:00 
Wie heißt es doch so schön: Warum einfach, wenn's auch kompliziert geht ;) ...

_________________
>λ=