Расположите изображения вдоль кривой Безье

В настоящее время у нас есть динамическое изображение, в котором содержится текст, созданный из пользовательского ввода. Этот текст следует за кривой Безье, чтобы определить его положение и поворот.

По разным причинам, текст должен быть изменен, чтобы быть набором изображений, поскольку шрифт должен быть очень определенным. Поэтому у нас будет один PNG для каждого допустимого символа алфавита. Поэтому, если пользователь вводит слово "ТЕСТ", система вытаскивает буквы T, E, S и T и размещает их рядом друг с другом. Эта часть не проблема.

Проблема заключается в том, чтобы заставить каждое из изображений следовать той же кривой Безье, что и текст, использовавший graphics.DrawString. Изображения должны быть расположены правильно и в идеале также должны быть правильно повернуты.

Возможно ли это и как это сделать?

1 ответ

Быстрый ответ заключается в том, что вы "просто"

  • равномерно параметризовать кривую Безье ( PDF по математике) ( Объяснение того, что не так со стандартной параметризацией)
  • рассчитать нормали к кривой
  • расположите ваши изображения вдоль кривой в соответствии с четной параметризацией, используя ширину глифа в качестве параметра расстояния
  • поверните ваши изображения так, чтобы "вверх" для вашего изображения было нормальным направлением к кривой

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

Этот сайт объясняет многие детали, разлагая контуры изображения на контуры

Однако, как показывают предыдущие ссылки, я уверен, что это процесс, требующий больших затрат. Вместо этого вам может оказаться гораздо проще просто конвертировать изображения в шрифты и использовать метод, который вы использовали ранее. Это решение будет полагаться на какой-либо сторонний инструмент для выполнения преобразования, и я не решаюсь делать предложения. Тем не менее, одним из направлений (из многих) было бы использование инструмента растровой и векторной графики, такого как Inkscape с открытым исходным кодом, и создание ваших шрифтов из вывода векторной графики. Этот метод лучше всего масштабируется, но может включать отдельный этап преобразования вывода в предпочтительный формат шрифта, такой как True-Type.

Другие вопросы по тегам