Получение границы кривой Безье

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

var pointsList = [CGPoint(34, 23), ... , CGPoint(23, 85)]
var controlPoints = [CGPoint(45, 34), ..., CGPoint(55, 99)]

введите здесь описание изображения


person isaac lee    schedule 08.02.2017    source источник


Ответы (1)


Обычно не очень сложная проблема, описанная на http://pomax.github.io/bezierinfo/#boundingbox:

  1. Вычисление производных x и y, что очень просто делать,
  2. Найти все корни (derivative=0) для обеих производных, назовем их множествами r{ х} и г{у}, то
  3. Вычислите соответствующие наборы значений Безье{x} и Безье{y} для этих корней. Потом,
  4. Ваша ограничительная рамка имеет углы, определяемые минимальными и максимальными значениями минимальных/максимальных значений в этих наборах.

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

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

person Mike 'Pomax' Kamermans    schedule 08.02.2017