Двухцветный объект Path

Следующее изображение иллюстрирует то, что я пытаюсь достичь:

В основном я хочу создать два объекта Path , которые "

Обновление №1

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

Однако алгоритм не пытается найти кривую Безье. кривая, параллельная другой кривой Безье. Вместо этого алгоритм полностью основан на ломаных линиях: входные данные - это одна или несколько полилиний, а выходные данные состоят из нескольких полилиний для каждой входной полилинии. По этой причине ParallelPath необходимо «сгладить» входную геометрию, что означает преобразование всей геометрии (включая дуги и кривые Безье) в аппроксимацию полилинии.

Обновление №2

Так что мой друг (математик Ph. Д. inceptor) проанализировал эту проблему, и создание кривой, параллельной (третьего порядка) кривой Безье , очень сложно и требует больших вычислительных ресурсов. Для каждой точки параллельной кривой компьютер должен будет вычислить что-то вроде этого:

(degree 3 polynomial) + (degree 2 polynomial) / sqrt(degree 4 polynomial)

Может быть, есть способ оптимизировать это выражение, но это все равно будет намного БОЛЬШЕ вычислительных затрат, чем стандартная кривая Безье (потому что параллельная кривая является совершенно другая кривая, чем исходная кривая Безье). Я хочу иметь возможность анимировать кривую, поэтому это решение, вероятно, будет слишком дорого для процессора. Это оставляет нам несколько вариантов:

  1. Использовать аппроксимацию полилинии Чарльза Петцольда , которая творит чудеса, но при большом увеличении возникают визуальные сбои.

  2. Вывести наше собственное приближение на основе модели Чарльза Петзонда. один. Используйте кривые Безье вместо линий (возможно, будет достаточно дуг). Это решило бы проблему глубокого масштабирования, но, вероятно, это довольно сложно закодировать (я понятия не имею, как это сделать).

  3. Может быть, можно создать что-то вроде двухцветной кисти. Таким образом, мы могли бы использовать только один Path для достижения желаемого результата (как показано на первом изображении). Я нигде этого не видел, так что это, вероятно, не вариант.

Обновление №3

Я нашел несколько довольно интересных ссылок:

Дополнительная информация:

  • Предполагается, что QPainterPathStroker из Qt framework использует алгоритм Томаса Ф. Хейна для параллельные кривые
  • Этот Java Stroker также должен уметь рисовать параллельные кривые

Может быть, окончательное решение? (источник здесь )

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


Попытка №1

Сделайте второй путь немного шире и сдвиньте его под первым путем при использовании Z-индекса. http: / /i51.tinypic.com/2r5vwjk.png

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

12
задан Glorfindel 9 August 2019 в 23:15
поделиться