计算贝塞尔曲线AABB

发布于 2024-10-27 03:54:44 字数 107 浏览 7 评论 0原文

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

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

有更好的办法吗?

I'd like to calculate the AABB (axis aligned bounding box) for a quadratic or bezier curve.

The only way I know how to do this is evaluating a high number of points on the bezier curve, and then use those points to calculate the AABB.

Is there a better way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

油饼 2024-11-03 03:54:44

关于贝塞尔曲线的丰富资源,以及 AABB 的工作示例 http://pomax.github.io/bezierinfo/#边界框
对于二次曲线,如果需要的话,也可以使用导数来计算。

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

Great resource on Bezier curves, and working example of AABB http://pomax.github.io/bezierinfo/#boundingbox
For quadratic curve if you need it, also calculate this using derivatives.

Always avoid iterative methods when closed form is available.

独闯女儿国 2024-11-03 03:54:44

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

It should be possible by looking for minimum and maximum thanks to the derivative of the curve in parametric form. have a look at this article: http://nishiohirokazu.blogspot.jp/2009/06/how-to-calculate-bezier-curves-bounding.html

烟沫凡尘 2024-11-03 03:54:44

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

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

所以算法是:

  1. 假设 x0, y0, x1, y1, x2, y2 已知,并计算当 x'(t) = 0 和 y 时的值 t(x0, x1, x2) 和 t(y0, y1, y2) '(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

The quadratic bezier curve consists of 2 coordinate functions — x(t) and y(t) where.

These functions may have maximum or minimum (the points where x'(t) = 0 and y'(t) = 0) and these points are the boundary points of the aabb.

So the algorithm is:

  1. Imagine x0, y0, x1, y1, x2, y2 are known and calculate the values t(x0, x1, x2) and t(y0, y1, y2) when x'(t) = 0 and y'(t) = 0 respectively.
  2. Calculate both values and check whether they are >= 0 and <= 1. If they are evaluate the points of the quadratic bezier.
  3. Take the first and the last points.
  4. Now you have 4 points (or maybe less), use them to calculate AABB.

By the way:

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

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

You can find the full code here: https://github.com/keyten/Graphics2D/blob/Delta/Core/Curve.Math.js#L295

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文