Как стать автором
Обновить
104
0
Русанов Семен @nightrain912

Программист

Отправить сообщение

Изготавливаем самодельный электролюминесцентный индикатор

Время на прочтение11 мин
Количество просмотров22K
В прошлый раз я показывал вам свою коллекцию советских электролюминесцентных индикаторов. Я капитально подсел на эту тему и последние три месяца пытаюсь изготовить самодельный индикатор удовлетворительного качества.

Дерпи Хувс ловит маффины. Стекло. Эпоксидка. Зелёный люминофор.

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

Думаю ещё через несколько месяцев я смогу написать уже Исчерпывающее руководство по изготовлению самодельных индикаторов, с подробным обоснованием всех возможных комбинаций материалов, но пока же ограничусь описанием проведённых экспериментов и полученными текущими результатами^
Читать дальше →
Всего голосов 206: ↑206 и ↓0+206
Комментарии51

Один бинарник, любое окружение. Магия чистого C

Время на прочтение5 мин
Количество просмотров34K


Как мы представляем себе кроссплатформенность? Мы пишем программу на языке, который либо компилируется в исполняемый файл отдельно для каждой поддерживаемой платформы, либо использует разновидность виртуальной машины вместо бинарника (и тогда эта среда должна присутствовать в целевых системах). Есть также и низкоуровневые языки, на которых писать серьёзные программы менее удобно, чем на высокоуровневых монстрах со своими компиляторами или рантаймами, но зато такие программы менее требовательны к предустановленному софту или наличию ОС в принципе, как и менее разборчивы в архитектуре. И всё же, есть возможность писать один и тот же код и собирать один и тот же бинарь под все популярные архитектуры и ОС (и даже bare metal), и эта возможность появилась благодаря гениальной Justine Tunney. Она написала Cosmopolitan, библиотеку на C, позволяющую исполнять один и тот же код на любой машине, подобно Java… но без какого-либо предустановленного интерпретатора или виртуальной машины! Один и тот же скомпилированный файл может исполняться как минимум в любом дистрибутиве Linux, на Mac OS, Windows NT, FreeBSD, OpenBSD, и NetBSD и на bare-metal на x86 и ARM*. Это настоящая магия.
Всего голосов 133: ↑123 и ↓10+113
Комментарии63

Вычисляем баллистические траектории в играх

Время на прочтение7 мин
Количество просмотров29K

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

Когда возникала эта проблема, я обычно брал ручку с блокнотом и решал её с нуля. Мне это надоело. Чтобы сэкономить себе из будущего немного времени, я выложу это решение в Интернет. Кроме того, я расскажу о необычной «фишке», которую предпочитаю использовать из соображений эстетики.

Уравнения движения


Задача всегда начинается одинаково. У нас есть стреляющий и цель: под каким углом нужно стрелять снарядом, чтобы он поразил цель?

Существует четыре основных уравнения движения. В статье мы воспользуемся только одним.
Всего голосов 29: ↑27 и ↓2+25
Комментарии18

Когда путь важнее цели. Сколько нам еще остается до полноценной термоядерной энергетики?

Время на прочтение10 мин
Количество просмотров30K


Так выглядел строящийся комплекс ITER в феврале 2020 года. ITER может стать первой установкой, которая позволит получить «горящую» или самоподдерживаемую термоядерную плазму. В этом строящемся сооружении будут расположены термоядерный токамак и системы его обеспечения. Фото из архива ITER

На Хабре не обошли вниманием новость о том, что Китай запустил новый токамак, HL-2M Tokamak. Эта новость особенно интересна тем, что освежает в памяти историю о печальном долгострое нашего века — будущем термоядерном реакторе ITER, который возводится силами всей Европы на юге Франции и должен стать первым подобным устройством, которое могло бы производить больше энергии, чем потребляет само. Тем не менее, с сожалением отметим, что и HL-2M, и даже ITER удручающе далеки от полноценной термоядерной электростанции.

Не будем вдаваться в детали устройства токамаков и самого ITER – эти темы в изобилии рассмотрены во всевозможных источниках, например, в вышеупомянутой хаброновости. Под катом речь пойдет о том, какой путь открывает перед нами ITER (в переводе с латыни «iter» означает «путь»), и почему этот путь оказался извилист как восьмерка стелларатора.
Читать дальше →
Всего голосов 157: ↑154 и ↓3+151
Комментарии145

Теперь я не могу сделать даже маленький сайт

Время на прочтение3 мин
Количество просмотров153K


Короче, я хорошо помню, как в 2013 году я сел и написал небольшой сайт за один день.

Это был сайт про события моего родного города. На одной странице выводились все мероприятия на грядущую неделю.

