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

    +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
    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, 14 Октября 2013

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

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

      P.S. При сокращении отвалилось несколько условий, но, как мне кажется, результат от этого ничуть не испортился.
      Ответить
      • > C++99%
        как-то я упустил этот стандарт плюсов
        Ответить
      • > На 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 это координатная ось?
                Ответить
                • 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
          Ответить
    • - Мам, ты видела, как он улыбается? - вмешался в разговор Даня.
      Ответить

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