Рубрика «Программирование» - 962

Введение

В данной статье пойдет речь о методе распознавания рукописного ввода путем математического анализа всех точек плоскости и перебора всех возможных комбинаций с целью отыскать наиболее лучшее наложение контрольных точек на ранее описанные фигуры. Поясню.
Рукописный ввод — это рисование мыслимым «пером» определенной фигуры. Рисование в компьютерных системах — это сохранение в графической памяти информации обо всех пикселях графического контекста. «Точка на плоскости» в математике — понятие абстрактное. В компьютерной же графике за этим понятием скрывается «пиксель». Данный алгоритм распознавания будет анализировать предоставленный ему набор точек( пикселей ) и пытаться в нем отыскать наиболее возможную и похожую фигуру. Фигура, в свою очередь, это каркас, содержащий лишь основные( контрольные ) точки, делающие фигуру уникальной.

Матчасть

Вообще говоря, сердце алгоритма — всем известная со времен школы Теорема Косинусов, являющаяся обобщенной теоремой Пифагора. Зная координаты трех точек плоскости и их порядок «появления» на ней, мы можем с легкостью определить угол, описанный этими точками( Вершина угла — вторая по счету точка ):

image

A( x1;y1 )
B( x2;y2 )
C( x3;y3 )

расстояния между точками находятся по теореме Пифагора

a^ = b^ + c^ — 2*b*c*cos(ALPHA)
cos(BETA) = (b^+c^-a^) / 2*b*c

Зная косинус, величину угла легко можно вычислить.

Среди набора точек, которые подаются на вход алгоритма, необходимо «подставить» точки во всевозможные каркасы фигур( о них выше ) и выбрать наилучшее решение среди найденных. Делается это следующим образом:

  1. Мы берем первую и последнюю точки каркасов фигур. Уже две есть, осталось отыскать третью ( для нахождения величины угла ).
  2. Поиск третьей осуществляется перебором все последующих точек после первой. Решение включать точку в предполагаемый каркас фигуры принимается на основе двух анализов:
    • Попытка подставить точку в угол( в качестве третьей, заключительной ) и проверить его на соответствие величине того же угла в каркасе реальной фигуры.
    • Проверить отношение сторон получившегося угла с тем же отношением сторон угла в каркасе реальной фигуры.

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

Если, допустим, у нас есть несколько анализируемых каркасов, например, «8» и «6». И результат алгоритма распознавания: «8»-80%, «6» — 90%, то решение принимается в пользу той фигуры, в каркасе которой присутствует больше контрольных точек, т.е в пользу восьмерки.

Процент сходства набора точек с точками в каркасе высчитывается просто: суммируются все точки, которые сошлись с теми же точками в каркасе и находится отношение. Допустим, если в каркасе N контрольных точек, а у нас сошлось M, то процент сходства — M / N * 100

Читать полностью »

Представляем Вашему вниманию 7-й и последний выпуск нашего (мы это портал Айти-событие.рф) «Дайджеста предстоящих IT-событий» на август 2013 года.
Дайджест предстоящих IT событий на август 2013 года

Для удобства навигации все события разделены на 4 категории:

  • I. Девелоперские
  • II. Стартаперские
  • III. Маркетинговые
  • IV. Разное


Читать полностью »

Изменение калькуляторов расчета на сайте без программистов
Привет!

В данной статье расскажем, какое применение мы нашли для технологии Excel Services, входящей в состав сервера SharePoint, для построения калькуляторов банковских продуктов.
В 2011 году мы разрабатывали сайт банка ВТБ24, одной из важных задач, которую должен решить новый сайт, было предоставление удобного инструмента для создания и обслуживания калькуляторов и заявок, связанных с продуктами банка. Например, для продукта кредитования «АвтоСтандарт» банк предоставляет пользователю сайта возможность самостоятельно рассчитать с помощью калькулятора, сумму выплат, и в случае, если все устраивает, можно отправить заявку.
Читать полностью »

Вчера я провел опрос программистов на тему А на каком ноутбуке вы программируете большую часть времени?, в результате получилось много информации к размышлению.

Самый популярный размер экрана ноутбука

На чем работают программисты
Как видно из графика, большинство людей устраивает ноутбук с диагональю 15" и меньше. Горб приходится на 13-15", причем, далеко не все эти ноутбуки имеют разрешение более 1366x768. Доля ноутбуков с диагональю более 15" составила всего 15%. 14" — это тоже очень популярный размер, просто моделей с такой диагональю на рынке очень мало.

