calc

calc


Скелетонизация шрифтов (нахождение центральной линии изображения)

Пример скелета символа

На языке C++ разработаны кроссплатформенные классы для получения средней линии символов (как растровых, так и True Type) шрифтов Unicode (решение т.н. задачи скелетонизации шрифта). Полученная в результате работы алгоритма Пример скелета символасредняя линия символа задается минимальным числом кривых Безье с заданной погрешностью. Подобные алгоритмы применяются при наложении визуальных эффектов на шрифты и при распознавании образов.

Полный демонстрационный пакет доступен здесь (skelet.zip). В этом пакете содержится демо-программа с графическим интерфейсом, основанная на разработанных классах, позволяющая получить среднюю линию для ряда символов различных языков. Программа работает с файлом шрифта напрямую, поэтому, если ей не удастся автоматически определить местонахождение файла ARIALUNI.TTF (unicode, около 23 Мб), этот файл необходмио поместить в каталог программы. Этот шрифт также включен в состав Windows XP, 2000 и новых версий MS Office.

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

 

  Пример скелета символа Пример скелета символа

Краткое описание алгоритма определения центральной линии символа, содержащегося в разработанных кроссплатформенных классах:

  1. получение статистики о битовом изображении; Пример скелета символа
  2. разрезание символа на части (для случаев, когда различные части символа имеют тонкие соединения, которые не должны отражаться на виде центральной линии символа);
  3. определение "базисных" точек (лежащих приблизительно в середине символа) на основе разновидности клеточного аппарата (с более сложными правилами, чем небезызвестная игра "жизнь" Конвея);
  4. просеивание "базисных" точек для удаления избыточной информации;
  5. получение полилинии, состоящей из большого числа коротких прямых диний, приблизительно описывающих центральную линию символа;
  6. замыкание открытых контуров в полилинии (если это необходимо для корректного построения центральной линии символа); Пример скелета символа
  7. удаление артефактных разветвлений на концах и пересечениях полилиний (вмесе с вызвавшими возникновение артефактов "базисными" точками);
  8. повторное получение полилинии на основе нового набора "базисных" точек;
  9. замыкание открытых контуров в новой полилинии;
  10. объединение полилиний в прямые линии в пределах допустимой погрешности (определение "прямых" участков центральной линии символа);
  11. анализ пересечений центральной в линии символа (для более плавного приближения кривыми Безье);
  12. удаление остаточных артефактных разветвлеий на концах центральной линии символа (без изменения состава "базисных" точек);
  13. анализ и корректировка углов поворота центральной линии символа (в случаях поворота линии на углы, отличные от 90 градусов) для получения более естественной и гладкой центральной линии символа; Пример скелета символа
  14. разделение точек пересечения центральной линии символа, если этого требует необходимая гладкость центральной линии;
  15. реструктуризация полученных результатов для ускорения работы аппроксимации центральной линии кривыми Безье 2-го и 3-го порядков;
  16. вычисление полилинии, состоящей из кривых Безье не выше 3-го порядка, на основе полученной ломаной полилинии и метода наименьших квадратов.

 

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


Класс С++ для выполнения матрично-векторных операций

На C++ реализован класс Matrix, содержащий основные функции работы с матрицами:

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

Исходный код класса Matrix можно скачать здесь (zip-архив).


Реализация прямого симплекс-метода решения задач линейного программирования

Реализован прямой симплекс-метод Дж. Данцига с выбором ведущего элемента. Метод применяется при решения задач линейного программирования (например в нашем программном продукте "Расчет оптимального рациона"). Программная реализация основана на классе Matrix, описанном выше. Исходный код класса Matrix также включен в архив проекта.

  • Zip-архив с программой (проект Borland С++ Builder 5.0): WinSMX_for_B5.zip (284 Кб)

    Примечание: smx.exe из архива WinSMX_B5.zip требует для запуска наличие библиотек от Borland или установленного "Borland С++ Builder 5.0" (при компиляции использовался режим "Build with runtime packages")

  • Zip-архив с программой (проект Borland С++ Builder 6.0): WinSMX_for_B6.zip (652 Кб)
  • Zip-архив с программой (только "smx.exe", документация и тестовые примеры): WinSMX_prg.zip (425 Кб)

    Примечание: smx.exe из архива WinSMX_B6.zip и из WinSMX_prg.zip
    может работать автономно.

    Примечание: в архивах тестовые примеры в подкаталоге "data", краткое описание - в подкаталоге "doc".