Rotacje wektorów euklidesowych 2D
Mam wektor euklidesowy a
siedzący na współrzędnych (0, 1)
.
Chcę obrócić a
o 90 stopni (zgodnie z ruchem wskazówek zegara) wokół źródła: (0, 0)
.
Jeśli dobrze rozumiem, jak to powinno działać, wynikowe współrzędne (x, y) po rotacji powinny być (1, 0)
.
Gdybym zamiast tego obrócił go o 45 stopni (nadal zgodnie z ruchem wskazówek zegara), oczekiwałbym, że wynikowe współrzędne będą (0.707, 0.707)
.
theta = deg2rad(angle);
cs = cos(theta);
sn = sin(theta);
x = x * cs - y * sn;
y = x * sn + y * cs;
Używając powyższego kodu, o wartości angle
90.0 stopni, współrzędne wynikowe to: (-1, 1)
.
I jestem cholernie zdezorientowana.
Przykłady widoczne w poniższych linkach reprezentują ten sam wzór pokazany powyżej na pewno?
5 answers
Należy usunąć vars z funkcji:
x = x * cs - y * sn; // now x is something different than original vector x
y = x * sn + y * cs;
Tworzenie nowych współrzędnych staje się, aby uniknąć obliczania x przed osiągnięciem drugiej linii:
px = x * cs - y * sn;
py = x * sn + y * cs;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-24 09:02:50
Obrócenie wektora o 90 stopni jest wyjątkowo proste.
(x, y)
obrócony o 90 stopni wokół (0, 0)
jest (-y, x)
.
Jeśli chcesz obrócić zgodnie z ruchem wskazówek zegara, po prostu rób to na odwrót, uzyskując (y, -x)
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-24 08:56:10
Obrót o 90 stopni wokół 0,0:
x' = -y
y' = x
Obrót o 90 stopni wokół px,py:
x' = -(y - py) + px
y' = (x - px) + py
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-19 10:38:35
Obliczasz część y nowej współrzędnej na podstawie "nowej" części x nowej współrzędnej. Zasadniczo oznacza to obliczanie nowego wyjścia w kategoriach nowego wyjścia...
Spróbuj przepisać pod względem wejścia i wyjścia:
vector2<double> multiply( vector2<double> input, double cs, double sn ) {
vector2<double> result;
result.x = input.x * cs - input.y * sn;
result.y = input.x * sn + input.y * cs;
return result;
}
Wtedy możesz to zrobić:
vector2<double> input(0,1);
vector2<double> transformed = multiply( input, cs, sn );
Zauważ, jak wybranie nazw własnych dla zmiennych może uniknąć tego problemu alltogether!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-24 08:58:46
Brzmi łatwiej z klasami standardowymi:
std::complex<double> vecA(0,1);
std::complex<double> i(0,1); // 90 degrees
std::complex<double> r45(sqrt(2.0),sqrt(2.0));
vecA *= i;
vecA *= r45;
Rotacja wektora jest podzbiorem mnożenia złożonego..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-24 09:48:36