Как стать автором
Обновить
165
0.5

Человек

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

WPF, WinForms: рисуем Bitmap c >15000 FPS. Хардкорные трюки ч.1

Время на прочтение4 мин
Количество просмотров42K
Сразу уточнение: Bitmap 200x100 на компе с быстрой памятью и i7 3930K на 1366. Но, это честный System.Drawing.Bitmap.
Вводная: приложение типа осциллографа. Ссылка на готовый проект с фронтэндом в конце статьи.
Как же быстро рисовать его на экран? WriteableBitmap хорош, быстр, и он лучшее решение для WP, WinRT, WPF. Но занудного старпёра-кодера также волнует WinForms, .Net 2.0, Win2K (да-да, в некоторых гос.органах до сих пор теплый ламповый Win2K).
Далее, я обратил внимание на DirectX, тем более у нас для WPF появился полезный контрол D3DImage. Я перепробовал много движков, но ни один из них не давал удобного изящного способа рисовать GDI+ Bitmap из памяти. Некоторые работали и вовсе только с DX10-11. Ближе всех к цели оказался SlimDX. В любом случае, фронтэнд для контрола оказывался некрасивым. Все эти движки… мягко говоря избыточны, для моей простой задачи.
Но решение есть
Всего голосов 48: ↑40 и ↓8+32
Комментарии39

man!( Go => D ).concurrency

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

Многозадачность — это то, что реализовано в Go по настоящему хорошо, хоть и не идеально. Приятный синтаксис с терпким послевкусием, простые и мощные абстракции, подкупают своим изяществом по сравнению с остальными императивными языками. А попробовав лучшее, уже так не хочется скатываться к посредственности. Поэтому, если и переходить на другой язык, то он должен быть ещё более выразителен и с не менее толковой реализацией многозадачности.

Если вы уже наигрались с Go, устали от копипасты, ручного жонглирования мьютексами и всерьёз подумываете о приобретении протезов для рук, то позвольте предложить вашему вниманию перевод Tour of the Go с эквивалентным кодом на D и краткими пояснениями.


Часть первая. Основы.


Часть пятая. Сопрограммы.

Читать дальше →
Всего голосов 28: ↑22 и ↓6+16
Комментарии93

Научись командовать

Время на прочтение11 мин
Количество просмотров24K
Захотелось поделиться чудесным процессом разработки, с которым недавно познакомился. Я раньше не видел такого подхода, и люди, как только с ним знакомятся, долго не могут понять и принять такой способ построения игр. И, если честно, я сам понял все не в первую неделю. Но после некоторого освоения я уже забыл как делать игры иначе. В планах написать цикл статей, но начнем с малого и постепенно будем наращивать понимание что и зачем и с чем это есть.

Как кое-кто уже мог догадаться, я сегодня расскажу про паттерн “Command” и как его использовать для разработки игр с использованием движка Unity 3D. Это один из ключевых паттернов в этом подходе. Код будет упрощенным, но рабочим и должен дать понимание процесса.
Читать дальше →
Всего голосов 22: ↑21 и ↓1+20
Комментарии32

Кодировки

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

Всем рано или поздно приходится работать с различными кодировками. Заметив в коде своей команды различные, порой странные, подходы к решению этих проблем, пришлось провести разъяснительную беседу. Ниже поделюсь своим видением правильной работы с не-ASCII символами в коде. Буду рад конструктивной критике.

Читать дальше
Всего голосов 76: ↑73 и ↓3+70
Комментарии61

Математика на пальцах: мендосинский двигатель и теорема Ирншоу

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

Постановка задачи


На днях я увидел на просторах интернета крайне любопытную вещь: мендосинский двигатель. Ротор на подшипниках крайне низкого трения: оригинальный имел стеклянный цилиндр, подвешенный на двух иголках, современные имеют магнитный подвес оси. Двигатель бесколлекторный, на роторе подвешены солнечные батареи, которые выдают напряжение на катушки, намотанные на роторе. Ротор проворачивается в фиксированном магнитном поле статора, солнечная батарея уходит от направленного света, на её место приходит другая. Крайне элегантное решение, которое вполне под силу сделать дома каждому.

Вот на этом видео крайне подробно описан (на русском языке) принцип работы:



Но ещё больше самого двигателя мне показалась любопытной следующая вещь. В описании этого видео Дмитрий Коржевский написал следующую вещь: «Боковую опору заменить магнитом НЕВОЗМОЖНО!!! Не задавайте больше этот вопрос!»

Читать дальше →
Всего голосов 98: ↑97 и ↓1+96
Комментарии226

Удивительные свойства программируемых полимагнитов

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

Магнитное поле обычного магнита (слева) и двух полимагнитов