Конечно, от области работы очень сильно зависит минимально требуемый размер экрана. Если использовать сложные IDE, много сопутствующих программ, в том числе для общения и организации работы в команде, если приходится заниматься версткой и эффектами — тут обязательно нужен либо большая диагональ ноутбука (читай много пикселей), либо дополнительный внешний экран. Для работы с javascript, php, для работы индивидуально зачастую достаточно небольшого экрана, и, конечно же, маленькие шустрые ноутбуки привлекают к себе внимание.

Читать полностью »

RESTful сервис для продажи ж/д билетов

Предыстория

Будучи студентом я периодически ездил домой на поезде. Так как в мои края ездило всего лишь два прицепных вагона, о билетах приходилось заботиться заранее. Естественно, это было крайне неудобно и я, молодой и зеленый, быстро написал небольшое приложение на Qt Framework, которое ходило не сервер УЗ и проверяло наличие билетов. Как только появлялся заветный билет, приложение отправляло смс.

Шли годы, появился Android, а затем и Necessitas – порт Qt для Android. Недолго думая, я взялся за портирование приложение на платформу Android. Работа была быстро сделана и результат был опубликован в Google Play. И тут меня ожидало разочарование… Огромное количество ошибок в Necessitas, не родной интерфейс Android, сложность установки и еще куча других причин сделали свое дело. Оценки получались в основном негативными и руки у меня быстр опустились. Обиженный на весь мир я удалил приложение с Play и на какое-то время забыл…
Читать полностью »

Доброе время суток! Я занимаюсь разработкой MMORPG. В игре асинхронной загрузкой файлов занимается файловая система встроенная в движок, остальная логика обрабатывалась в основном потоке. Но помимо загрузки файлов есть и другие тяжеловесные операции, например инициализация персонажа, которая включает в себя распарсивание XML данных, композиция текстур и т.д. И я столкнулся с необходимостью разгрузить основной поток игры для повышения fps.
Вооружившись гуглом и прочитав несколько последних статей на Хабре о потоках, решил попробовать свои силы и написать свой велосипед ThreadPool. Основной моей целью было написать простой в использовании и расширяемый пул потоков, с возможностью асинхронного вызова функций с любым количеством аргументов и получения возвращаемого значения. Предлагаемые на Хабре решения меня не устроили в силу многих проблем, от которых я постарался избавиться в своем решении – использовать минимум шаблонной магии и отказаться от абстрактных классов и наследования. Я хочу поделиться своим опытом с вами.

Читать полностью »

Редактирование конфигов в Python

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

Вот почему я делюсь с вами библиотекой python-reconfigure.
Читать полностью »

Целью статьи является показать возможности практического применения побитовых операций.
Читать полностью »

Порядок в фото  и видеоархиве с помощью методики и пары скриптовЯ далеко не профессиональный фотограф, но снимать люблю, и периодически мой архив из нескольких десятков тысяч фотографий самого разного качества пополняется фотками с зеркалки, «мыльницы» и трех телефонов, а также видеозаписями с телефонов и видеокамеры. Какой я только софт не перепробовал для поддержания архива фото и видео в порядке! Adobe Lightroom, Apple iPhoto, Google Picasa…

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

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

Читать полностью »

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

Неэффективный программист или как взломать свой мозг за 2 дня

Интернет сделал нас ленивыми!

Почему? Кто в последний раз посмотрел видео больше 3х минут? Кто прочитал пост больше 2 страниц? Какой заголовок более привлекателен, «63 способа бла-бла-бла» или «3 проверенных метода бла-бла-бла»? А если эти три проверенных метода выделены от основного текста, то это вообще гуд (можно не читать текст вовсе, а просто пробежать по выделенным подзаголовкам).
В этом свои плюсы. Наш мозг эволюционировал, и обрабатывает информацию быстрее, чем, скажем, 15-20 лет назад (да и эволюционирует быстрее, чем это было возможно век назад). Как компании справляются с высокими нагрузками? Как процессор выполняет программу по возможности быстро? С помощью кэширования! (как вариант, но самый приоритетный). Что делает наш мозг, чтобы справиться с большой нагрузкой? Кэширует! Что именно и как — оставим на размышление ИИшникам (специалист по искусственному интеллекту). В противном случае при увеличении размера обрабатываемой информации время «отклика» бы увеличилось в разы и на ответ на «как добраться до ближайшей больницы?» уйдет больше времени, чем человек «в силе ждать». «Сила ждать» тоже уменьшилась, «размер» нашего терпения уменьшилась и мы быстро устаем, если продолжительность видео большая, размер статьи большой (на самом деле продолжительность может не влиять на терпение, больше всего влияет полезная информация, если «воды» меньше или вовсе нет, то и терпеть ничего не приходится, посему данный пост написан «эз лаконик эз посибл»).
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js