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

    вот, что я пытался сказать. я написал вот так:

    template <class T>
    void CxVertex<T>::RotateX(double Angle)
    {
    T COS = cos(Angle);
    T SIN  = sin(Angle);
    T Y, Z;

     Y  = y * COS - z * SIN;
     Z  = y * SIN + z * COS;
     y  = Y;
     z  = Z;
    }

    а если написать вот так:

    template <class T>
    void CxVertex<T>::RotateX(double Angle)
    {
    CxMatrix <T> M(4,4);
    M.Fill(T(0));
    M.At(0,0) = 1;
    M.At(1,1) = cos(Angle);
    M.At(2,2) = M.At(1,1);
    M.At(1,2) = -sin(Angle);
    M.At(2,1) = -M.At(1,2);
    v = M*v;
    }

    то при v = M*v; будет происходить вот, что:

    template <class T>
    CxMatrix<T>& CxMatrix<T>::operator *= (CxMatrix &m)
    {
    u_int i,j,k,Ni = GetNumRows(),Nj = GetNumColumns();
    if(m.GetNumRows() != Nj)
     throw INVALID_MATRIX_SIZES;
    CxMatrix mRet(Ni,m.GetNumColumns());
    T tFillValue = T(0);
    mRet.Fill(tFillValue);
    for(i = 0; i < Ni; i++)
     for(j = 0; j < m.GetNumColumns(); j++)
      for(k = 0; k < Nj; k++)
      mRet.At(i,j) += At(i,k)*m.At(k,j);
    *this = mRet;
    return  *this;
    }

    что есть не так круто, как первое. не знаю, вообще, как эти матрицы вообще используются здесь, если они столько ресурсов жрут.

      Матрицы используются 4x4 (кстати, ето Cyrix придумал, а не Intel), и размеры операционных векторов у SIMD-инструкций, как вы уже догадываетесь, тоже 4 эл-та, типа float или fixed 16.16 smile.gif

      Итого умножение матрицы 4x4 на вектор 4 занимает 12 векторных операций -- 4 х загрузка, умножение, суммирование елементов. Как правило ето быстрее, чем работа по "оптимизированным" формулам, где поток операндов _меньше_, но _не_регулярен_ и параллельных операций нет...

        Цитата (Serg-Zerg @ 21.11.03, 13:09)
        Спасибо всем учасникам, лабу здал, вот только МОЯ ф-ия проекции преподу не понравилась как правильно считать эту const C?

        Например так:
        C = 360*Resx/(2*PI*angle)

        angle - угол поля зрения в градусах, Resx - разрешение окна по х, PI = 3.1415926535

        Добавлено в
        Цитата (experimenter @ 21.11.03, 07:18)
        Цитата (wormball @ 21.11.03, 09:08)
        не понял я тебя..... чойто за код ты понаписал??

        ну, вот как поворачивается точка на плоскости

        x = x cos ф - y sin ф,
        y = x sin  ф+ y cos ф.

        а при записи того же в матричном представлении, да еще в однородных координатах, как это любят делать, будет куча умножения на ноль, которую не понятно зачем делать.

        Обычно поворот состоит из 3-х поворотов вокруг 3-х осей. По твоему способу придется каждую точку повернуть 3 раза. Используя матрицу - 1 раз. Если к этому прибавить перемещение, то у тебя будут 4 действия (3 поворота + перемещение); используя матрицу - 1 действие.
          Цитата (TrivialCore @ 21.11.03, 19:44)
          Цитата (Serg-Zerg @ 21.11.03, 13:09)
          Спасибо всем учасникам, лабу здал, вот только МОЯ ф-ия проекции преподу не понравилась как правильно считать эту const C?

          Например так:
          C = 360*Resx/(2*PI*angle)

          angle - угол поля зрения в градусах, Resx - разрешение окна по х, PI = 3.1415926535

          Добавлено в
          Цитата (experimenter @ 21.11.03, 07:18)
          Цитата (wormball @ 21.11.03, 09:08)
          не понял я тебя..... чойто за код ты понаписал??

          ну, вот как поворачивается точка на плоскости

          x = x cos ф - y sin ф,
          y = x sin  ф+ y cos ф.

          а при записи того же в матричном представлении, да еще в однородных координатах, как это любят делать, будет куча умножения на ноль, которую не понятно зачем делать.

          Обычно поворот состоит из 3-х поворотов вокруг 3-х осей. По твоему способу придется каждую точку повернуть 3 раза. Используя матрицу - 1 раз. Если к этому прибавить перемещение, то у тебя будут 4 действия (3 поворота + перемещение); используя матрицу - 1 действие.

          ну, с этой точки зрения, я согласен. наверное, действительно, эффект дает о себе знать, при большом количестве поворотов и все такого. хм, да действительно. спасибо за подсказанную идейку. biggrin.gif
            Цитата
            ну так на ноль можно не умножать, если не хочешь, зато у тебя куча синусов. и с помощью матриц можно поворачивать не только в плоскости ху, и можно несколько поворотов представлять как один. 

            Цитата
            Обычно поворот состоит из 3-х поворотов вокруг 3-х осей. По твоему способу придется каждую точку повернуть 3 раза. Используя матрицу - 1 раз. Если к этому прибавить перемещение, то у тебя будут 4 действия (3 поворота + перемещение); используя матрицу - 1 действие.

            именно ето я и хотел сказать
            Цитата
            вот, что я пытался сказать. я написал вот так:



            template <class T>
            void CxVertex<T>::RotateX(double Angle)
            {
            T COS = cos(Angle);
            T SIN  = sin(Angle);
            T Y, Z;

            Y  = y * COS - z * SIN;
            Z  = y * SIN + z * COS;
            y  = Y;
            z  = Z;
            }



            а если написать вот так:



            template <class T>
            void CxVertex<T>::RotateX(double Angle)
            {
            CxMatrix <T> M(4,4);
            M.Fill(T(0));
            M.At(0,0) = 1;
            M.At(1,1) = cos(Angle);
            M.At(2,2) = M.At(1,1);
            M.At(1,2) = -sin(Angle);
            M.At(2,1) = -M.At(1,2);
            v = M*v;
            }



            то при v = M*v; будет происходить вот, что:



            template <class T>
            CxMatrix<T>& CxMatrix<T>::operator *= (CxMatrix &m)
            {
            u_int i,j,k,Ni = GetNumRows(),Nj = GetNumColumns();
            if(m.GetNumRows() != Nj)
            throw INVALID_MATRIX_SIZES;
            CxMatrix mRet(Ni,m.GetNumColumns());
            T tFillValue = T(0);
            mRet.Fill(tFillValue);
            for(i = 0; i < Ni; i++)
            for(j = 0; j < m.GetNumColumns(); j++)
              for(k = 0; k < Nj; k++)
              mRet.At(i,j) += At(i,k)*m.At(k,j);
            *this = mRet;
            return  *this;
            }



            что есть не так круто, как первое. не знаю, вообще, как эти матрицы вообще используются здесь, если они столько ресурсов жрут.

            а ето я вобще не понял. я в етих с++ных заморочках ничо не понимаю, наверное у тебя тормозит не изза матриц, а именно изза них
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0.0652 ]   [ 14 queries used ]   [ Generated: 24.10.26, 06:44 GMT ]