Я сделал страничку с мероприятиями, и небольшую админку, где они редактировались. У меня была книжка по PHP, поэтому сайт я написал на PHP, подключил MySQL-базу, сверстал на HTML и CSS, и залил на виртуальный хостинг. Сайтом пользовались, а я усердно добавлял мероприятия каждое утро, пока не ушёл в армию, не оставив никого на поддержку. Так сайт и почил.

Идея сайта всё ещё казалась хорошей, и я решил его возродить. Казалось бы, бери и делай, но против меня играло то, что я толком не помнил PHP, и уже успел набраться опыта разработки в очень больших, средних и маленьких компаниях.

Я решил взяться за дело и стал думать.
Читать дальше →
Всего голосов 401: ↑370 и ↓31+339
Комментарии319

НЛО воровало аватарки здесь

Время на прочтение2 мин
Количество просмотров29K
image

24 июня Хабр отмечал международный день НЛО. Но это не точно, потому что некоторые его празднуют и 2 июля. В принципе, ничего не помешает отметить дважды — команда Хабра, возможно, так и поступит. По традиции в этот день люди запасаются телескопами, выезжают на природу, избегают городской засветки и смотрят на небо в поисках необъяснимого.

Наверняка мы знали только одну вещь. Чтобы встретиться с НЛО, достаточно было упомянуть юзера UFO в комментариях к этому посту.
Читать дальше →
Всего голосов 88: ↑85 и ↓3+82
Комментарии399

Создание Outline эффекта в Unity Universal Render Pipeline

Время на прочтение15 мин
Количество просмотров27K
В Universal Render Pipeline, создавая свои RendererFeature, можно легко расширить возможности отрисовки. Добавление новых проходов в конвеер рендеринга позволяет создавать различные эффекты. В этой статье, используя ScriptableRendererFeature и ScriptableRenderPass, создадим эффект обводки объекта (Outline) и рассмотрим некоторые особенности его реализации.

Outline Effect

Читать дальше →
Всего голосов 20: ↑20 и ↓0+20
Комментарии3

Вычисление 2D-коллизий: алгоритм Гилберта — Джонсона — Кирти

Время на прочтение11 мин
Количество просмотров21K
image

Я занялся изучением процессов распознавания коллизий, и это привело меня к алгоритму Гилберта — Джонсона — Кирти (Gilbert-Johnson-Keerthi, GJK).

Все примеры кода в посте написаны на TypeScript. В примерах используются созданные мной структуры, которые подробно в посте не рассмотрены. Они просты и их можно посмотреть в репозитории GitHub:

  • Vector
  • IShape
  • Collision

Весь код из поста хранится в репозитории GitHub:

https://github.com/jthomperoo/gjk-ts-implementation

Пост написан на основании этой статьи и рекомендованного в ней видео:


Введение


GJK — это алгоритм, предназначенный для определения пересечения двух выпуклых фигур. Он прост и реализуется при помощи обобщённой «вспомогательной функции», позволяющей использовать более общий подход — аналогичным образом можно обрабатывать многоугольники и фигуры, состоящие из кривых, например, эллипсы.
Читать дальше →
Всего голосов 32: ↑32 и ↓0+32
Комментарии14

Обратные задачи аффинных преобразований или об одной красивой формуле

Время на прочтение12 мин
Количество просмотров24K
В этой статье я расскажу об одной необычной формуле, которая позволяет взглянуть под новым углом на аффинные преобразования, а особенно на обратные задачи, которые возникают в связи с этими преобразованиями. Обратными я буду называть задачи, требующие вычисления обратной матрицы: нахождение преобразования по точкам, решение системы линейных уравнений, преобразование координат при смене базиса и т.д. Сразу оговорюсь, что в статье не будет ни фундаментальных открытий, ни уменьшения алгоритмической сложности — я просто покажу симметричную и легко запоминающуюся формулу, с помощью которой можно решить неожиданно много ходовых задач. Для любителей математической строгости есть более формализованное изложение здесь [1] (ориентированно на студентов) и небольшой задачник вот здесь [2].
Поехали!
Всего голосов 48: ↑48 и ↓0+48
Комментарии25

Как генерируются подземелья в Enter The Gungeon

Время на прочтение7 мин
Количество просмотров22K
В последнее время я много играл в Enter The Gungeon. Это потрясающая, ужасно сложная игра в жанре bullet hell, сильно напомнившая мне Binding of Isaac. Но чем больше я играл в неё, тем больше осознавал малозаметную гениальность дизайна подземелий.


Существует много процедурных генераторов, создающих логичные схемы уровней, обеспечивающие правильный темп игры и вознаграждение игроков, и есть другие генераторы, создающие уровни с петлями и компактные схемы. Но редко можно встретить в одной игре оба типа. Единственная известная мне игра, в которой была попытка реализации подобного — это Unexplored.

