Рассчитать Безье AABB

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

Единственный известный мне способ сделать это — оценить большое количество точек на кривой Безье, а затем использовать эти точки для расчета AABB.

Есть ли способ лучше?


person Spoonman    schedule 27.03.2011    source источник


Ответы (3)


Отличный ресурс по кривым Безье и рабочий пример AABB http://pomax.github.io/bezierinfo/#boundingbox Для квадратичной кривой, если вам это нужно, также вычислите это с помощью производных.

Всегда избегайте итерационных методов, когда доступна закрытая форма.

person Evil    schedule 22.07.2015

Это должно быть возможно путем поиска минимума и максимума благодаря производной кривой в параметрической форме. взгляните на эту статью: http://nishiohirokazu.blogspot.jp/2009/06/how-to-calculate-bezier-curves-bounding.html

person Felice Pollano    schedule 27.03.2011

Квадратичная кривая Безье состоит из двух координатных функций — x(t) и y(t), где.

Эти функции могут иметь максимум или минимум (точки, где x'(t) = 0 и y'(t) = 0), и эти точки являются граничными точками аабб.

Итак, алгоритм такой:

  1. Представьте, что x0, y0, x1, y1, x2, y2 известны, и вычислите значения t(x0, x1, x2) и t(y0, y1, y2), когда x'(t) = 0 и y'(t) = 0 соответственно.
  2. Вычислите оба значения и проверьте, являются ли они >= 0 и ‹= 1. Если они равны, оцените точки квадратичного Безье.
  3. Возьмите первую и последнюю точки.
  4. Теперь у вас есть 4 балла (а может и меньше), используйте их для расчета AABB.

Кстати:

t(x0, x1, x2) = (x0 - x1) / (x2 - 2 * x1 + x0)

t(y0, y1, y2) = (y0 - y1) / (y2 - 2 * y1 + y0)

Полный код можно найти здесь: https://github.com/keyten/Graphics2D/blob/Delta/Core/Curve.Math.js#L295

person Keyten    schedule 10.11.2017