Американская компания Polymagnet уже несколько лет выпускает магниты с произвольной формой намагниченного материала — полимагниты. Они кардинально отличаются от обычных магнитов и обладают различными свойствами, которые задаются перед печатью. Например, такие магниты могут автоматически выравниваться друг относительно друга или удерживать заданное расстояние друг от друга (в миллиметрах), отталкиваясь при сокращении этого расстояния (аналог защёлки) или, наоборот, сближаясь при превышении расстоянии, но не прикасаясь друг к другу (аналог пружины), демонстрацию см. под катом.

Главное, что вы задаёте произвольные свойства в программном редакторе, а потом за несколько минут печатаете нужный магнит. Свойства магнита выбираются из каталога заранее запрограммированных полимагнитов или задаются произвольно.
Читать дальше →
Всего голосов 22: ↑19 и ↓3+16
Комментарии77

Потокобезопасные сигналы, которыми действительно удобно пользоваться

Время на прочтение15 мин
Количество просмотров19K
В мире существует множество библиотек, реализующих сигналы в C++. К сожалению, у всех реализаций, с которыми я сталкивался, есть несколько проблем, которые не позволяют писать простой многопоточный код с использованием этих библиотек. Здесь я расскажу об этих проблемах, и о том, как их можно решить.
Читать дальше →
Всего голосов 19: ↑19 и ↓0+19
Комментарии8

man!( Go => D ).basics

Время на прочтение6 мин
Количество просмотров16K
Если вы уже наигрались с Go, устали от копипасты, ручного жонглирования типами и подумываете вернуться на какой-нибудь Python или, прости господи, PHP, то позвольте предложить вам попробовать язык D, где типизация хоть и тоже статическая, но она не путается под ногами и позволяет писать не менее выразительный код, чем на языках с динамической типизацией. А чтобы переход был не такой болезненный, вашему вниманию предлагается перевод Tour of the Go c эквивалентным кодом на D и краткими пояснениями.

Часть первая. Основы.

Читать дальше →
Всего голосов 39: ↑24 и ↓15+9
Комментарии107

Вычисление значения многочлена. Все ли тривиально в этом вопросе?

Время на прочтение5 мин
Количество просмотров49K
Вычисление значения многочлена в точке является одной из простейших классических задач программирования.
При проведении различного рода вычислений часто приходится определять значения многочленов при заданных значениях аргументов. Часто приближенное вычисление функций сводится к вычислению аппроксимирующих многочленов.
Рядового читателя Хабрахабр нельзя назвать неискушенным в применении всяческих извращений. Каждый второй скажет, что многочлен надо вычислять по правилу Горнера. Но всегда есть маленькое «но», всегда ли схема Горнера является самой эффективной?

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

Готовим к публикации пост с формулами

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

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


В связи с этим стал актуальным вопрос о выборе удобного инструмента для создания и подготовки таких постов. SeptiM предложил скрипт, преобразующий маркдаун-разметку + латех в html-код. Я решил развить идею и упростить инструмент, и сделал для этих же целей онлайн-редактор с поддержкой латеха и маркдауна:


Скриншот редактора


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

Евклидов алгоритм генерации традиционных музыкальных ритмов

Время на прочтение17 мин
Количество просмотров20K
Перевод статьи Godfried Toussaint The Euclidean Algorithm Generates Traditional Musical Rhythms.

От переводчика


В Sonic Pi есть функция spread, которая принимает два числовых параметра и возвращает набор значений для генерации ритма. В описании этой функции есть ссылка на работу «The Euclidean Algorithm Generates Traditional Musical Rhythms». Эта блестящая статья, вышедшая аж в 2005 году, похоже, так и не была переведена на русский язык. Не будучи специалистом по переводам, я попытался, тем не менее, восполнить этот пробел.
Небольшое пояснения по поводу слова «ожерелье»: в тексте статьи «necklace» — в музыкальной теории такого термина нет, насколько мне известно. Я полагаю, что это просто некая визуальная интуиция автора, действительно ведь ритмическое кольцо, в том виде, в каком оно представлено на рисунках, напоминает ожерелье — поэтому так и перевожу.

Конспект


Евклидов алгоритм (дошедший до нас из «Начал» Евклида) подсчитывает наибольший общий делитель двух целых чисел. Настоящая работа демонстрирует, что структура евклидова алгоритма может быть использована для того, чтобы очень эффективно генерировать большое семейство ритмов, используемых в качестве пульсаций (остинато), в частности в музыке тропической Африки, и в традиционной музыке вообще. Эти ритмы, называемые здесь евклидовыми ритмами, имеют то свойство, что их ударные рисунки распределяются насколько возможно равномерно. Евклидовы ритмы также находят приложение в ускорителях в атомной физике и в компьютерных науках, и тесно связаны с несколькими семействами слов и последовательностями, изучаемыми комбинаторикой слов, такими как евклидовы строки, с которыми сравнивают евклидовы ритмы.
Читать дальше →
Всего голосов 23: ↑23 и ↓0+23
Комментарии17

