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?

Co zrobiłem źle? A może źle zrozumiałem, jak należy obracać wektor?
Author: dcousens, 2011-01-24

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;
 65
Author: Caspar Kleijne,
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).

 71
Author: Sebastian Paaske Tørholm,
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
 17
Author: Altivo,
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!

 5
Author: xtofl,
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..

 5
Author: MSalters,
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