Laden...

[Mathematik] Drehung im 2D-Raum

Erstellt von LatinChriz vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.723 Views
LatinChriz Themenstarter:in
211 Beiträge seit 2008
vor 14 Jahren
[Mathematik] Drehung im 2D-Raum

Hiho!

Folgendes Problem stellt sich mir gerade:
Ich habe eine liste von zusammengehörigen Vektoren.
Z.b:

5/11
6/11
7/11

nun möchte ich diese 3 Punkte im 2 dimensionalen Raum um 90° drehen
--> aus 3 liegenden Punkten 3 stehende machen.

Nun habe ich mir diesbzgl. bereits die Vektorrechnung bzw. die sogenannte "DrehMatrix" angeschaut.
(http://de.wikipedia.org/wiki/Drehmatrix)

Mithilfe von cos und sin, kann ich dies nun alles drehen, aber alles nur um den Ursprung. Ist ja vektoriell auch kein Problem, rechnen wir jede x/y-Koordinate auf den Ursprung und anschließend wieder retour.

Code:


foreach (Vector v in b.xy)
                                {
                                    int neux = v.x - b.center.x;
                                    int neuy = v.y - b.center.y;
                                    double alpha = Math.PI/2; //90°
                                    //Verschieben in den Ursprung!
                                    neux = (int)(neux*Math.Cos(alpha)-neux*Math.Sin(alpha));
                                    neuy = (int)(neuy*Math.Sin(alpha)-neuy*Math.Cos(alpha));
                                    
                                    //Cos(90) = 0
                                    //Sin(90) =1
                                    //Vereinfachung also möglich!
                                    neux = neux + b.center.x;
                                    neuy = neuy + b.center.y;

                                    v.x = neux;
                                    v.y = neuy;
                                }

Jedoch scheint dies nicht zu stimmen da meine Vektoren anschließend kreuz und quer im Raum liegen ?

Wo ist hier mein Denkfehler ?
b.center ist hierbei der "zentrierte" vektor UM den gedreht wird (6/11)

Kontakt & Blog: www.giesswein-apps.at

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo LatinChriz,

die Klasse Matrix hat fertige Methoden, um solche Drehungen zu berechnen.

herbivore

LatinChriz Themenstarter:in
211 Beiträge seit 2008
vor 14 Jahren

Gibts da keine andere Möglichkeit?

Kontakt & Blog: www.giesswein-apps.at

5.742 Beiträge seit 2007
vor 14 Jahren

Gibts da keine andere Möglichkeit?

Was willst du mehr?!?

LatinChriz Themenstarter:in
211 Beiträge seit 2008
vor 14 Jahren

Die einfache Mathematische Vorgehensweise?

Kontakt & Blog: www.giesswein-apps.at

U
1.688 Beiträge seit 2007
vor 14 Jahren

Hallo,

Jedoch scheint dies nicht zu stimmen

Deine Matrixmultiplikation ist falsch - wie's richtig ist, steht im von Dir zitierten Wikipedia-Artikel.

1.002 Beiträge seit 2007
vor 14 Jahren

Hallo LatinChriz,

der zweite Cosinus ist vorzeichenmäßig falsch ...

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

da du um Pi/2 mathematisch positiv drehst (90° gegen den Uhrzeigersinn) werden die Werte der Drehmatrix konstant und durch Multiplikation mit einem Einheitsvektor ergibt sich folgendes einfaches Schema:
1.Vertausche die x- und y- Komponente des Vektors 1.multipliziere die x-Komponente mit -1

Das wars.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

925 Beiträge seit 2004
vor 14 Jahren

Warum denn bloß so kompliziert? Herbi hat schon recht, es gibt doch die Matrix Klasse. Warum das Rad neu erfinden?


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Diagnostics;

namespace MatrixTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Point[] p = new Point[] { new Point(0, 11), new Point(0, 13), new Point(15, 0) }; // Deine Punkte (geht auch mit Vektoren)
            PointF o = new PointF(0.0F, 0.0F); // Rotationszentrum
            Matrix m = new Matrix(); // Deine Matrix
            m.RotateAt(90.0F, o); // ... als Rotationsmatrix um 90° um das Rotationszentrum o
            

            var tPoints = from pPoint in p // nicht beachten, weil...
                          select pPoint.ToString(); // ... ist für deine Rotation irrelevant, geht nur um die Anzeige auf der Konsole

            // erstmal die Punkte anzeigen
            Console.WriteLine("Points: {0}", String.Join("; ", tPoints.ToArray()));

            m.TransformPoints(p); // Einmal drehen
            Console.WriteLine("Points: {0}", String.Join("; ", tPoints.ToArray()));

            m.TransformPoints(p); // nochmal drehen
            Console.WriteLine("Points: {0}", String.Join("; ", tPoints.ToArray()));

            m.TransformPoints(p); // und nochmal drehen
            Console.WriteLine("Points: {0}", String.Join("; ", tPoints.ToArray()));

            m.TransformPoints(p); // und noch einmal drehen, womit wir wieder bei den Ursprungskoordinaten wären
            Console.WriteLine("Points: {0}", String.Join("; ", tPoints.ToArray()));

            Console.ReadKey();
        }
    }
}

Ganz ganz ganz einfach! Und sogar richtig.

6.911 Beiträge seit 2009
vor 14 Jahren

Warum denn bloß so kompliziert?

Könntest du auch gefragt werden. Siehe Vorpost.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

LatinChriz Themenstarter:in
211 Beiträge seit 2008
vor 14 Jahren

Hallo,

da du um Pi/2 mathematisch positiv drehst (90° gegen den Uhrzeigersinn) werden die Werte der Drehmatrix konstant und durch Multiplikation mit einem Einheitsvektor ergibt sich folgendes einfaches Schema:
1.Vertausche die x- und y- Komponente des Vektors 1.multipliziere die x-Komponente mit -1

Das wars.

mfG Gü

Stimmt natürlich vollkommen!
Sorryyy

int neux = v.x - b.center.x;
int neuy = v.y - b.center.y;
v.x = -neuy + b.center.x;
v.y = neux + b.center.y;

Das wars 😃

Kontakt & Blog: www.giesswein-apps.at

925 Beiträge seit 2004
vor 14 Jahren

Warum denn bloß so kompliziert?
Könntest du auch gefragt werden. Siehe Vorpost.

mfG Gü

Stimmt. Aber nur in diesem speziellen Fall.

6.911 Beiträge seit 2009
vor 14 Jahren

Nach diesem wurde ja gefragt.

Es gibt noch weitere spezielle Fälle:*Drehung um 0° -> alles bleibt gleich *Drehung um pi (180°) -> beide Komponenten mit -1 multiplizieren *Drehung um -pi/2 (90° im Uhrzeigersinn) -> vertauschen und y = y * (-1)

Nur der Vollständigkeit halber. 😁

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

925 Beiträge seit 2004
vor 14 Jahren

Aber... aber... och menno. Da hab ich doch in der Schule gerade Vektorrechnung gehabt und wollte mit meinem Wissen auftrumpfen. Gut, klappt auch nicht immer.

😁 😁 😁