Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.128.199.210] |
|
Сообщ.
#1
,
|
|
|
Как повернуть точку вокруг произольной оси
|
Сообщ.
#2
,
|
|
|
зачем тебе??
|
Сообщ.
#3
,
|
|
|
находишь угол относительно перпендикулярной оси и крутишь за счет увеличения (уменьшения) угла...
|
Сообщ.
#4
,
|
|
|
хехе, как все просто, когда на словах...
на gamedev.ru написано. |
Сообщ.
#5
,
|
|
|
Поворот точки вокруг произвольной оси описывается углами Эйлера
to Black_Star А Вы пробовали реализовывать subj? |
Сообщ.
#6
,
|
|
|
Цитата PAV, 22.09.03, 16:01:28 to Black_Star А Вы пробовали реализовывать subj? точнее пробовали ли написать 3d action?? ;D ;D |
Сообщ.
#7
,
|
|
|
А что сложного в переходе к полярным координатам и обратно. Есть конечно разные точки, где tg = бесконечность. Да еще точка (0, 0) -- особенная. Но Если важна скорость, то пожертвовав точностью можно сделать так:
0. Создать таблицу (X,Y) -> УГОЛ 1. Нормализовать длинну вектора до большого целого значения, до 10000 например. 2. Найти в таблице ближайший угол соответствующий нормализованным X и Y (здесь, если хочется, можно воспользоваться линейной интерполяцией) 3. Прибавить к углу нужную величину 4. Найти (X,Y) соответствующие полученному углу 5. Умножить X и Y на коэффициэнты нормализации. -- Муторно, но должно быть заметно быстрее чем традиционный способ. (-) -- нужна таблица УГОЛ -- (X,Y). Многое будет зависить от алгоритма поиска значения в массиве. |
Сообщ.
#8
,
|
|
|
Цитата WinterMute, 22.09.03, 19:22:49 -- Муторно, но должно быть заметно быстрее чем традиционный способ. сначала изучи традиционный способ, а потом говори. а он заключается в построении матрицы поворота и умножении на неё всех векторов (заметь, в декартовых координатах). |
Сообщ.
#9
,
|
|
|
А как строится матрица поворота? Разве при её построении SIN/COS не используется?
|
Сообщ.
#10
,
|
|
|
Да мне быстро не надо
|
Сообщ.
#11
,
|
|
|
Цитата WinterMute, 23.09.03, 00:40:04 А как строится матрица поворота? Разве при её построении SIN/COS не используется? используется! как ты догадался?? ;D но используется только один раз. далее, если у тебя напр 1000 векторов, ты их просто умножаешь на матрицу без извлечения синусов и косинусов. |
Сообщ.
#12
,
|
|
|
(CenterX, CenterY) - точка, вокруг которой вращаем
SinAngle, CosAngle - заранее вычисленные синус и косинус угла поворота xnew=CenterX+(x-CenterX)*CosAngle-(y-CenterY)*SinAngle; ynew=CenterY+(x-CenterX)*SinAngle+(y-CenterY)*CosAngle; Код выполняет несколько другую операцию - пиксел [x,y] переносит в [xnew, ynew] Поэтому если вращение будет не в ту сторону, поменяй знак у SinAngle 3d... Сейчас, посмотрю, где-то в тетрадке Поворот вокруг оси, проходящей через начало координат Грубо говоря, разлагаем поворот на угол на поворот вокруг осей X, Y и Z Итак A - матрица поворота вокруг оси X B - матрица поворота вокруг оси Y C - матрица поворота вокруг оси Z Rnew=A*B*C*R=D*R D - некая матрица |1 0 0 | A=|0 cos fi sin fi| |0 -sin fi cos fi| |cos teta 0 -sin teta| B=|0 1 0 | |sin teta 0 cos teta| |cos dzeta sin dzeta 0| C=|-sin dzeta cos dzeta 0| | 0 0 1| Энтузиастам просьба перемножить матрицы. Ребята, которые уже засветились в этой теме, you are welcome! |
Сообщ.
#13
,
|
|
|
ну так множить можно уже по ходу
только надо помнить, что операция перемножения матриц некоммутативна ;D |