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

    +21

    1. 1
    angle_in_radians = acos(dot(normalize(o-a), normalize(o-b)));

    Векторы такие сложные, а операции с ними так трудно запомнить, что даже игроделы не могут это сделать.

    Запостил: TarasB, 20 Января 2013

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

    • Отвечаю на вопрос: C++ тут в "o-a", это вектора, а не числа.
      Ответить
    • Не понял, где именно здесь говно.
      Ответить
    • показать все, что скрытоТут тоже что ли никто вектора не осилил?
      Через 5 лет такими темпами 95% будет думать, что код
      a = atan(x,y);
      c = cos(a);
      s = sin(a);

      - нормальный
      Ответить
      • vec2 a = normalize(vec2(x, y));
        c = a.x;
        s = a.y;

        А теперь расскажи, где в собственно посте говно.
        Ответить
        • P.S. Тарас тут немного запутал. atan2 на самом деле от y, x (наоборот). Надо поменять местами либо у него, либо у меня.
          Ответить
          • Это не тарас запутал, а просто не привели эту функцию к единому стандарту. Везде по разному порядок аргументов от языка к языку.
            Ответить
        • То есть ты действительно, чтобы найти угол между векторами, будет делать две нормализации и считать арккосинус, который внутри делает ещё один квадратный корень и только потом делает атан?
          Минусаторы, идите НААААХУЙ из программирования, и возвращайтесь только выучив до мозга костей всё, что связано с векторами.
          Ответить
          • >арккосинус, который внутри делает ещё один квадратный корень и только потом делает атан?
            Что, правда?
            Ответить
            • Так, один из долбоёбов-минусаторов - это ты, ага, вижу.
              Второй - гумно?
              А как делаешь арккосинус ты?
              Сопроцессор умеет только fpatan.
              Решение через многочлен, через 10 умножений? Думаешь сейчас это будет быстрее?
              Ответить
              • Я тебя не минусовал. Ни один из комментариев, ни пост. Могу скриншот предоставить.

                Хорошо, ты прав, в x86 только такая инструкция есть.
                Тем не менее, лучший вариант - в студию.
                Ответить
                • Тогда интересно, кто этот дебил.
                  Ответить
                  • показать все, что скрытоК слову мне тоже интересно. Могу даже нотариально заверенные скриншоты предоставить.
                    Ответить
                    • Не знаю почему, но Тарас мне Кармака напоминает. Тот тоже хорошо математику оптимизирует.
                      Ответить
                      • показать все, что скрытоТы Тарас не переживай из-за ерунды. У меня обычно минусуют исключительно каждый пост просто потому что нравится нажимать на минус и чувствовать себя богом, победившим против аргументированного ответа просто одним щелчком мышки. Ну а я не теряю из-за такой ерунды боевого духа. Ещё больше опускаю питушков. Продолжай в том же духе вопреки обстоятельствам.
                        Ответить
                      • Taras Barmack. Founder and technical director of Tb Software (TWolfenstein, TDoom, TQuake, TRage) and Tarasmadillo Aerospace
                        Saint-Pascal, QC · http://www.tbsoftware.com
                        Ответить
                        • А по ссылке только вот это:
                          <HTML>
                          <HEAD>
                             <TITLE>ThunderBolt Software</TITLE>
                          </HEAD>
                          <BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000">
                          
                          <CENTER><IMG SRC="tbstitle.gif" HEIGHT=93 WIDTH=432></CENTER>
                          
                          </BODY>
                          </HTML>
                          Ответить
                      • и тоже гдев
                        Ответить
                        • Кармак тоже тусуется на гейдеве? О_о

                          Можно ссылочку на профиль?
                          Ответить
                          • На гейдеве все сливки общества. Илита я бы даже сказал.
                            Ответить
                      • Кармак давно ездит на феррари, а Тарас срётся на гкоде.
                        Очень похоже.
                        Ответить
                  • Ну раз интересно, отвечу: минусами прошелся я, за исступление эмоций. Что довольно странно, раньше ты казался вполне адекватным.

                    Вместо "кококорукиизжопыкококовонизпрофесси и" лучше бы привел пример того как ты считаешь правильно и указал почему именно так. Аргумент "это ж очевидно" не принимается.

                    А если тестами подтвердишь, так вообще шикарно будет.
                    Ответить
                    • Ты минусовал за всех пятерых минусаторов? Неужели боты?
                      Ответить
                      • Нет, каждый коммент один раз. За пост не голосовал.
                        Ответить
                      • Я был вторым, прошедшимся минусами по учивекторобатхертам Тараса.

                        Минусовал конкретно 167425 и 167424. Топик и остальные содержательные комменты плюсанул.
                        Ответить
                        • То есть призыв учить матан в ответ на "а фто такова чем тибе на нравится моя сортировка пузырьком" для тебя - это тупо учивекторобаттхёрт?
                          Ты считаешь, что игродел, не знающий вектора, не должен вылететь из профессии?
                          Ответить
                          • показать все, что скрытоРазница между сортировкой пузырьком и квиксортом: n/log n и то, что вторая уже готова в стандартной библиотеке, а первую ещё писать - тут конечно нужно отправить на доучивание. А между формулой в топике и в комментах: c. Если есть время оптимизировать или это необходимо, то нужно посидеть и пораскинуть формулами, но не раньше.

                            Кстати, есть ли реально хоть одна область применения пузырьковых сортировок?
                            Ответить
                            • > есть ли реально хоть одна область применения пузырьковых сортировок?
                              тест для сравнения производительности сортировок
                              Ответить
                              • Ну че уж там. Давайте туда и блинную и рандомную
                                Ответить
                            • В игрострое и константа важна, а если пишется физдвиг, то операции типа нахождения угла часто буду узким местом.
                              Ответить
                              • > В игрострое и константа важна
                                Безусловно.

                                Но если начинать проект с задрачивания "узких мест" - то этот проект никогда не взлетит. Поверь мне, Тарас. К тому же на начальном этапе не всегда понятно, где же будут эти самые узкие места.

                                Имхо, задумываться о константах в производительности нужно уже после того как ясны основные идеи, и написан какой-никакой остов проекта.

                                Здесь же я вижу просто набросок, который автор когда-нибудь перепишет по-нормальному, когда увидит, что это место является узким, и все-таки выучит векторы.
                                Ответить
                                • > Но если начинать проект с задрачивания "узких мест" - то этот проект никогда не взлетит.

                                  Находить угол нормально, а не жопой арккосинусом - это не задрачивание узкого места, это так же естественно, как использовать кусорт вместо пузырька.

                                  Если б на гд.ру были подписи, то я бы поставил туда "использую путырёк вместо кусорта, потому что Кнут сказал, что оптимизация - зло".
                                  Жупел неосиляторов нормальных алгоритмов.
                                  Ответить
                                  • Это для тебя Тарас, прочитавшего кучу статей и книг по архитектуре процов и графике, и имеющего свои наработки, такое решение естественно.

                                    А для новичка? Ему сейчас важнее понять общие концепции, понять как собрать из всех этих разрозненных знаний работоспособную игру, а знания о том что углы считают через atan2, а не через acos - они придут с опытом, если он конечно не посчитает все это слишком сложным, и не уйдет в дворники...

                                    А вот если он будет сосредотачивать внимание именно на таких моментах, а не на общей концепции - его игра никогда не увидит свет, и появится еще один недопиленный движок, коих сотни на том же ГД...

                                    У проекта, который неопытный программист попытается сделать сразу же идеальным, почти нет шанса на жизнь.
                                    Ответить
                                    • Так дело не в новичках. Дело в том, что три блять постояльца и четыре блять говнокодера, то есть всё люди с опытом, приводят такое решение и говорят, что типа ой а как ещё можно, а, ну надо же, подумаешь, а вообще типа ой это всё что вы предлагаете, это оптимизация и можно отложить.
                                      Этот говнокод не новичок предложил, понимаешь? Я б тогда его не выложил. Это предложил опытный человек на вопрос новичка, и в этом-то пиздец и заключается.
                                      Ответить
                                      • > Это предложил опытный человек на вопрос новичка, и в этом-то пиздец и заключается.
                                        А вот это пиздец. Теперь полностью солидарен с Тарасом. Учить новичков говну нельзя.
                                        Ответить
                                        • http://www.gamedev.ru/code/forum/?id=171870
                                          Ответить
                                          • > http://www.gamedev.ru/code/forum/?id=171870
                                            Самое забавное - тот самый новичок начал с арктангенса, а местные гуро ему насоветовали косинус и "смотреть на знак векторного произведения"...

                                            P.S. Векторное произведение только ради его знака это говнокод намного сильнее чем тот, который в топике.
                                            Ответить
                                            • > местные гуро
                                              XD
                                              > Векторное произведение только ради его знака это говнокод намного сильнее чем тот, который в топике.
                                              Кстати, нет. Вменяемую альтернативу я не нашёл. Хотя искал: http://www.gamedev.ru/code/forum/?id=171290&page=5#m60
                                              Ответить
                                    • > прочитавшего кучу статей и книг по архитектуре процов и графике на английском языке
                                      obvious fix
                                      Ответить
                            • > есть ли реально хоть одна область применения пузырьковых сортировок?
                              Лабы.
                              Ответить
                            • >Кстати, есть ли реально хоть одна область применения пузырьковых сортировок?
                              Ещё как есть. Представь себе scoreboard какой-нибудь онлайн игры. Игроков сортировать по очкам выгоднее всего именно пузырьком. Чего уж там, Unreal Tournament на клиентах каждый тик его сортирует (при условии, что он открыт), и ничего.
                              Ответить
                              • > Игроков сортировать по очкам выгоднее всего именно пузырьком.
                                В декоративных целях - конечно. Пузырьковая сортировка красива и не сильно отвлекает от просмотра таблички.
                                Ответить
                                • Ты не понял. Никакой анимации там нет.
                                  Пузырек очень хорошо себя ведет тогда, когда список уже отсортирован. А большую часть времени список действительно отсортирован.
                                  Кроме того, какое изменение приводит к тому, что список нужно пересортировать? Когда игрок набрал сколько-то очков в выбился вперед. Его просто нужно поменять местами с другим игроком. Именно таким образом пузырек и сортирует.
                                  Ответить
                                  • > Ты не понял.
                                    Теперь понятно. Спасибо.
                                    Ответить
                                  • Двоичное дерево - не?
                                    Ответить
                                    • А смысл? Будет ли какой-то прок от дерева там, где нужно отсортировать максимум пару десятков игроков?
                                      Ответить
                            • Если вектор почти весь отсортирован, то пузырек будет быстрее криво написанного qsort (берущего первый элемент за основу).
                              Ответить
                          • > Ты считаешь, что игродел, не знающий вектора, не должен вылететь из профессии?
                            Не должен. Каждый человек чего-то не знает, в этом нет ничего плохого, особенно если он начинающий. Сам вот найди свой код 5-10 летней давности, и почитай его, увидишь что годы прошли не зря ;)

                            Вот если он не хочет учиться и разбираться в том, с чем ему приходится работать - вот тогда гнать его из профессии ссаными тряпками.
                            Ответить
                            • > Не должен.
                              Хорошо, геймдизайнер, скриптовик, художник итд не должен. А тот, кто пишет движок, особенно узкие места - знать обязан. И если он спрашивает "где говно", то это пиздец, полный пиздец.

                              Представь, что ты попал в умественно отсталый мир, где все знают только пузырьковую сортировку и на твои вопрсы отвечают "а что такого-то". Ты на местный говнокод шлёшь чужой код с пузырьком, тебе тоже отвечают, что говна не видят. Ты в полном ахуе пишешь "учи алгоритмы, быдло, а пока не выучишь, съеби из профессии", а они тупо удивляются.
                              Ответить
                              • >ты попал в умественно отсталый мир
                                >а пока не выучишь, съеби из профессии"
                                со своим уставом, да в монастырь ...
                                Ответить
                              • > Ты на местный говнокод шлёшь чужой код с пузырьком, тебе тоже отвечают, что говна не видят.

                                И в чем же тут говнокод? В самой сортировке пузырьком говна нет, как и в любом другом наивном алгоритме. В коде из топика, выдранном из контекста, тоже никакого говна нет - это просто наивная реализация алгоритма, скопированная из школолольного учебника по математике.

                                В наивных алгоритмах нет говна, Тарас. До тех пор пока их не начинают продвигать как "оригинальные и эффективные" решения.
                                Ответить
                                • > В наивных алгоритмах нет говна, Тарас.

                                  Есть. Если его продвигает тот, кто должен быть в теме - то есть. А если он уже успел где-то подхватить лозунг про оптимизацию - то всё пропало, он необучаем, у него есть отмазка на всё.
                                  Ответить
                                  • Ну так я и пишу - в наивном алгоритме нет говна, пока его не начинают продвигать. До этого он просто алгоритм, обладающий какими-то характеристиками, которые, возможно, хуже чем у других алгоритмов.
                                    Ответить
                                    • Так понимаешь, одно дело, если новичок так ищет угол, а другое дело, когда человек с гд.ру или с говнокода.
                                      Ответить
                                      • > человек с говнокода
                                        Тарас, ну ты же понимаешь, что специализации тут у всех разные. Кто-то с СУБД целыми днями работает, кто-то по хардкору пишет прошивки под контроллеры, кто-то занимается сайтами...

                                        Да и такое знание про поиск угла - это не провалы в геометрии и векторах, это провалы в знании особенностей платформ, на которых нет арксинуса и арккосинуса. (Но при этом есть шустрые алгоритмы для приближенного их вычисления, которые раза в 4 быстрее твоего арктангенса, и дают 4 верных цифры, которых вполне хватит для многих геймдевовских применений).
                                        Ответить
                                        • Самое главное, ведь Тарас мог просто взять и сразу описать суть своих претензий к ОП-коду, сразу дать верный вариант кода, ну или хотя бы в описании к коду указать контекст его подачи (ссылку на гдру?).
                                          НО! Разве был бы здесь тогда весь этот уютненький срач который так приятен для Тараса, поверьте, и разве нахватал бы он тогда сначала минусов, потом плюсов, потралил бы гумно? Нет. Это был бы просто топик из разряда унылых, которые даже более Б-гомерзки, нежели утонувшие.
                                          Ответить
                              • У нас тормоза не из-за пузырьков и ко а из-за архитектуры дичайшие. Куда не сунься - чтобы оптимизировать надо полазать по всему проекту потому что сука все элементы системы лезут в друг друга в неограниченную глубину и все блять публично и сука часть логики на нетипизированных обьектах с ключами в разном стиле (может кабс, может с подчеркивания начинаться). А алгоритмы - уже совершенно ни на что не влияют...
                                Ответить
                                • Ну вот кстати. Пример из рабочего проекта.
                                  Ответить
                                  • Да, чтобы было что оптимизировать надо стартануть )
                                    Я еще зеленым новичком крепко запомнила слова одного матерого и успешного дядьки (альтернатива 3д, ага) - мы не оптимизируем миллисекунды в циклах, мы оптимизируем архитектуру. Не ручаюсь за точность пересказа правда, но смысл такой. Время можно потратить лучше чем надрачивая до блеска алгоритмы которые вообще неизвестно нужны ли.
                                    Ответить
                                    • Так-то оно так, но я, например, имея координаты векторов, тригонометрию бы использовать в этой задаче не стал, обошёлся бы линейной алгеброй, даже не будучи геймдейвщиком.
                                      Ответить
                                    • Знаешь, я все эти истины про архитектуру и всё такое слышал, только если б это было так, то коренные языки бы вымерли и умные компиляторы были бы никому не нужны, а на самом деле такие вещи вообще нельзя говорить новичкам, потому что они обрадуются и... у них есть оправдание на любую черезжопицу! Ну, если она не влияет на архитектуру.
                                      Например, брать угол через арккосинус.
                                      Ответить
                                      • > Знаешь, я все эти истины про архитектуру и всё такое слышал
                                        Тарас, черезжопие в архитектуре может (и будет) просаживать производительность намного больше, чем твой несчастный арккосинус... Он медленнее арктангенса на жалкие проценты. А вот кривая архитектура, из-за которой, к примеру, рисуются все полигоны вместо нужных - это порядки, а не проценты.

                                        И ускорив вдвое вычисление угла, которое занимало, к примеру, 5% от общего времени работы, ты получишь выигрыш всего на 2.5%... Оно того стоило?
                                        Ответить
                                      • > оправдание на любую черезжопицу
                                        Любой черезжопице, Тарас, есть одно оправдание - идеальная программа разрабатывается бесконечно долго.

                                        Реальную же программу нужно написать за ограниченный срок. Идеальный проект должен быть идеальным, без единого изъяна. Реальный же проект просто имеет требования, в которые нужно уложиться.

                                        К примеру:
                                        Идеальный проект: "Движок должен рендерить максимально быстро".
                                        Реальный проект: "Движок должен рендерить сцены определенного вида с ограниченным количеством объектов на GT8600 с фпс не ниже 60".

                                        Реальный проект будет разработан за реальный срок, а идеальный не выйдет дальше первой демки, в которой крутится какой-нибудь кубик.

                                        Посмотри на геймдев Тарас... Что ты хочешь? Идеальный код, которого ты никогда не увидишь в действии? Или же игру, в которую можно будет поиграть, и порадоваться за успехи земляка, написавшего ее?
                                        Ответить
                                        • а я согласен с тарасом
                                          есть специфические области, в которых специфический программист не имеет права плавать
                                          если это 2д/3д, то работа с координатами должна быть эффективной
                                          хотя лично я линейную алгебру проходил 10 лет назад и вообще ничего из нее не помню - потому что специфика другая

                                          но, уверен, в 2д/3д всевозможные рецепты по поворотам, трансформациям, нормализациям и прочим ациям уже давно разжеваны, поэтому программисту надо не велосипедить, а подглядывать в справочник
                                          и программа будет написана тем быстрее, чем быстрее он ориентируется в этом справочнике - и тем быстрее, если справочник у него в голове
                                          Ответить
                                          • > поэтому программисту надо не велосипедить
                                            ... а взять уже давным-давно написанную им (или кем-то еще) функцию из библиотечки, которая была им наработана во время написания прошлых проектов.

                                            > есть специфические области, в которых специфический программист не имеет права плавать
                                            Ну да, тут согласен. Но это больше к профессионалам относится, чем к контингенту геймдева, который охаивает Тарас. Там 99% свою игру хотя бы до играбельного состояния допилить, я уж молчу про шлифовку линейной алгебры.
                                            Ответить
                                            • > Но это больше к профессионалам относится, чем к контингенту геймдева, который охаивает Тарас.

                                              Да туда тоже вроде как профи ходят. Ну судя по их уверенности в своём проффесионализме.
                                              Ответить
                                              • > Да туда тоже вроде как профи ходят.
                                                Профи - это как минимум те, у кого уже есть готовые игры или хотя бы готовый двиг для нее. Как человек не дописавший свою единственную игру до играбельного состояния может считаться профи в разработке игр?!
                                                Ответить
                                              • Лол? Кто тут профи? Это ты про себя чтоли? Понимаешь какое тут дело: Ты или на Канарах сидишь или на гумнокоде. Насколько я знаю ты относишься ко вторым?
                                                Ответить
                                                • > Насколько я знаю ты относишься ко вторым?
                                                  1) Я где-то называл себя профи геймдева?
                                                  2) Да, ко вторым, а ты, очевидно, со своего острова к нам пишешь?

                                                  P.S. Ты считаешь, что человек может называть себя профи в какой-то практической области ничего там толком не добившись и зная только теорию?
                                                  Ответить
                                                  • > 2) Да, ко вторым, а ты, очевидно, со своего острова к нам пишешь?
                                                    А где я назвал себя профи? Просто говорю, что Тарас, мнящий себя профи не нужен. Нужен Тарас, являющийся профи.
                                                    Ответить
                                                    • > Просто говорю, что Тарас, мнящий себя профи не нужен. Нужен Тарас, являющийся профи.
                                                      Хм, так это было не мне а Тарасу?

                                                      P.S. Большая человеческая просьба - цитируй кусок фразы, когда текст превращается в стену, а то тут уже хуй поймешь кто кому что пишет.
                                                      Ответить
                                                      • LispGovno 2 часа назад #
                                                        > bormand, ты - хуй!
                                                        bormand 2 часа назад #
                                                        > это я то хуй?
                                                        LispGovno 2 часа назад #
                                                        > да не ты, а Тарас!
                                                        bormand 2 часа назад #
                                                        > а, тогда всё верно
                                                        Ответить
                                                        • >> а, тогда всё верно
                                                          всё верно, только вот уже 5 часов назад
                                                          Ответить
                                                          • > всё верно, только вот уже 5 часов назад
                                                            Вот поэтому я из-под guest'а пишу "только что".
                                                            Ответить
                                                      • >хуй поймешь
                                                        Ну я дерево вижу. Может тебе плагин какой нужно поставить, чтобы браузер стал нормально дерево отображать? Говорят в сети есть даже плагин, что линии дорисовывает к дереву.
                                                        А вот так можно без плагина:
                                                        http://www.youtube.com/watch?v=zqHV625EU3E
                                                        Ответить
                                        • А я не собираюсь оправдывать черезжопицу. Время разработки? Написать атан быстрее, чем хрень с арккосинусом, если человек в теме, то для него атан естественен, а если он не знает такой метод - значит он профнепригоден.
                                          Когда я вижу код с арккосинусом, я испытваю то же, что и при виде кода с
                                          if (a.ToString()=="TRUE"), новички вообще не понимают код if(a) , у них это "если "а" - если "а" что? Вот если а - истино мне понятно".
                                          А пиздец в том, что из дохренищи программистов, с которыми я обсудил этот момент, большинство тоже не считает решение через арккосинус черезжопным! Это говорит о том, что из этих профи у большей части серьёзный пробел в такой элементарной базовой фигне, как векторы!
                                          А ещё меня бесит, когда этой хуйнёй про архитектуру оправдывают более медленный код, даже если явно более мутный. Это уже извращение мышления, подмена понятий, шиза какая-то, когда более медленное автоматом считается более читабельным.
                                          Ответить
                                          • Все просто - не у всех математика в крови, не все с ней каждый день сталкиваются, не все движки пишут. Человек который ее юзает раз в три месяца не будет разбираться - работает и спасибо. И не надо приводить примеры с элементарными конструкциями - ими то постоянно все пользуются, тут не знать это пиздец.
                                            Ответить
                                            • > не у всех математика в крови, не все с ней каждый день сталкиваются, не все движки пишут

                                              Только вот если это относится к программисту из игростроя, то это непригодный программист.
                                              Ответить
                                              • > Только вот если это относится к программисту из игростроя, то это непригодный программист.
                                                Если это относится к разработчику самого движка или шейдеров. Тот, кто пишет скрипты для "AI", или другие модули, не имеющие отношения к геометрии и векторам вообще-то не обязан знать досконально линейную алгебру.

                                                P.S. А т.к. среднестатистическому геймдевовцу приходится работать в одиночку, и писать и скрипты и шейдеры, и движок, и UI, да еще и рисовать - несознательное использование арккосинуса и других наивных формул можно простить.
                                                Ответить
                                                • > P.S. А т.к. среднестатистическому геймдевовцу приходится работать в одиночку, и писать и скрипты и шейдеры, и движок, и UI, да еще и рисовать

                                                  То знать формулы он должен, примерно так же, как он должен не писать if b=true
                                                  Ответить
                                                  • > То знать формулы он должен, примерно так же, как он должен не писать if b=true
                                                    Ну-ну. Если он во всех областях, требуемых в геймдеве, настолько про... то я не знаю чего он забыл на геймдев.ру. Я думаю среди себе подобных ему было бы намного интересней.
                                                    Ответить
                                                    • Насколько? Это база. Линейка должна быть выдрочена до блеска у всех.
                                                      Ответить
                                                      • > Линейка должна быть выдрочена до блеска у всех.
                                                        Не знаю что еще ответить, Тарас. Ты и прав и не прав.

                                                        Прав в том плане, что движок задрочившего линейку (и, в обязательном порядке, ее практические применения для машграфики на конкретных платформах) будет шустрее и красивей.

                                                        Не прав в том плане, что линейка это только малая часть всех знаний, которые потребуются, чтобы реализовать 3d игру целиком. И новичку скорее нужны базовые знания во всех этих областях, чем доскональные в одной, и нулевые в других.
                                                        Ответить
                                              • А мне казалось что в игрострое большая часть людей ПОЛЬЗУЕТСЯ физическими движками а не пишет их. А тот кто "хотя бы написал свой движок" не игродел а программист которому интересно играть с кодом. По мне игродел от слова ДЕЛАТЬ. Игры.
                                                Ответить
                                                • А не в физическом движке мне с высокой колокольни накласть на десяток не оптимальных вызовов вычисления чего то. (это моя боль, у нас сука оптимизация на уровне спичек мне всю кровь выпила)
                                                  Ответить
                                                  • Оптимизация на уровне спичек в флеш-игре? Это как?
                                                    Ответить
                                                    • while (i--), >> и ко.
                                                      Но наши экономят создание простых объектов (кеши) - это страшнее. При этом при загрузке пол тысячи квестов при старте игры каждый отправляет сигнал об обновлении, несколько тысяч видов ресурсов делают то же самое.
                                                      Ответить
                                                • Насчёт использования готового - нихрена, кто-то использует, кто-то нет, и у того и у друого есть свои плюсы и минусы.
                                                  Новичку есть смысл делать самому, чтобы лучше знать кишки, но если советчики считают себя достаточно квалифицированными не только чтобы давать советы, но и ещё и защищать своё говно, но при этом школьную линейку нихрена не знают, то это очень плохо.
                                                  Ответить
                                            • > не у всех математика в крови
                                              да не, скорее проблема как раз в том, что в школах\универах матан и алгоритмы задрачивают до зубрежки, а вот планированию\выбору инструментов не учат.
                                              в итоге дрочат на ООП и наносекунды.
                                              Ответить
                                          • > в такой элементарной базовой фигне, как векторы
                                            Да причем тут векторы? С точки зрения математики эта формула верна.

                                            А вот для вычислений на эвм она не оптимальна. Поэтому, имхо, надо обвинять в неумении оптимизировать вычисления на практике, а не в незнании теории (хотя и оно, скорее всего, имеет место быть).
                                            Ответить
                    • Я абсолютно адекватен.
                      А вот если большая часть программистов из игростроя не знает, как найти угол и делает это через задницу, то русский игрострой действительно неадекватен и наводнён быдлятинкой, которую надо отправить либо на матан на переобучение, либо на метан.
                      Ответить
                      • Ну это как раз ничего удивительного.
                        В общем, пока что код выдран из контекста.
                        Вот если на это будет указано как на узкое место в текущей реализации, а кодер скажет "а иначе никак" - тогда да, посыл в учебник уместен. А до тех пор рано.
                        Ответить
                        • Да на самом деле даже похуй, узкое это место или нет. Если для игродела такой способ кажется нормальным и он не видит никакого подвоха - то ему надо съебать из профессии. Любой, кто знает геометрический смысл операций над векторами, такую хуйню не напишет. То, что тут тоже все считают это нормальным, это тоже очень печально.
                          Ответить
                          • нуу, например, необязательно вычислять синусы\косинусы углов, кратных 90 градусов.
                            Ответить
                            • синосиусы вообще не нужно вычислять - в таблицу их.
                              Ответить
      • показать все, что скрыто.
        Ответить
      • показать все, что скрытоТы хочешь славу Урсуса переплюнуть? Не получится.
        Ответить
      • показать все, что скрытоОтсосу член парню из Владикавказа. Прут наглые хуястые самцы.

        [email protected] (Спросить Тараса)
        Ответить
      • Ну как, думают?
        Ответить
    • .
      Ответить
    • cos(angle_in_radians)  = dot(o-a, o-b) / (abs(o-a) * abs(o-b));
      sin(angle_in_radians) = sqrt(1 - dot(o-a, o-b)^2 / (abs(o-a) * abs(o-b))^2) = sqrt((abs(o-a) * abs(o-b))^2 - dot(o-a, o-b)^2) / (abs(o-a) * abs(o-b));
      tan(angle_in_radians) = sqrt((abs(o-a) * abs(o-b))^2 - dot(o-a, o-b)^2) / dot(o-a, o-b);

      Итого:
      prod1 = abs(o-a) * abs(o-b);
      prod2 = dot(o-a, o-b);
      angle_in_radians = atan (sqrt(prod1 * prod1 - prod2 * prod2) / prod2);

      Так что ли?

      P.S. А, ну да, у меня лишнее извлечение корня и возведение в квадрат. Поэтому так:
      prod1a = dot(o-a, o-a) * dot(o-b, o-b);
      prod2 = dot(o-a, o-b);
      angle_in_radians = atan (sqrt(prod1a - prod2 * prod2) / prod2);
      Ответить
      • Ааааа пиздеееец.
        Ну ладно, знаменатель хоть правильный.

        И да, делить не обязательно, атан2 принимает сразу два аргумента.
        Ответить
        • А где я наглючил? Сейчас подумаю... Нафиг я скалярное произведение вынес из под корня?
          angle_in_radians = atan (sqrt(prod1a / (prod2 * prod2) - 1));
          Ответить
          • Числитель можно упростить.
            Ой, я забыл сказать, тема про 2д

            Теперь ты сделал хуже, чем было, лишнее деление
            Пост назад ты дал почти верный ответ для многомерного случая.
            Ответить
            • Ну вот, а я уже подумал, что здесь произвольное n-мерное пространство.
              Ответить
        • показать все, что скрытоОтсосу член парню из Владикавказа. Прут наглые хуястые самцы.

          [email protected] (Спросить Тараса)
          Ответить
    • Нагуглил один вариант: http://stackoverflow.com/a/10145056/371970
      atan2(length(cross(o-a, o-b)), dot(o-a, o-b));


      P.S. Кстати, почему o-a? a-o было бы логичнее.
      Ответить
      • Да, синус можно вытянуть из векторного произведения. Для двумерной задачи достаточно посчитать cross(o-a, o-b).z = ((o-a).x * (o-b).y, - (o-a).y * (o-b).x). Видимо, это и хотел выжать из нас Тарас.
        Ответить
        • Наконец-то народ выдал верное решение, зачем-то наставив мне минусов.
          Моё мнение об общем уровне программистов в России упало на 1 пункт.
          Ответить
          • Я согласен с тем, что такой способ таки лучше, чем способ в посте. Но я бы не стал клеимить последний прямо уж говнокодом. Пожалуй, это меньшее из говен, которое может встретиться в коде.
            Ответить
            • Он свидетельствует о том, что у человека хреново с векторами. А ещё выпученное лицо "а что тут такого". В школу пусть идёт, если не знает такие вещи
              Ответить
              • В школе как раз учат через косинусы. А вот на первом курсе на линейной алгебре показывают, как вычислить через определитель.
                Ответить
              • >выпученное лицо "а что тут такого"
                >В школу пусть идёт, если не знает такие вещи
                >возвращайтесь только выучив до мозга костей всё
                У меня прямо ностальгия по матану в университете.
                Ответить
        • Зачем-то полез редактировать и нажал сабмит за секунду до окончания срока с испорченной формулой. Короче:
          atan2(abs((o-a).x * (o-b).y - (o-a).y * (o-b).x)), dot(o-a, o-b));
          Ответить
          • А модуль зачем?
            Ответить
            • Чтобы результат не зависел от того, в каком порядке мы перемножаем вектора. Хотя его нужность зависит от нашего определения угла: обычный геометрический угол или величина со знаком, указывающим направление поворота.
              Ответить
              • Как раз результат должен зависеть.
                Кому нужно только значение, без знака, те пусть сами модуль берут.
                Но в 80% случаев знак нужен.
                Ответить
                • А как тогда отличить острый угол от тупого, если значение арктангенса в интервале (-π/2; π/2)?
                  Ответить
                  • atan2, в отличие от его тупого собрата atan'а, возвращает результат в интервале (−π,π).

                    P.S. Не могу вспомнить, в какую сторону включительно, но должен покрывать все углы.
                    UPD: [−π,π], т.к. оно оказывается еще на знаки нулей смотрит.
                    Ответить
                    • Проморгал. Тогда вопрос снимается. Модуль действительно не нужен.
                      Ответить
                    • А что такое «минус Пи»? Что с плюсом, что с минусом, вектора выстраиваются в прямую и нет разницы, с какой стороны считать.
                      Ответить
                      • Если на входе было y = -0, и x = -1, то и получается то самое минус пи. А если y = 0 и x = -1, то просто пи. Все зависит от того с какой стороны подбираться к нулю ;)

                        P.S. Кто знает как на интеле сгенерить -0 не прибегая к битоёбству?
                        Ответить
                        • > P.S. Кто знает как на интеле сгенерить -0 не прибегая к битоёбству?
                          Вот так: http://ideone.com/5WtY83
                          Ответить
                          • если верить спызженному отсюда http://goo.gl/ntv1k коду, то вовсе не интел :)
                            http://ideone.com/gMGHZL
                            Ответить
                            • Мы же давно обсудили, что там амд.

                              И:
                              http://liveworkspace.org/code/3F4QzO$0
                              Ответить
                              • что-то везде амд. есть у кого-нить интел, посаны?
                                Ответить
                                • Vendor: GenuineIntel
                                  logical cpus: 8
                                  cpu cores: 8
                                  hyper-threads: false
                                  Ответить
                                  • будем теперь интеловый код у @defecate-plusplus гонять
                                    Ответить
                                    • > будем теперь интеловый код у @defecate-plusplus гонять

                                      http://defecateworkspace.org
                                      http://defecateone.com
                                      Ответить
                                      • >http://defecateworkspace.org
                                        >http://defecateone.com
                                        Сервер не найден ... видимо перегружен кол-вом желающих погонять
                                        Ответить
                                    • но если честно, то...
                                      Vendor: GenuineIntel
                                      logical cpus: 16
                                      cpu cores: 8
                                      hyper-threads: true
                                      Ответить
                                      • > logical cpus: 16
                                        что за зверь?
                                        двухпроцессорный конфиг?
                                        Ответить
                                        • logical cpus = cpu cores * (hyper-threads?2:1)
                                          Ответить
                                        • >что за зверь?
                                          i7-2600, видать из-за того, что ht = true
                                          Ответить
                                          • > i7-2600
                                            у меня как раз почти такой
                                            4 ядра * 2 гипертрединг = 8, но не 16
                                            с другой стороны, в настройках виртуальной машины под линух отдано 8, хотя ползунок способен до 16 - причем больше 8 виртуалбокс жалуется, что число виртуальных цпу превысило тех, которые в наличии на хосте - может в этом дело?
                                            Ответить
                                            • >может в этом дело?
                                              ну я запускал на родной win7. vmwarя точно так же ругается, но тем не менее выхлоп кода я указал честно.
                                              Ответить
                            • AMD, которые поддерживают intel'овскую систему команд в 32х-битном режиме...
                              Intel, которые поддерживают систему команд amd64 в 64х-битном режиме...

                              Смешались в кучу кони, люди...
                              Ответить
                              • Ну АМД на каком-то этапе эволюции вырвалась вперёд и предложила настолько годную систему комманд, что интелу не оставалось ничего другого кроме как лицензировать и запилить её в свои процы.
                                2003-2006 амд в кои-веки выхватила лидерство.
                                Потому альтернативой для intel могла стать потеря существенной доли рынка (ибо переписать весь софт под IA64 невозможно, а популярность 64-битных систем и нужда >4Gb памяти сильно росла) и неприятные перспективы.

                                А вот с амдшными sse5 они специально сделали несовместимые префиксы коммнад, ибо сейчас благодаря core arch они на коне и могут диктовать остальным свои правила.
                                Ответить
                          • А может просто -1*0?
                            Ответить
                            • >-1*0
                              И прав и хуйню сказал
                              http://ideone.com/4JfoYL
                              http://ideone.com/P6jrRG
                              -1*0.0
                              Ответить
                              • Первый код отправляет в принтф мусор. А (double)-1*0 работает.
                                Ответить
                        • -0.0 не работает?
                          http://ideone.com/7N6sNa
                          Ответить
                      • >А что такое «минус Пи»?
                        Мой отрицательный клон, из антивселенной?
                        С бородкой.
                        Ответить
                        • И чсх это тот же угол. Сколько его не минусуй, он не изменится
                          Ответить
                          • > Сколько его не минусуй, он не изменится
                            И тут число Тараса...
                            Ответить
      • length(cross) хуже чем sqrt((A*A)*(B*B)-(A*B)*(A*B))
        И кросс этот только в 3д есть.

        Не, я подумал, кросс это 6 умножений, для длины ещё 3, а тут 3+3+1+3+1, больше.
        Ответить
        • > И кросс этот только в 3д есть.
          Вектора учи.
          Ответить
          • Гумно, что ты знаешь такого, чего не знаю я, про векторное произведение двух векторов, а?
            Ответить
            • То что оно может быть n-мерным
              Ответить
              • Зря ты это сказал, ой зря...

                bormand *готовит попкорн*
                Ответить
              • И как же два вектора в 4х мерномпространстве перемножаются?
                Ответить
                • Вот и попкорн пропал зря. Я думал он хоть приведет какие-то формулы или начнет тебя троллить...
                  Ответить
                  • Гумно само утекло в канализацию.
                    Ответить
                    • Повседневный, бытовой случай.
                      >он хоть приведет какие-то формулы или начнет тебя троллить
                      Ну тогда Тарасу пришлось бы взять в руки вантус.
                      Ответить
                • Три вектора в 4д перемножить векторно можно: просто дописываем в определитель четвёртой строкой третий вектор.

                  В случае же двух векторов третий вектор будет неизвестным, т. е. результат произведения будет не вектором, а линейным оператором над вектором, т. е. тензором второго ранга.
                  Ответить
                  • Как перемножить n-1 вектор в n-мерном пространстве, я знаю.
                    (только в определитель 4й строкой дописываем не третий вектор, а единичные координатные вектора)
                    Но гумно знает способ перемножения именно двух векторов в n-мерном пространстве.
                    Ответить
                    • Перемножить-то можно произвольное (ну почти произвольное) количество векторов, однако результат будет вектором лишь для случая n-1.

                      Просмотрел ещё раз ленту комментариев. Вопрос был именно про векторное произведение двух векторов. Так?

                      Есть универсальная формула произведения двух векторов в произвольном n-мерном пространстве (http://ru.wikipedia.org/wiki/Внешняя_алгебра), но операцию, результатом которой неизменно является тензор второго ранга, назвать векторным произведением язык не повернётся. А раз так, то и векторного произведения двух векторов вне 3д не существует.

                      Интересно, вернётся ли гумно в обсуждение.
                      Ответить
                      • > Есть универсальная формула произведения двух векторов
                        частичное применение
                        Ответить
                        • А выходит, что векторное произведение двух векторов в 3д — это частичное применение смешанного векторного произведения, только вместо третьего вектора пачка единичных векторов.
                          Ответить
                      • > вернётся ли гумно в обсуждение.
                        Оно обладает феноменальным свойством - обсираться и фейлить на ровном месте.
                        Такой талант в унитаз спукает.
                        Ответить
                    • > Но гумно знает способ перемножения именно двух векторов в n-мерном пространстве.
                      Я тоже знаю - dot(a, b). Два вектора, перемножаются, что не так?
                      Ответить
                • В 4х мерном - никак. А например в 7ми мерном запросто.
                  Ответить
                  • Гумно познало алгебру Ли?
                    Ответить
                    • Для 2хмерного случая получится перемножить 2 вектора векторно, но в результате узнаем только псевдоскаляр, а не сам вектор
                      Ответить
                      • Интеграл функции — аналог суммы последовательности. Неформально говоря, (определённый) интеграл является площадью части графика функции (в пределах интегрирования), то есть площадью криволинейной трапеции.

                        Процесс нахождения интеграла называется интегрированием.
                        Ответить
                    • Википедию.
                      Ответить
      • Кстати, важный момент, который, походу, пропустили: этот код херит знак (смотрим внимательно на length).
        В 2D нужно заменить length(cross(...)) на cross(...).z (первым же комментарием на это обратили внимание). Только не просто "достаточно", а "нужно".
        Таким образом возникает вопрос - а в 3D что делать? Так, как написано в посте?
        Ответить
        • > Кстати, важный момент, который, походу, пропустили: этот код херит знак

          Потому что тридэ, там углы не имеют знака.
          Ответить
          • Даже больше: в тридэ знак превращается в направление нормали к плоскости угла, которое как раз и указывает векторное произведение.
            Ответить
      • показать все, что скрытоОтсосу член парню из Владикавказа. Прут наглые хуястые самцы.

        [email protected] (Спросить Тараса)
        Ответить
    • Опаньки, мои глаза мне не изменяют? Тарас забросил совтфарную растеризацию и начал юзать GLSL?
      Ответить
    • Тарас интилехтом давит!
      Ответить
    • Автор сам говно, раз предпочитает еблю с байтами вместо абстракций.
      Ответить
      • Настоящая абстракция вот тут:
        angle_in_radians = angle(o-a, o-b);
        А внутри angle хоть код Тараса, хоть наивная реализация из топика, хоть задроченное на скорость (но не точность) разложение в ряд тейлора до четвертого члена.
        Ответить
      • Универсальный пиздоответ на любую просьбу написать код не через жопу.
        Ответить
        • А я вот и за абстракцию, и за ёблю байтов (только по необходимости, в местах, от которых эта самая абстракция экранирует остальной код).
          Ответить
          • Ясен пень, я тоже за оба уровня, просто понимаешь... это высказывание Кнута принесло столько зла...
            Народ просто стыдится ёбли байтов настолько, что просто психические отклонения какие-то получаются, у некоторых вот замена цепочки ифов на свич - это предварительная блять оптимизация, не, ну не пиздец, это насколько надо ёбнуться, чтобы такую хуйню сморозить?
            Ответить
            • > это высказывание Кнута принесло столько зла...
              На самом деле высказывание то хорошее, годное. И добра оно принесло намного больше чем зла - спасло кучу проектов от погружения в байтоёбскую трясину, из которой часто можно выбраться только полным переписыванием...

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

              P.S. Нет, в байтоёбстве нет ничего плохого, отнюдь. Это как острый скальпель, которым неопытный человек может максимум порезаться, а опытный хирург - спасти чью то жизнь...
              Ответить
              • > Просто некоторые несознательные личности вооружились им в свою защиту, и прикрываются им тогда, когда считают это выгодным

                Вот именно, и это принимает иногда просто такие маразматичные формы, что я просто в шоке с такого.
                Ответить
                • Вот пожалуйста - байтоёбство не к месту: http://govnokod.ru/10400. Это даже не оптимизация, substring всяко бы работал быстрее (не было бы лишнего копирования строки), это просто бесполезное байтоёбство.
                  Ответить
        • показать все, что скрытоОтсосу член парню из Владикавказа. Прут наглые хуястые самцы.

          [email protected] (Спросить Тараса)
          Ответить
    • Говна не вижу. Ты не говорил что код для х86. На моей платформе acos быстрее, а atan2 тормозит. Почему ты не пишешь кросплатфоременный код? И вообще этот код из шейдеров, где векторные операции в пайпелайне шейдерного процессора заоптимизированны по самый не балуй.
      Ответить
      • > На моей платформе acos быстрее, а atan2 тормозит.
        Как называется твоя платформа?
        Кстати, обсуждаемый код ещё и две нормализации делает.
        Ответить
        • > Кстати, обсуждаемый код ещё и две нормализации делает.
          Есть случаи, когда всего одну. Один из векторов мог быть нормализован заранее.
          Ответить
          • Да даже то, что есть, можно переписать с одним корнем в одном знаменателе, а не два корня в двух знаменателях, и независимо от того, является ли один из векторов уже нормализованным.
            Ответить
            • > а не два корня в двух знаменателях
              Даже в шести. Т.к. normalize всяко делит каждый член на тот самый корень.

              P.S. Хотя на самом деле normalize может и не делить, а умножать - не зря же Кармак писал свой знаменитый 1/sqrt(x).
              Ответить
              • Надоели своим Кармаком. Не он это придумал.
                Просто заюзал в известном и коммерчески успешном прожекте.
                Вот в чем отличие: у Тараса низкоуровневое дрочево - цель. А у Кармака средство.
                Ответить
                • > у Тараса низкоуровневое дрочево - цель
                  лолшто
                  Ответить
                  • Ну посраться, показать свою круть - никто не вокруг не осилил теоремы косинусов, а ты вот знаешь.
                    Для такой простой темы под 200 постов это перебор.
                    Ответить
                    • Да откуда ж я знал?
                      Я думал, поржут, будет 10 постов, и всё.
                      А тут неосиляторов большая часть оказалась...
                      Ответить
                      • http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter05.html
                        Это всё идет из таких мануалов, а по сети именно тот способ что ты опубликовал и гуляет. Человек глянул - dot есть косинус между векторами. Мышление далее автоматически предлагает acos.

                        Только вот далее в твоей аргментации есть одна проблема. Гумно меня в этом опередил.
                        Что быстрее acos или atan - зависит от платформы.
                        http://thokling.multiply.com/journal/item/46
                        И тут чрезвычайно много нюансов, а в итоге производительность больше откушивают непопадания в кеш, медленная память, чем математическая операция арккосинус.
                        Ответить
                        • (из второй ссылки)
                          >But recently I was curious about actually calculating PI to get more precision in my OpenGL stuff.
                          Лол.
                          Ответить
                        • > Что быстрее acos или atan - зависит от платформы.
                          Пример?
                          > http://thokling.multiply.com/journal/item/46
                          И чё?
                          Там формула
                          pi/2 - arctg(a/sqrt(1-a*a))
                          да?
                          И как там случай +- 1 реализован? Вбит явно как отдельный случай? Тогда что удивительного?
                          Ответить
                          • >Вбит явно как отдельный случай?
                            Сомневаюсь. Думаю там всё-таки оно внутри считается.
                            Поучительность примера в другом. Бутылочным горлышком оказалась совсем не функция обратной тригонометрии, а другое: либо конвертация с инта в флоат, либо умножение (в чем я сомневаюсь).
                            Это именно преждевременная оптимизация.

                            Но в общем таки ты прав. Теоретически твой способ смотрится лучше и кощернее.
                            Практика же предполагает бенчи.
                            Ответить
                            • > Сомневаюсь. Думаю там всё-таки оно внутри считается.
                              Я намекаю на то, что если там такая формула, то в неё +-1 не влазят. Поэтому сдаётся мне, что это специальный случай.
                              Ответить
                      • >Что быстрее acos или atan2
                        selffix
                        Ответить
        • >обсуждаемый код ещё и две нормализации делает
          Тут спору нет.

          > "потому что Кнут сказал, что оптимизация - зло".
          Он говорил о преждевременной оптимизации.
          Ответить
          • А ещё он говорил, что она - зло только в 97% случаев.
            Но кому эти подробности нужны, когда надо оправдать свой быдлокод?
            Ответить
        • показать все, что скрытоОтсосу член парню из Владикавказа. Прут наглые хуястые самцы.

          [email protected] (Спросить Тараса)
          Ответить
    • Говно:
      angle = acos(dot(a,b)/norm(a)*norm(b))
      Охуенно:
      angle = atan2(norm(cross(a,b)), dot(a,b))

      Тред не читал, слишком уныло.
      Ответить
    • - Значит так, - начал он, отстранившись от меня, обалдевшего и снова "немого", - ты ключи мне сам дал, помнишь? Это, - показал он на цветы и стол, - цветы моему любимому и праздничный ужин; а праздничный он потому, что теперь я буду жить у тебя.
      Ответить

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