На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Поворот
    Как повернуть точку вокруг произольной оси
      зачем тебе??
        находишь угол относительно перпендикулярной оси и крутишь за счет увеличения (уменьшения) угла...
          хехе, как все просто, когда на словах...
          на gamedev.ru написано.
            Поворот точки вокруг произвольной оси описывается углами Эйлера

            to Black_Star
            А Вы пробовали реализовывать subj?
              Цитата PAV, 22.09.03, 16:01:28
              to Black_Star
              А Вы пробовали реализовывать subj?


              точнее пробовали ли написать 3d action?? ;D ;D
                А что сложного в переходе к полярным координатам и обратно. Есть конечно разные точки, где tg = бесконечность. Да еще точка (0, 0) -- особенная. Но Если важна скорость, то пожертвовав точностью можно сделать так:

                0. Создать таблицу (X,Y) -> УГОЛ
                1. Нормализовать длинну вектора до большого целого значения, до 10000 например.
                2. Найти в таблице ближайший угол соответствующий нормализованным X и Y (здесь, если хочется, можно воспользоваться линейной интерполяцией)
                3. Прибавить к углу нужную величину
                4. Найти (X,Y) соответствующие полученному углу
                5. Умножить X и Y на коэффициэнты нормализации.

                -- Муторно, но должно быть заметно быстрее чем традиционный способ. (-) -- нужна таблица УГОЛ -- (X,Y). Многое будет зависить от алгоритма поиска значения в массиве.
                  Цитата WinterMute, 22.09.03, 19:22:49
                  -- Муторно, но должно быть заметно быстрее чем традиционный способ.

                  сначала изучи традиционный способ, а потом говори. а он заключается в построении матрицы поворота и умножении на неё всех векторов (заметь, в декартовых координатах).
                    А как строится матрица поворота? Разве при её построении SIN/COS не используется?
                      Да мне быстро не надо
                        Цитата WinterMute, 23.09.03, 00:40:04
                        А как строится матрица поворота? Разве при её построении SIN/COS не используется?

                        используется! как ты догадался?? ;D
                        но используется только один раз. далее, если у тебя напр 1000 векторов, ты их просто умножаешь на матрицу без извлечения синусов и косинусов.
                          (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!
                          Сообщение отредактировано: Fire_Hawk -
                            ну так множить можно уже по ходу

                            только надо помнить, что операция перемножения матриц некоммутативна ;D
                            Сообщение отредактировано: wormball -
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0290 ]   [ 15 queries used ]   [ Generated: 26.04.24, 20:17 GMT ]