- 1
angle_in_radians = acos(dot(normalize(o-a), normalize(o-b)));
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+21
angle_in_radians = acos(dot(normalize(o-a), normalize(o-b)));
Векторы такие сложные, а операции с ними так трудно запомнить, что даже игроделы не могут это сделать.
Ты знаешь, могло быть и хуже:
Или даже Scala-style (как-то так, ждем Романа):
[email protected] (Спросить Тараса)
Вектора учи.
[email protected] (Спросить Тараса)
Через 5 лет такими темпами 95% будет думать, что код
- нормальный
А теперь расскажи, где в собственно посте говно.
Минусаторы, идите НААААХУЙ из программирования, и возвращайтесь только выучив до мозга костей всё, что связано с векторами.
Что, правда?
Второй - гумно?
А как делаешь арккосинус ты?
Сопроцессор умеет только fpatan.
Решение через многочлен, через 10 умножений? Думаешь сейчас это будет быстрее?
Хорошо, ты прав, в x86 только такая инструкция есть.
Тем не менее, лучший вариант - в студию.
Saint-Pascal, QC · http://www.tbsoftware.com
Можно ссылочку на профиль?
Очень похоже.
Вместо "кококорукиизжопыкококовонизпрофесси и" лучше бы привел пример того как ты считаешь правильно и указал почему именно так. Аргумент "это ж очевидно" не принимается.
А если тестами подтвердишь, так вообще шикарно будет.
Минусовал конкретно 167425 и 167424. Топик и остальные содержательные комменты плюсанул.
Ты считаешь, что игродел, не знающий вектора, не должен вылететь из профессии?
Кстати, есть ли реально хоть одна область применения пузырьковых сортировок?
тест для сравнения производительности сортировок
Безусловно.
Но если начинать проект с задрачивания "узких мест" - то этот проект никогда не взлетит. Поверь мне, Тарас. К тому же на начальном этапе не всегда понятно, где же будут эти самые узкие места.
Имхо, задумываться о константах в производительности нужно уже после того как ясны основные идеи, и написан какой-никакой остов проекта.
Здесь же я вижу просто набросок, который автор когда-нибудь перепишет по-нормальному, когда увидит, что это место является узким, и все-таки выучит векторы.
Находить угол нормально, а не жопой арккосинусом - это не задрачивание узкого места, это так же естественно, как использовать кусорт вместо пузырька.
Если б на гд.ру были подписи, то я бы поставил туда "использую путырёк вместо кусорта, потому что Кнут сказал, что оптимизация - зло".
Жупел неосиляторов нормальных алгоритмов.
А для новичка? Ему сейчас важнее понять общие концепции, понять как собрать из всех этих разрозненных знаний работоспособную игру, а знания о том что углы считают через atan2, а не через acos - они придут с опытом, если он конечно не посчитает все это слишком сложным, и не уйдет в дворники...
А вот если он будет сосредотачивать внимание именно на таких моментах, а не на общей концепции - его игра никогда не увидит свет, и появится еще один недопиленный движок, коих сотни на том же ГД...
У проекта, который неопытный программист попытается сделать сразу же идеальным, почти нет шанса на жизнь.
Этот говнокод не новичок предложил, понимаешь? Я б тогда его не выложил. Это предложил опытный человек на вопрос новичка, и в этом-то пиздец и заключается.
А вот это пиздец. Теперь полностью солидарен с Тарасом. Учить новичков говну нельзя.
Самое забавное - тот самый новичок начал с арктангенса, а местные гуро ему насоветовали косинус и "смотреть на знак векторного произведения"...
P.S. Векторное произведение только ради его знака это говнокод намного сильнее чем тот, который в топике.
XD
> Векторное произведение только ради его знака это говнокод намного сильнее чем тот, который в топике.
Кстати, нет. Вменяемую альтернативу я не нашёл. Хотя искал: http://www.gamedev.ru/code/forum/?id=171290&page=5#m60
obvious fix
Лабы.
Ещё как есть. Представь себе scoreboard какой-нибудь онлайн игры. Игроков сортировать по очкам выгоднее всего именно пузырьком. Чего уж там, Unreal Tournament на клиентах каждый тик его сортирует (при условии, что он открыт), и ничего.
В декоративных целях - конечно. Пузырьковая сортировка красива и не сильно отвлекает от просмотра таблички.
Пузырек очень хорошо себя ведет тогда, когда список уже отсортирован. А большую часть времени список действительно отсортирован.
Кроме того, какое изменение приводит к тому, что список нужно пересортировать? Когда игрок набрал сколько-то очков в выбился вперед. Его просто нужно поменять местами с другим игроком. Именно таким образом пузырек и сортирует.
Теперь понятно. Спасибо.
Не должен. Каждый человек чего-то не знает, в этом нет ничего плохого, особенно если он начинающий. Сам вот найди свой код 5-10 летней давности, и почитай его, увидишь что годы прошли не зря ;)
Вот если он не хочет учиться и разбираться в том, с чем ему приходится работать - вот тогда гнать его из профессии ссаными тряпками.
Хорошо, геймдизайнер, скриптовик, художник итд не должен. А тот, кто пишет движок, особенно узкие места - знать обязан. И если он спрашивает "где говно", то это пиздец, полный пиздец.
Представь, что ты попал в умественно отсталый мир, где все знают только пузырьковую сортировку и на твои вопрсы отвечают "а что такого-то". Ты на местный говнокод шлёшь чужой код с пузырьком, тебе тоже отвечают, что говна не видят. Ты в полном ахуе пишешь "учи алгоритмы, быдло, а пока не выучишь, съеби из профессии", а они тупо удивляются.
>а пока не выучишь, съеби из профессии"
со своим уставом, да в монастырь ...
И в чем же тут говнокод? В самой сортировке пузырьком говна нет, как и в любом другом наивном алгоритме. В коде из топика, выдранном из контекста, тоже никакого говна нет - это просто наивная реализация алгоритма, скопированная из школолольного учебника по математике.
В наивных алгоритмах нет говна, Тарас. До тех пор пока их не начинают продвигать как "оригинальные и эффективные" решения.
Есть. Если его продвигает тот, кто должен быть в теме - то есть. А если он уже успел где-то подхватить лозунг про оптимизацию - то всё пропало, он необучаем, у него есть отмазка на всё.
Тарас, ну ты же понимаешь, что специализации тут у всех разные. Кто-то с СУБД целыми днями работает, кто-то по хардкору пишет прошивки под контроллеры, кто-то занимается сайтами...
Да и такое знание про поиск угла - это не провалы в геометрии и векторах, это провалы в знании особенностей платформ, на которых нет арксинуса и арккосинуса. (Но при этом есть шустрые алгоритмы для приближенного их вычисления, которые раза в 4 быстрее твоего арктангенса, и дают 4 верных цифры, которых вполне хватит для многих геймдевовских применений).
НО! Разве был бы здесь тогда весь этот уютненький срач который так приятен для Тараса, поверьте, и разве нахватал бы он тогда сначала минусов, потом плюсов, потралил бы гумно? Нет. Это был бы просто топик из разряда унылых, которые даже более Б-гомерзки, нежели утонувшие.
Я еще зеленым новичком крепко запомнила слова одного матерого и успешного дядьки (альтернатива 3д, ага) - мы не оптимизируем миллисекунды в циклах, мы оптимизируем архитектуру. Не ручаюсь за точность пересказа правда, но смысл такой. Время можно потратить лучше чем надрачивая до блеска алгоритмы которые вообще неизвестно нужны ли.
Например, брать угол через арккосинус.
Тарас, черезжопие в архитектуре может (и будет) просаживать производительность намного больше, чем твой несчастный арккосинус... Он медленнее арктангенса на жалкие проценты. А вот кривая архитектура, из-за которой, к примеру, рисуются все полигоны вместо нужных - это порядки, а не проценты.
И ускорив вдвое вычисление угла, которое занимало, к примеру, 5% от общего времени работы, ты получишь выигрыш всего на 2.5%... Оно того стоило?
Любой черезжопице, Тарас, есть одно оправдание - идеальная программа разрабатывается бесконечно долго.
Реальную же программу нужно написать за ограниченный срок. Идеальный проект должен быть идеальным, без единого изъяна. Реальный же проект просто имеет требования, в которые нужно уложиться.
К примеру:
Идеальный проект: "Движок должен рендерить максимально быстро".
Реальный проект: "Движок должен рендерить сцены определенного вида с ограниченным количеством объектов на GT8600 с фпс не ниже 60".
Реальный проект будет разработан за реальный срок, а идеальный не выйдет дальше первой демки, в которой крутится какой-нибудь кубик.
Посмотри на геймдев Тарас... Что ты хочешь? Идеальный код, которого ты никогда не увидишь в действии? Или же игру, в которую можно будет поиграть, и порадоваться за успехи земляка, написавшего ее?
есть специфические области, в которых специфический программист не имеет права плавать
если это 2д/3д, то работа с координатами должна быть эффективной
хотя лично я линейную алгебру проходил 10 лет назад и вообще ничего из нее не помню - потому что специфика другая
но, уверен, в 2д/3д всевозможные рецепты по поворотам, трансформациям, нормализациям и прочим ациям уже давно разжеваны, поэтому программисту надо не велосипедить, а подглядывать в справочник
и программа будет написана тем быстрее, чем быстрее он ориентируется в этом справочнике - и тем быстрее, если справочник у него в голове
... а взять уже давным-давно написанную им (или кем-то еще) функцию из библиотечки, которая была им наработана во время написания прошлых проектов.
> есть специфические области, в которых специфический программист не имеет права плавать
Ну да, тут согласен. Но это больше к профессионалам относится, чем к контингенту геймдева, который охаивает Тарас. Там 99% свою игру хотя бы до играбельного состояния допилить, я уж молчу про шлифовку линейной алгебры.
Да туда тоже вроде как профи ходят. Ну судя по их уверенности в своём проффесионализме.
Профи - это как минимум те, у кого уже есть готовые игры или хотя бы готовый двиг для нее. Как человек не дописавший свою единственную игру до играбельного состояния может считаться профи в разработке игр?!
1) Я где-то называл себя профи геймдева?
2) Да, ко вторым, а ты, очевидно, со своего острова к нам пишешь?
P.S. Ты считаешь, что человек может называть себя профи в какой-то практической области ничего там толком не добившись и зная только теорию?
А где я назвал себя профи? Просто говорю, что Тарас, мнящий себя профи не нужен. Нужен Тарас, являющийся профи.
Хм, так это было не мне а Тарасу?
P.S. Большая человеческая просьба - цитируй кусок фразы, когда текст превращается в стену, а то тут уже хуй поймешь кто кому что пишет.
> bormand, ты - хуй!
bormand 2 часа назад #
> это я то хуй?
LispGovno 2 часа назад #
> да не ты, а Тарас!
bormand 2 часа назад #
> а, тогда всё верно
всё верно, только вот уже 5 часов назад
Вот поэтому я из-под guest'а пишу "только что".
Ну я дерево вижу. Может тебе плагин какой нужно поставить, чтобы браузер стал нормально дерево отображать? Говорят в сети есть даже плагин, что линии дорисовывает к дереву.
А вот так можно без плагина:
http://www.youtube.com/watch?v=zqHV625EU3E
Когда я вижу код с арккосинусом, я испытваю то же, что и при виде кода с
if (a.ToString()=="TRUE"), новички вообще не понимают код if(a) , у них это "если "а" - если "а" что? Вот если а - истино мне понятно".
А пиздец в том, что из дохренищи программистов, с которыми я обсудил этот момент, большинство тоже не считает решение через арккосинус черезжопным! Это говорит о том, что из этих профи у большей части серьёзный пробел в такой элементарной базовой фигне, как векторы!
А ещё меня бесит, когда этой хуйнёй про архитектуру оправдывают более медленный код, даже если явно более мутный. Это уже извращение мышления, подмена понятий, шиза какая-то, когда более медленное автоматом считается более читабельным.
Только вот если это относится к программисту из игростроя, то это непригодный программист.
Если это относится к разработчику самого движка или шейдеров. Тот, кто пишет скрипты для "AI", или другие модули, не имеющие отношения к геометрии и векторам вообще-то не обязан знать досконально линейную алгебру.
P.S. А т.к. среднестатистическому геймдевовцу приходится работать в одиночку, и писать и скрипты и шейдеры, и движок, и UI, да еще и рисовать - несознательное использование арккосинуса и других наивных формул можно простить.
То знать формулы он должен, примерно так же, как он должен не писать if b=true
Ну-ну. Если он во всех областях, требуемых в геймдеве, настолько про... то я не знаю чего он забыл на геймдев.ру. Я думаю среди себе подобных ему было бы намного интересней.
Не знаю что еще ответить, Тарас. Ты и прав и не прав.
Прав в том плане, что движок задрочившего линейку (и, в обязательном порядке, ее практические применения для машграфики на конкретных платформах) будет шустрее и красивей.
Не прав в том плане, что линейка это только малая часть всех знаний, которые потребуются, чтобы реализовать 3d игру целиком. И новичку скорее нужны базовые знания во всех этих областях, чем доскональные в одной, и нулевые в других.
Но наши экономят создание простых объектов (кеши) - это страшнее. При этом при загрузке пол тысячи квестов при старте игры каждый отправляет сигнал об обновлении, несколько тысяч видов ресурсов делают то же самое.
Новичку есть смысл делать самому, чтобы лучше знать кишки, но если советчики считают себя достаточно квалифицированными не только чтобы давать советы, но и ещё и защищать своё говно, но при этом школьную линейку нихрена не знают, то это очень плохо.
да не, скорее проблема как раз в том, что в школах\универах матан и алгоритмы задрачивают до зубрежки, а вот планированию\выбору инструментов не учат.
в итоге дрочат на ООП и наносекунды.
Да причем тут векторы? С точки зрения математики эта формула верна.
А вот для вычислений на эвм она не оптимальна. Поэтому, имхо, надо обвинять в неумении оптимизировать вычисления на практике, а не в незнании теории (хотя и оно, скорее всего, имеет место быть).
А вот если большая часть программистов из игростроя не знает, как найти угол и делает это через задницу, то русский игрострой действительно неадекватен и наводнён быдлятинкой, которую надо отправить либо на матан на переобучение, либо на метан.
В общем, пока что код выдран из контекста.
Вот если на это будет указано как на узкое место в текущей реализации, а кодер скажет "а иначе никак" - тогда да, посыл в учебник уместен. А до тех пор рано.
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
Итого:
Так что ли?
P.S. А, ну да, у меня лишнее извлечение корня и возведение в квадрат. Поэтому так:
Ну ладно, знаменатель хоть правильный.
И да, делить не обязательно, атан2 принимает сразу два аргумента.
Ой, я забыл сказать, тема про 2д
Теперь ты сделал хуже, чем было, лишнее деление
Пост назад ты дал почти верный ответ для многомерного случая.
[email protected] (Спросить Тараса)
P.S. Кстати, почему o-a? a-o было бы логичнее.
Моё мнение об общем уровне программистов в России упало на 1 пункт.
>В школу пусть идёт, если не знает такие вещи
>возвращайтесь только выучив до мозга костей всё
У меня прямо ностальгия по матану в университете.
Кому нужно только значение, без знака, те пусть сами модуль берут.
Но в 80% случаев знак нужен.
P.S. Не могу вспомнить, в какую сторону включительно, но должен покрывать все углы.
UPD: [−π,π], т.к. оно оказывается еще на знаки нулей смотрит.
P.S. Кто знает как на интеле сгенерить -0 не прибегая к битоёбству?
Вот так: http://ideone.com/5WtY83
http://ideone.com/gMGHZL
И:
http://liveworkspace.org/code/3F4QzO$0
logical cpus: 8
cpu cores: 8
hyper-threads: false
http://defecateworkspace.org
http://defecateone.com
>http://defecateone.com
Сервер не найден ... видимо перегружен кол-вом желающих погонять
Vendor: GenuineIntel
logical cpus: 16
cpu cores: 8
hyper-threads: true
что за зверь?
двухпроцессорный конфиг?
почем свой 8 ядерный ксеон брал?
i7-2600, видать из-за того, что ht = true
у меня как раз почти такой
4 ядра * 2 гипертрединг = 8, но не 16
с другой стороны, в настройках виртуальной машины под линух отдано 8, хотя ползунок способен до 16 - причем больше 8 виртуалбокс жалуется, что число виртуальных цпу превысило тех, которые в наличии на хосте - может в этом дело?
ну я запускал на родной win7. vmwarя точно так же ругается, но тем не менее выхлоп кода я указал честно.
Intel, которые поддерживают систему команд amd64 в 64х-битном режиме...
Смешались в кучу кони, люди...
2003-2006 амд в кои-веки выхватила лидерство.
Потому альтернативой для intel могла стать потеря существенной доли рынка (ибо переписать весь софт под IA64 невозможно, а популярность 64-битных систем и нужда >4Gb памяти сильно росла) и неприятные перспективы.
А вот с амдшными sse5 они специально сделали несовместимые префиксы коммнад, ибо сейчас благодаря core arch они на коне и могут диктовать остальным свои правила.
И прав и хуйню сказал
http://ideone.com/4JfoYL
http://ideone.com/P6jrRG
-1*0.0
http://ideone.com/7N6sNa
Мой отрицательный клон, из антивселенной?
С бородкой.
И тут число Тараса...
И кросс этот только в 3д есть.
Не, я подумал, кросс это 6 умножений, для длины ещё 3, а тут 3+3+1+3+1, больше.
Вектора учи.
bormand *готовит попкорн*
>он хоть приведет какие-то формулы или начнет тебя троллить
Ну тогда Тарасу пришлось бы взять в руки вантус.
В случае же двух векторов третий вектор будет неизвестным, т. е. результат произведения будет не вектором, а линейным оператором над вектором, т. е. тензором второго ранга.
(только в определитель 4й строкой дописываем не третий вектор, а единичные координатные вектора)
Но гумно знает способ перемножения именно двух векторов в n-мерном пространстве.
Просмотрел ещё раз ленту комментариев. Вопрос был именно про векторное произведение двух векторов. Так?
Есть универсальная формула произведения двух векторов в произвольном n-мерном пространстве (http://ru.wikipedia.org/wiki/Внешняя_алгебра), но операцию, результатом которой неизменно является тензор второго ранга, назвать векторным произведением язык не повернётся. А раз так, то и векторного произведения двух векторов вне 3д не существует.
Интересно, вернётся ли гумно в обсуждение.
частичное применение
Оно обладает феноменальным свойством - обсираться и фейлить на ровном месте.
Такой талант в унитаз спукает.
Я тоже знаю - dot(a, b). Два вектора, перемножаются, что не так?
Процесс нахождения интеграла называется интегрированием.
В 2D нужно заменить length(cross(...)) на cross(...).z (первым же комментарием на это обратили внимание). Только не просто "достаточно", а "нужно".
Таким образом возникает вопрос - а в 3D что делать? Так, как написано в посте?
Потому что тридэ, там углы не имеют знака.
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
Народ просто стыдится ёбли байтов настолько, что просто психические отклонения какие-то получаются, у некоторых вот замена цепочки ифов на свич - это предварительная блять оптимизация, не, ну не пиздец, это насколько надо ёбнуться, чтобы такую хуйню сморозить?
На самом деле высказывание то хорошее, годное. И добра оно принесло намного больше чем зла - спасло кучу проектов от погружения в байтоёбскую трясину, из которой часто можно выбраться только полным переписыванием...
Просто некоторые несознательные личности вооружились им в свою защиту, и прикрываются им тогда, когда считают это выгодным, тем самым дискредитируя вполне разумную мысль.
P.S. Нет, в байтоёбстве нет ничего плохого, отнюдь. Это как острый скальпель, которым неопытный человек может максимум порезаться, а опытный хирург - спасти чью то жизнь...
Вот именно, и это принимает иногда просто такие маразматичные формы, что я просто в шоке с такого.
[email protected] (Спросить Тараса)
Как называется твоя платформа?
Кстати, обсуждаемый код ещё и две нормализации делает.
Есть случаи, когда всего одну. Один из векторов мог быть нормализован заранее.
Даже в шести. Т.к. normalize всяко делит каждый член на тот самый корень.
P.S. Хотя на самом деле normalize может и не делить, а умножать - не зря же Кармак писал свой знаменитый 1/sqrt(x).
Просто заюзал в известном и коммерчески успешном прожекте.
Вот в чем отличие: у Тараса низкоуровневое дрочево - цель. А у Кармака средство.
лолшто
Для такой простой темы под 200 постов это перебор.
Я думал, поржут, будет 10 постов, и всё.
А тут неосиляторов большая часть оказалась...
Это всё идет из таких мануалов, а по сети именно тот способ что ты опубликовал и гуляет. Человек глянул - 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.
Лол.
Пример?
> http://thokling.multiply.com/journal/item/46
И чё?
Там формула
pi/2 - arctg(a/sqrt(1-a*a))
да?
И как там случай +- 1 реализован? Вбит явно как отдельный случай? Тогда что удивительного?
Сомневаюсь. Думаю там всё-таки оно внутри считается.
Поучительность примера в другом. Бутылочным горлышком оказалась совсем не функция обратной тригонометрии, а другое: либо конвертация с инта в флоат, либо умножение (в чем я сомневаюсь).
Это именно преждевременная оптимизация.
Но в общем таки ты прав. Теоретически твой способ смотрится лучше и кощернее.
Практика же предполагает бенчи.
Я намекаю на то, что если там такая формула, то в неё +-1 не влазят. Поэтому сдаётся мне, что это специальный случай.
selffix
Тут спору нет.
> "потому что Кнут сказал, что оптимизация - зло".
Он говорил о преждевременной оптимизации.
Но кому эти подробности нужны, когда надо оправдать свой быдлокод?
[email protected] (Спросить Тараса)
angle = acos(dot(a,b)/norm(a)*norm(b))
Охуенно:
angle = atan2(norm(cross(a,b)), dot(a,b))
Тред не читал, слишком уныло.
http://en.wikipedia.org/wiki/Inverse_trigonometric_functions
С другой стороны можно пытаться кэшировать dot и cross, но тогда если положение источника света изменится придется пересчитывать кэш. Как-то мутно все это.
http://http.developer.nvidia.com/Cg/atan2.html
Для движка ведь далеко не везде нужна точность больше 3-4 знаков, для освещения имхо и 3 вполне сойдет.
P.S. На соседних страницах есть такие же acos и asin.
>Говно
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)
[email protected] (Спросить Тараса)