Поэтому я, естественно, запустил декомпилятор, чтобы Gungeon раскрыла мне все свои секреты. В этой статье я поделюсь с вами тем, что мне удалось найти.
Читать дальше →
Всего голосов 31: ↑31 и ↓0+31
Комментарии3

Процедурная генерация планет

Время на прочтение19 мин
Количество просмотров38K

От переводчика:
Представляю вашему вниманию статью авторства Andy Gainey, в прошлом независимого разработчика игровых инструментов, ныне сотрудника Paradox Development Studio. На мой взгляд, автор играючи создал один из лучших процедурных генераторов планет с открытым исходным кодом.

Читать дальше →
Всего голосов 96: ↑94 и ↓2+92
Комментарии17

Лабиринты: классификация, генерирование, поиск решений

Время на прочтение44 мин
Количество просмотров81K

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

Классификация лабиринтов


Лабиринты в целом (а значит, и алгоритмы для их создания) можно разбить по семи различным классификациям: размерности, гиперразмерности, топологии, тесселяции, маршрутизации, текстуре и приоритету. Лабиринт может использовать по одному элементу из каждого класса в любом сочетании.
Читать дальше →
Всего голосов 82: ↑82 и ↓0+82
Комментарии13

Методы наименьших квадратов без слёз и боли

Время на прочтение10 мин
Количество просмотров49K


Итак, очередная статья из цикла «математика на пальцах». Сегодня мы продолжим разговор о методах наименьших квадратов, но на сей раз с точки зрения программиста. Это очередная статья в серии, но она стоит особняком, так как вообще не требует никаких знаний математики. Статья задумывалась как введение в теорию, поэтому из базовых навыков она требует умения включить компьютер и написать пять строк кода. Разумеется, на этой статье я не остановлюсь, и в ближайшее же время опубликую продолжение. Если сумею найти достаточно времени, то напишу книгу из этого материала. Целевая публика — программисты, так что хабр подходящее место для обкатки. Я в целом не люблю писать формулы, и я очень люблю учиться на примерах, мне кажется, что это очень важно — не просто смотреть на закорючки на школьной доске, но всё пробовать на зуб.

Итак, начнём. Давайте представим, что у меня есть триангулированная поверхность со сканом моего лица (на картинке слева). Что мне нужно сделать, чтобы усилить характерные черты, превратив эту поверхность в гротескную маску?



В данном конкретном случае я решаю эллиптическое дифференциальное уравнение, носящее имя Симеона Деми Пуассона. Товарищи программисты, давайте сыграем в игру: прикиньте, сколько строк в C++ коде, его решающем? Сторонние библиотеки вызывать нельзя, у нас в распоряжении только голый компилятор. Ответ под катом.
Читать дальше →
Всего голосов 54: ↑54 и ↓0+54
Комментарии58

Симулируем реалистичную реку в Houdini и Unreal Engine 4

Время на прочтение6 мин
Количество просмотров38K


Когда только начался переход с DX9 на DX10 стало появляться много игр с круто смоделированной водой с правильными эффектами. Тогда разница была очень заметной, особенно если сравнивать игры прошлых поколений и тот же Crysis. Поэтому когда наткнулся на гайд, как сделать простую, но реалистичную симуляцию реки через плагин Houdini для UE4, то даже не стал задумываться и быстро перевел.
Всего голосов 46: ↑46 и ↓0+46
Комментарии3

Полёт свиньи, или Оптимизация интерпретаторов байт-кода

Время на прочтение13 мин
Количество просмотров19K


"No matter how hard you try, you can't make a racehorse out of a pig. You can, however, make a faster pig" (комментарий в исходном коде Емакса)

Всем известен тот факт, что свиньи не летают. Не менее популярно мнение о том, что интерпретаторы байт-кодов как техника исполнения языков высокого уровня не поддаются ускорению без применения трудоёмкой динамической компиляции.


Во второй части серии статей об интерпретаторах байт-кодов я на примере небольшой стековой виртуальной машины ПВМ («Поросячья Виртуальная Машина») постараюсь показать, что не всё потеряно для трудолюбивых поросят с амбициями и что в рамках (в основном) стандартного C вполне возможно ускорить работу таких интерпретаторов по меньшей мере в полтора раза.

Читать дальше →
Всего голосов 79: ↑79 и ↓0+79
Комментарии77

Еще одна система частиц. Постмортем

Время на прочтение10 мин
Количество просмотров9.6K
image