Быстрая помощь при болях в мышцах и суставах (и после травм) до посещения доктора

Время на прочтение5 мин
Количество просмотров38K
Устраивал я недавно у себя на странице в соц.сети опрос «Испытывали ли вы хоть раз боли в спине/суставах. Отвечали мои друзья, средний возраст которых 28-30 лет (± года 4). К моему большому удивлению из 55 ответивших только двое проголосовали за вариант «Нет, никогда». 16 человек ответили «ежедневно или несколько раз в неделю», 22 – «изредка, пару раз в месяц», 15 – «реже чем раз в месяц».
Это, к сожалению, крайне коррелирует с результатами, к которым приходят многие мои коллеги, занимающиеся проблемами с опорно-двигательным аппаратом (далее – ОДА), работающие со спортсменами. Нарушения ОДА «молодеют», и причин тому много – начиная от питания заканчивая отсутствием адекватной физической культуры.
Так как мне часто приходится снимать болевой синдром в мышцах и суставах (а затем и лечить его причину), я решил поделиться тем, что я использую в комплексном лечении, но что, тем не менее, вполне может использоваться как самопомощь на этапе от «начало болеть» до «дошел до врача». И имя сей методике – кинезиологическое тейпирование (kinesis с др.греч. «движение, имеющее отношение к движению», кинезиология (logos — с др.греч. «учение») — научная и практическая дисциплина, изучающая мышечное движение во всех его проявлениях).
Читать дальше →
Всего голосов 36: ↑32 и ↓4+28
Комментарии91

Разложение матрицы аффинного преобразования

Время на прочтение3 мин
Количество просмотров20K
Не так давно в процессе разработки редактора 2D-графики возникла задача разложить матрицу аффинного преобразования на плоскости, на произведение матриц простых преобразований с тем, чтобы отобразить их пользователю и предложить какую-то более-менее адекватную интерпретацию того, что произошло с объектом на канвасе. Честно говоря, эта задача вызвала у меня определенные трудности. Университет я закончил уже давно, и мне было непонятно, а возможно ли это сделать в принципе, учитывая, что исходная матрица могла быть результатом произвольной последовательности сдвигов, масштабов, поворотов, и переносов, причем каждое преобразование могло иметь свой произвольный центр. И, во-вторых, непонятно было, как найти семь параметров, имея всего шесть коэффициентов матрицы. Ключом к решению этой задачи оказалась статья "Разложение матрицы центроаффинного преобразования для нормализации изображения"¹, в которой рассматривается такая же задача, но без учета преобразования переноса и для преобразований относительно центра координат. Далее я фактически просто адаптирую результаты этой статьи с учетом переноса и для произвольного центра преобразований.
Читать дальше →
Всего голосов 19: ↑16 и ↓3+13
Комментарии17

Вейвлет-сжатие «на пальцах»

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


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

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

Читать дальше →
Всего голосов 169: ↑168 и ↓1+167
Комментарии58

Матрица: Злодеи и Спасители

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

По результатам голосования, будем говорить о Матрице.



Q&A

Что на этот раз?

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

Это про то что Матрица в Матрице?

Не-а. Эта теория мне не нравится, хотя она настолько популярна, что уже на грани канона. Как по мне эта теория ужасна, поскольку с помощью подобного трюка можно объяснить все что угодно(это просто сон). К тому же, не забываем про бритву Оккама, эта теория вводит новые сущности, которые необязательны для объяснения.

Зачем мне это читать

Матрица — это антиутопический киберпанк. Говоря о ней, приходится скатываться во все, что обсуждается на ресурсе: робототехника, ИИ, программирование, энергетика и.т.д.

Спойлеры?

Безусловно, и много. Все относительно трилогии и Аниматрицы. Прочие произведения вроде «Голиаф» или The Matrix Online в данном случае нерелевантны. Первое, поскольку описывает очень странные события(вроде столкновения машин с пришельцами), второе — поскольку является убожеством с точки зрения сюжета, ИМХО. Также есть небольшой спойлер из игры Mass Effect(на самом деле большой).
Читать дальше →
Всего голосов 68: ↑62 и ↓6+56
Комментарии306

Как относиться к фан-теориям или кружева на скатерти

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

Начну, опять с Q&A

Что это?

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

Зачем мне это читать?

