Как сделать вращение в R ^ 2? - PullRequest
4 голосов
/ 19 августа 2010

Я застрял с кажущейся простой задачей в математике: мне нужно повернуть точки в двумерной декартовой системе координат, т.е. у меня есть точка, заданная (x / y), и угловая гамма, и мне нужно координаты этой точки при вращении гамма ...

пример: если x = 2 и y = 0, а угол поворота составляет 90 °, результирующая точка будет иметь вид x '= 0, y' = -2 (повернут по часовой стрелке)

поэтому я нашел эту формулу в сети (http://en.wikipedia.org/wiki/Rotation_matrix) и реализовал некоторый код для ее проверки:

$x = 1; echo "x: " . $x . "<br>";
$y = 1; echo "y: " . $y . "<br>";
$gamma = 45; echo "gamma: " . $gamma . "<br>";

$sinGamma = sin(deg2rad($gamma));
$cosGamma = cos(deg2rad($gamma));

$x2 = $x*$cosGamma - $y*$sinGamma; echo "x2: " . $x2 . "<br>";
$y2 = $y*$cosGamma + $x*$sinGamma; echo "y2: " . $y2 . "<br>";

хотя это работает просто БОЛЬШОЕ для углов 90/180/270 градусов, все остальное приведет к полному дерьму!

т.е:.

если x = 1 и y = 1 и гамма = 45 °, результирующая точка будет лежать точно на оси x ... хорошо - приведенный выше сценарий выведет:

x: 1
y: 1
gamma: 45
x2: 1.11022302463E-16
y2: 1.41421356237

я что-то не так понял? (школа для меня давно закончилась ^^) как я могу сделать это правильно?

Ответы [ 2 ]

4 голосов
/ 19 августа 2010

Ваши числа на самом деле выглядят довольно точно - (1,1) поворот на 45 градусов вокруг начала координат будет (0, sqrt (2)).x2 выглядит странно из-за 1 впереди, но E-16 означает, что число на самом деле .000000000000000111022 или что-то в этом роде.И sqrt (2) выходит где-то на 1,414.

Вы не получите точных результатов из-за ошибки округления с плавающей точкой (не говоря уже о том, что вы работаете с иррациональными числами).

1 голос
/ 19 августа 2010

Ваш код правильный. Тот факт, что ваш пример не заканчивается точно на оси y, объясняется только неточным вычислением с плавающей запятой, которого вы все равно не сможете избежать, если хотите повернуть точки с действительными координатами. 1003 *

...