




Ооо. Вы хотите получить кривые смещения кривой Безье.
Плохие новости. это сложно, потому что эти кривые нельзя просто вычислить. Они содержат всевозможные пересечения, петли и прочую гадость.
Хотя есть некоторые приближения. Лучший подход, который я читал до сих пор, взят из статьи Томаса Ф. Хейна (Быстрое и точное выравнивание кубической траектории Безье и кривых смещения).
Он выполняет выравнивание, поэтому его статья в основном посвящена разложению смещенных кривых на линейные сегменты и дуговые сегменты окружности, но вы можете объединить их обратно в кривые Безье позже.
Для лучшего понимания вы можете также прочитать другие его статьи, связанные с Безье.
Документ также есть на citeseerx: citeseerx.ist.psu.edu/viewdoc/…
QPainterPathStroker Qt (это открытый исходный код и довольно читаемый код) использует алгоритм, описанный в вышеупомянутой статье, чтобы делать то, что вы хотите.
Как объяснили другие, сделать это очень сложно. Кривая смещения не является кубической кривой Безье и очень трудноразрешима. Тогда вогнутости глубже смещения вызывают проблемы с пересечением.
Хорошая новость заключается в том, что обычно вы хотите рассчитать смещение штриха для рендеринга, поэтому требуется только точность пикселей. Кроме того, различные пересечения по-прежнему создают заполненный многоугольник, если вы соблюдаете правило закручивания для заливки многоугольника. Таким образом, вы сначала сглаживаете кривую, а затем смещаете ее линейным образом, и это становится проблемой прямого многоугольника.
Некоторый код здесь можно использовать как эталонную реализацию: https://github.com/memononen/nanosvg
текущая ссылка на статью Hain, если кто-то ее ищет: cis.usouthal.edu/~hain/general/Publications/Bezier/…