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
Hallo LatinChriz,
die Klasse Matrix hat fertige Methoden, um solche Drehungen zu berechnen.
herbivore
Gibts da keine andere Möglichkeit?
Kontakt & Blog: www.giesswein-apps.at
Gibts da keine andere Möglichkeit?
Was willst du mehr?!?
Die einfache Mathematische Vorgehensweise?
Kontakt & Blog: www.giesswein-apps.at
Hallo,
Jedoch scheint dies nicht zu stimmen
Deine Matrixmultiplikation ist falsch - wie's richtig ist, steht im von Dir zitierten Wikipedia-Artikel.
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
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!"
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.
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!"
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
Warum denn bloß so kompliziert?
Könntest du auch gefragt werden. Siehe Vorpost.mfG Gü
Stimmt. Aber nur in diesem speziellen Fall.
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!"
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.
😁 😁 😁