4

我想计算二次曲线或贝塞尔曲线的 AABB(轴对齐边界框)。

我知道如何做到这一点的唯一方法是评估贝塞尔曲线上的大量点,然后使用这些点来计算 AABB。

有没有更好的办法?

4

3 回答 3

2

Bezier 曲线的重要资源,以及 AABB 的工作示例http://pomax.github.io/bezierinfo/#boundingbox 对于二次曲线,如果需要,也可以使用导数计算。

当封闭形式可用时,请始终避免使用迭代方法。

于 2015-07-22T22:12:08.273 回答
1

由于曲线的参数形式的导数,应该可以通过寻找最小值和最大值来实现。看看这篇文章: http: //nishiohirokazu.blogspot.jp/2009/06/how-to-calculate-bezier-curves-bounding.html

于 2011-03-27T09:22:24.810 回答
0

二次贝塞尔曲线由 2 个坐标函数 - x(t) 和 y(t) 组成。

这些函数可能有最大值或最小值(x'(t) = 0 和 y'(t) = 0 的点),这些点是 aabb 的边界点。

所以算法是:

  1. 想象一下 x0, y0, x1, y1, x2, y2 是已知的,并在 x'(t) = 0 和 y'(t) = 时计算值 t(x0, x1, x2) 和 t(y0, y1, y2)分别为 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

于 2017-11-10T11:31:48.763 回答