Кресты / Говнокод #13942 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
if(ortho){
            if( abs(e->x() - line.p1().x() ) * 2 < abs( e->y() - line.p1().y() ) ){
                y = e->y();
                x = line.p1().x();
            }else if(abs(e->x() - line.p1().x() ) > 2 * abs( e->y() - line.p1().y() )){
                x = e->x();
                y = line.p1().y();
            }else if(abs(e->x() - line.p1().x() ) * 2 > abs( e->y() - line.p1().y() ) &&
                     abs(e->x() - line.p1().x() ) < abs( e->y() - line.p1().y() )){
                if((e->x() < line.p1().x() && e->y() < line.p1().y()) || (e->x() > line.p1().x() && e->y() < line.p1().y())){
                    x = e->x();
                    y = line.p1().y() - abs(line.p1().x() - e->x());
                }else if((e->x() > line.p1().x() && e->y() > line.p1().y()) || (e->x() < line.p1().x() && e->y() > line.p1().y())){
                    x = e->x();
                    y = line.p1().y() + abs(line.p1().x() - e->x());
                }
            }else if(abs(e->x() - line.p1().x() ) < 2 * abs( e->y() - line.p1().y() ) &&
                     abs(e->x() - line.p1().x() ) > abs( e->y() - line.p1().y() )){
                if((e->x() < line.p1().x() && e->y() < line.p1().y()) || (e->x() < line.p1().x() && e->y() > line.p1().y())){
                    y = e->y();
                    x = line.p1().x() - abs(line.p1().y() - e->y());
                }else if((e->x() > line.p1().x() && e->y() > line.p1().y()) || (e->x() > line.p1().x() && e->y() < line.p1().y())){
                    y = e->y();
                    x = line.p1().x() + abs(line.p1().y() - e->y());
                }
            }else{
                x = e->x();
                y = e->y();
            }

Запостил: Abbath Abbath, (Updated )

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

  • Подсократив чуток код (http://pastebin.com/saYWxTCR), я сделал выводы:
    1. Это, наверное, фрагмент какого-то схемопостроителя.
    2. Некоторые программисты рождаются со встроенным обфускатором.
    3. На C++ 99% алгоритмов и математики выглядят как говно.

    P.S. При сокращении отвалилось несколько условий, но, как мне кажется, результат от этого ничуть не испортился.
    Ответить
    • > На C++
      На каком языке этот алгоритм можно записать понятней?

      Вообще интересно, что автор хотел выразить этим кодом. Перемещаем некую точку к началу прямой, если разница расстояний слишком несимметрична? Хочется объяснений в контексте предметной области. Ну и if (ortho) немного смущает...

      P.S. код будет немного читабельней, если все условия привести к единому виду, т.е.
      if (2 * dist_x < dist_y)
      if (2 * dist_y < dist_x)
      if (dist_y < 2 * dist_x  &&  dist_x < dist_y)
      if (dist_x < 2 * dist_y  &&  dist_y < dist_x)
      Ответить
      • >>На каком языке этот алгоритм можно записать понятней?
        На естественном, в комментарии 🙂 Фортран из книг по вычмату тоже был более-менее читабельным.
        Ответить
        • > На естественном, в комментарии 🙂
          Ох, это врядли...
          > Фортран
          Писал я на фортране, не верю, что будет понятней.
          Ответить
      • Это поиск координаты конца линии, которая должна быть вертикальной или горизонтальной, потому и ortho, а потом были добавлены линии под углом 45 °
        Ответить
        • > Это поиск координаты конца линии, которая должна быть вертикальной или горизонтальной
          У нас есть линия line, начинающаяся в p1 и заканчивающаяся в p2, и некая точка e. Что нужно найти?
          Ответить
          • Найти какую линию рисовать, вертикальную, горизонтальную или диагональную в зависимости от того в какой четверти четверти находится e. Из e добываем одну координату p2, а другую считаем.
            Ответить
              • line это линия, оси, как таковой нет, начало координат в точке p1, но это все рисуется на прямоугольном окне, и поэтому нужно подгонять координаты. Это все такая херня как в паинте рисовать с зажатым Shift.
                Ответить
                • >>в паинте рисовать с зажатым Shift.
                  "О сколько нам открытий чудных..."
                  Ответить
            • Кажется, я понял. Нужно приблизать отрезок (p1, e) другим отрезком, начинающимся в p1, имеющим угол наклона (\pi / 2) * n и заканчивающимся максимально близко к e?
              (пэинта под рукой нет, проверить догадку не могу)
              Ответить
      • >На каком языке этот алгоритм можно записать понятней?
        Ну, как минимум на любом нормальном языке будут свойства вместо рябящих в глазах "()" и точки вместо "->".
        Хотя всех недостатков кода это не отменяет.
        Ответить
  • Это карта, где клад зарыт. Не зря же там столько стрелочек.
    Ответить
  • Похоже это работа для... Человека -Оптимизатора!
    Ответить
    • if(ortho){
      		auto X = e->x();
      		auto Y = e->y();
      		auto LX = line.p1().x();
      		auto LY = line.p1().y();
      		auto DX = abs(X - LX );
      		auto DY = abs( Y - LY );
      			
      		x = X;
                      y = Y;
      
      		if ( DX * 2 == DY || DX == 2 * DY) return;
      
      		if( DX * 2 < DY ){
      			x = LX;
      			return;
                      }
      
      		if(DX > 2 * DY){
                              y = LY;
      			return;
                      }
      			
      		if ( DX == 0 || DY == 0 || DX == DY) return;
      		
      		if(DX < DY){
      			y = Y < LY? LY - DX: LY + DX;	 	
                      } else{
      			x = X < LX? LX - DY: LX + DY;
      		}
      	}
      Ответить
      • чилавек-рефакторист, поставлю лайк, за одну тока работу. Ибо у автора получилось месиво.

        Еще чюю ,это можно еще упростить.
        Ответить
  • http://ideone.com/z8OvVD
    Наговнявкал свой вариант. Основной код
    point approximate(const point o, const point e)
    {
        point points[] = {
            {e.x, o.y},            // projection to X
            {o.x, e.y},            // projection to Y
            project_to_units(o, e) // projection to [(2n+1)*pi / 2] axis
        };
        return *std::min_element(points, points + 3, closer_to(e));
    }
    Ответить
    • Разосрал на кучу функций, то, что у меня влезлось в одну.
      Ответить
      • Количество функций влияет только на читабельность. И влияет, как ни странно, ПОЛОЖИТЕЛЬНО
        Ответить
    • на новой работе с++11 ещё не в почёте?
      auto points = {
          {e.x, o.y},            // projection to X
          {o.x, e.y},            // projection to Y
          project_to_units(o, e) // projection to [(2n+1)*pi / 2] axis
      };
      return *std::min_element(std::begin(points), std::end(points), closer_to(e));
      Ответить
      • да и вместо клозер_ту можно и лямбду наговнякать
        вот сразу сколько возможностей
        Ответить
      • > на новой работе с++11 ещё не в почёте?
        Наоборот, новый стандарт во все поля. Но я решил оставаться в рамках предыдущего стандарта, ведь не всем доступна такая роскошь. Руки чесались воткнуть лямбду и не рассчитывать границы массива самостоятельно, но я сдержал порыв.

        P.S. Затупил, [(2n+1)*pi / 4] axis
        Ответить
  • - Мам, ты видела, как он улыбается? - вмешался в разговор Даня.
    Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8