2017-02-08 27 views
1

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

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

enter image description here

ответ

1

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

  1. compute the x and y derivatives, который супер легко сделать,
  2. find all roots (производная = 0) для обеих производных, назовем их множествами r {x} и r {y}, тогда
  3. вычислить соответствующие значения безье {x} и безье {y} для этих корней. Затем
  4. ваш ограничивающий прямоугольник имеет углы, определяемые наименьшими и наивысшими значениями min/max в этих наборах.

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

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