1) Это о кино и историях в целом
2) Это о мифологии и символике
3) Это о фан-теориях

А если мне не интересно?

Если, все же интересуетесь кино — можете пробежаться по заголовкам спойлеров, я спрятал туда несколько интересных историй. Также, очень поможете, если выразите свою позицию в комментариях и поучаствуете в опросе.
Читать дальше →
Всего голосов 7: ↑5 и ↓2+3
Комментарии13

Теория и практика парсинга исходников с помощью ANTLR и Roslyn

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

В нашем проекте PT Application Inspector реализовано несколько подходов к анализу исходного кода на различных языках программирования:


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

Наш цикл статей посвящен структуре и принципам работы модуля сигнатурного поиска (PM, pattern matching). Преимущества такого анализатора — скорость работы, простота описания шаблонов и масштабируемость на другие языки. Среди недостатков можно выделить то, что модуль не в состоянии анализировать сложные уязвимости, требующие построения высокоуровневых моделей выполнения кода.



К разрабатываемому модулю были, в числе прочих, сформулированы следующие требования:


  • поддержка нескольких языков программирования и простое добавление новых;
  • поддержка анализа кода, содержащего синтаксические и семантические ошибки;
  • возможность описания шаблонов на универсальном языке (DSL, domain specific language).

В нашем случае все шаблоны описывают какие-либо уязвимости или недостатки в исходном коде.


Весь процесс анализа кода может быть разбит на следующие этапы:


  1. парсинг в зависимое от языка представление (abstract syntax tree, AST);
  2. преобразование AST в независимый от языка унифицированный формат;
  3. непосредственное сопоставление с шаблонами, описанными на DSL.

Данная статья посвящена первому этапу, а именно: парсингу, сравнению функциональных возможностей и особенностей различных парсеров, применению теории на практике на примере грамматик Java, PHP, PLSQL, TSQL и даже C#. Остальные этапы будут рассмотрены в следующих публикациях.

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

Векторная графика бесплатно — подборка сайтов

Время на прочтение3 мин
Количество просмотров422K
У векторной графики много преимуществ. В отличие от растровых, векторные изображения более гибкие, легко масштабируются, сохраняют качество и т.д. Ниже представлена подборка веб-ресурсов с бесплатными векторными иконками, символами и картинками.

1. Freepik


www.freepik.com

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



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

Бинаризация изображений: алгоритм Брэдли

Время на прочтение5 мин
Количество просмотров65K
Этот пост я хочу посвятить приятному трофею, добытому в англоязычном интернете. Речь пойдет об одном из методов адаптивной бинаризации изображений, методе Брэдли (или Брэдли-Рота, поскольку авторов двое).

Немного теории


Процесс бинаризации – это перевод цветного (или в градациях серого) изображения в двухцветное черно-белое. Главным параметром такого преобразования является порог t – значение, с которым сравнивается яркость каждого пикселя. По результатам сравнения, пикселю присваивается значение 0 или 1. Существуют различные методы бинаризации, которые можно условно разделить на две группы – глобальные и локальные. В первом случае величина порога остается неизменной в течение всего процесса бинаризации. Во втором изображение разбивается на области, в каждой из которых вычисляется локальный порог.

Главная цель бинаризации, это радикальное уменьшение количества информации, с которой приходится работать. Просто говоря, удачная бинаризация сильно упрощает последующую работу с изображением. С другой стороны, неудачи в процессе бинаризации могут привети к искажениям, таким, как разрывы в линиях, потеря значащих деталей, нарушение целостности объектов, появление шума и непредсказуемое искажение символов из-за неоднородностей фона. Различные методы бинаризации имеют свои слабые места: так, например, метод Оцу может приводить к утрате мелких деталей и „слипанию“ близлежащих символов, а метод Ниблэка грешит появлением ложных объектов в случае неоднородностей фона с низкой контрастностью. Отсюда следует, что каждый метод должен быть применен в своей области.
Читать дальше →
Всего голосов 37: ↑37 и ↓0+37
Комментарии19

Как начать работать с GitHub: быстрый старт

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


Распределенные системы контроля версий (DVCS) постепенно замещают собой централизованные. Если вы еще не используете одну из них — самое время попробовать.

В статье я постараюсь показать, как можно быстро начать экспериментировать с git, используя сайт github.com.

В статье не будут рассмотрены различия между разными DVCS. Также не будет детально рассматриваться работа с git, по этой теме есть множество хороших источников, которые я приведу в конце статьи.
Читать дальше →
Всего голосов 182: ↑165 и ↓17+148
Комментарии51

Информация

В рейтинге
1 885-й
Откуда
Россия
Работает в
Зарегистрирован
Активность