三次方贝塞尔曲线是否完全包含在控制点的边界框中?
Is a cubic Bézier curve completely contained by the bounding box of its control points?
可能是一个非常简单的问题(我只是想确保我是对的)。标题不是100%正确,但下面是我需要的:
我想计算三次贝塞尔曲线的边界框(矩形)。我知道包含曲线控制点的矩形并不是真正的边界框,它很可能更大,但我想确保它不能更小,也就是说,它将始终包含曲线。
我有由多条连续的三次贝塞尔曲线定义的样条曲线,我想有它的边界框,或者最接近它的东西(我不喜欢复杂的公式来计算它,但如果有一些不太复杂的编码方法,我很乐意知道)。
澄清:我所说的"包含曲线控制点的矩形"是指这样计算的矩形:我将控制点的最小X和最小Y坐标作为矩形的左上角,控制点的最大X和最大Y坐标作为长方形的右下角。(Y轴从上到下)。然后我想确保曲线确实位于这个矩形内。
希望你能理解我的意思:)
说维基百科:
Bézier曲线在计算机图形学中被广泛用于对平滑曲线进行建模。由于曲线完全包含在其控制点的凸包中,
是的。
次-nBezier曲线(我们称之为A)可以表示为二次-(n-1)Bezier曲线的线性插值(我们称它们为B和C。如果B和C在边界框内,那么A显然也是如此。但是你可以递归地应用它B和C都可以表示为二阶-(n-2)曲线的线性插值,依此类推。基本情况是递归到一阶曲线,这只是控制点本身的线性插值。
简短回答:是。
对于具有控制点B0、B1、B2和B3的三次Bézier曲线,沿着曲线B(t)的每个点通过以下公式计算:
B0*(1-t)^3 + B1*3*(1-t)^2*t + B2*3*(1-t)*t^2 + B3*t^3
重要的是,如果我们观察这些系数,它们都大于或等于0,它们的总和是
(1-t)^3 + 3*(1-t)^2*t + 3*(1-t)*t^2 + t^3 = 1
在数学中,这被称为凸组合。沿着Bézier曲线的每个点都是控制点的凸组合。所有凸组合的集合称为凸包,因此曲线以控制点的凸包为界。凸包不包含比最高控制点更高的任何东西,也不包含比左est控制点更左的东西,等等。找到控制点的最小值和最大值x和y就足以找到包含Bézier样条曲线的矩形。
顺便说一句,关于点是控制点的凸组合的观点对于所有的Bézier曲线都是正确的,但对于这个问题,你只需要关心三次曲线。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- 控制允许动态运行c++的并发操作数
- 从控制台中删除最后打印的元素
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 以现代 CMake 方式控制包含的库中的构建选项(测试等)
- C++ - 通过在控制台中包含 csv 文件的路径来读取和写入 csv 文件
- 如何使螺纹包含循环使用静音以控制流动
- 是否有预处理器或其他东西来控制视觉工作室包含的标头
- 并发对象池,其产品的生存期完全由包含对象的智能指针控制
- C++11 条件包含控制表达"types act as if same representation as" ?