1. C++ / Говнокод #14261

    +13

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    if (axis[0] == vector[0] && axis[1] == vector[1] && axis[2] == vector[2])
       {
          this->anglex = 0.0f;
       }
       else if (vector[1] >= 0.0f)
       {
          this->anglex = 360.0f*(GLfloat)acos(VectorMathf::dotProductf(axis, vector))/(2.0f*PIf);
       }
       else
       {
          this->anglex = -360.0f*(GLfloat)acos(VectorMathf::dotProductf(axis, vector))/(2.0f*PIf);
       }

    Часть либы ES3D (http://sourceforge.net/projects/es3d/).
    Кто не понял в чем прикол - все переменные имеют тип float.

    Запостил: Pythoner, 23 Декабря 2013

    Комментарии (11) RSS

    • Раз в год и незаряженное ружжо стреляет флоаты совпадают.
      Ответить
      • Говорят, под Новый год, что ни пожелается, всё всегда произойдёт, всё всегда сбывается.
        Ответить
    • Говно-то не в этом. Если флоаты немного не совпадут, вычисление произойдет через acos и ответ будет правильным - какой-то очень маленький угол. Первая ветка похожа на оптимизацию вырожденного случая, чтобы acos не дергать.

      Вот то, что они про atan2 забыли - это говно, ага.
      Ответить
      • А это они для единообразия, потому что для каждого модуля с плавающей запятой есть дубль с фиксированной, в котором используется самописная функция acosx. Пусть безобразно, зато однообразно.

        Говно ещё в том, что они поленились написать atan2x. Да, у них и asinx нет, всё через арккосинус.
        Ответить
      • >Если флоаты немного не совпадут, вычисление произойдет через acos и ответ будет правильным - какой-то очень маленький угол.
        Все равно гавно, причем уровня лаб.
        Ответить
    • По мне, так эта часть кода может быть записана в 2 строки:
      this->anglex = -360.0f* (GLfloat)acos (VectorMathf::dotProductf(axis, vector))/(2.0f*PIf);
      if (vector[1] < 0.0f) this->anglex = -this->anglex;
      Ответить
      • с тернарником - даже в одну

        а вообще вычисление угла должно быть отдельно от присвоения.
        Ответить
        • На самом деле я чайник в программировании - ВУЗов по этой теме не оканчивал, это не моя профессия. Так, хобби, изучал понемногу сам. Поэтому не постесняюсь спросить - а почему должно быть отдельно?
          Ответить
          • > ВУЗов по этой теме не оканчивал
            Не факт, что дипломированные программисты умеют программировать.

            >> вычисление угла должно быть отдельно от присвоения.
            Напоминает эталонную реализацию инкапсуляции - оператор + в HQ9+.
            Если хоть кто-то узнал значение угла, то это уже не инкапсуляция, мы написали говнокод.
            Ответить
          • я имел в виду то, что вычисление угла должно быть не фиг пойти в каком обьекте а в отдельном модуле по работе с векторами. что то типа

            this.angle = MathCore.GetAngle(axis, vector);
            Ответить

    Добавить комментарий