В сентябре этого года должна была выйти мобильная игра Titan World от Unstoppable – минского офиса Glu mobile. Проект отменили прямо перед мировым релизом. Но наработки остались, и наиболее интересными из них, с любезного разрешения хэдов студии Dennis Zdonov и Alex Paley, хотелось бы поделиться с общественностью.
Подробности
Всего голосов 26: ↑25 и ↓1+24
Комментарии10

Готовимся к С++20. Coroutines TS на реальном примере

Время на прочтение9 мин
Количество просмотров33K
В C++20 вот-вот появится возможность работать с корутинами из коробки. Нам в Яндекс.Такси эта тема близка и интересна (под собственные нужды мы разрабатываем асинхронный фреймворк). Поэтому сегодня мы на реальном примере покажем читателям Хабра, как можно работать с C++ stackless корутинами.

В качестве примера возьмём что-то простое: без работы с асинхронными сетевыми интерфейсами, асинхронными таймерами, состоящее из одной функции. Например, попробуем осознать и переписать вот такую «лапшу» из колбеков:


void FuncToDealWith() {
    InCurrentThread();

    writerQueue.PushTask([=]() {
        InWriterThread1();

        const auto finally = [=]() {
            InWriterThread2();
            ShutdownAll();
        };

        if (NeedNetwork()) {
            networkQueue.PushTask([=](){
                auto v = InNetworkThread();
                if (v) {
                    UIQueue.PushTask([=](){
                        InUIThread();
                        writerQueue.PushTask(finally);
                    });
                } else {
                    writerQueue.PushTask(finally);
                }
            });
        } else {
            finally();
        }
    });
}

Читать дальше →
Всего голосов 32: ↑31 и ↓1+30
Комментарии61

Асинхронная бизнес-логика в наши дни

Время на прочтение19 мин
Количество просмотров15K

Вкратце:


  • Пруф уже реализован на C++, JS и PHP, подходит для Java.
  • Быстрее чем coroutine и Promise, больше фич.
  • Не требует выделения отдельного программного стека.
  • Дружит со всеми средствами безопасности и отладки.
  • Работает на любой архитектуре и не требует особых флагов компилятора.

Читать дальше →
Всего голосов 29: ↑25 и ↓4+21
Комментарии57

Дротики, кости и монеты: алгоритмы выборки из дискретного распределения

Время на прочтение45 мин
Количество просмотров9.1K

Однажды я задал на Stack Overflow вопрос о структуре данных для шулерских игральных костей. В частности, меня интересовал ответ на такой вопрос: «Если у нас есть n-гранная кость, у грани которой i есть вероятность выпадения pi. Какова наиболее эффективная структура данных для симуляции бросков такой кости?»

Такую структуру данных можно использовать для многих задач. Например, можно применять её для симуляции бросков честной шестигранной кости, присвоив вероятность $\frac{1}{6}$ каждой из сторон кости, или для симуляции честной монетки имитацией двусторонней кости, вероятность выпадения каждой из сторон которой равна $\frac{1}{2}$. Также можно использовать эту структуру данных для непосредственной симуляции суммы двух честных шестигранных костей, создав 11-гранную кость (с гранями 2, 3, 4, ..., 12), каждая грань которой имеет вес вероятности, соответствующий броскам двух честных костей. Однако можно также использовать эту структуру данных и для симуляции шулерских костей. Например, если вы играете в «крэпс» с костью, которая, как вы точно знаете, не идеально честная, то можно использовать эту структуру данных для симуляции множества бросков костей и анализа оптимальной стратегии. Также можно попробовать симулировать аналогичным образом неидеальное колесо рулетки.

Если выйти за пределы игр, то можно применить эту структуру данных в симуляции роботов, датчики которых имеют известные уровни отказа. Например, если датчик дальности имеет 95-процентную вероятность возврата правильного значения, 4-процентную вероятность слишком маленького значения, и 1-процентную вероятность слишком большого значения, то можно использовать эту структуру данных для симуляции считывания показаний датчика генерацией случайного результата и симуляцией считывания датчиком этого результата.
Читать дальше →
Всего голосов 37: ↑37 и ↓0+37
Комментарии16

Создание приложения-раскраски на Unity3D

Время на прочтение6 мин
Количество просмотров17K
image

Эта история началась одним морозным весенним вечером, когда в голову пришел вопрос: а есть ли способ определять степень заливки произвольной геометрической фигуры краской (то есть, на сколько процентов она в данный момент закрашена)? Да так, чтобы это не просто не тормозило, а летало на 60 fps на самых слабых мобильных девайсах.

Для тех, кто не сразу понял, о чем речь, поясню: к проблеме возможен как растровый подход, так и… не растровый.
Читать дальше →
Всего голосов 35: ↑32 и ↓3+29
Комментарии14
1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность