math - 计算三次贝塞尔曲线的拐点?

标签 math graphics geometry bezier

我有四个点可以形成三次贝塞尔曲线:

P1 = (10, 5)
P2 = (9, 12)
P3 = (24, -2)
P4 = (25, 3)

现在我想找到这条曲线的拐点。我用谷歌搜索和/但每个人都指的是一个网站:http://www.caffeineowl.com/graphics/2d/vectorial/cubic-inflexion.html

不幸的是,小程序不起作用,我只是无法将它们放在一起。有人能告诉我如何计算曲线的拐点吗?

enter image description here

最佳答案

对于贝塞尔曲线,您有两个参数方程 X(t) 和 Y(t)。
要确定参数曲线的拐点,您需要找到曲线曲率 ( wiki ) 改变符号的位置。所以你需要找到上述函数的一阶和二阶导数并求解方程:

C(t) = X' * Y'' - X'' * Y' = 0

一阶导数是二次的,二阶导数是线性的,所以 t 的方程是三次的并且可能有多达 3 个解决方案。

编辑:已阅读链接文章,方程被简化为二次方程,最多可能有 2 个解。

如果解存在于 t 范围 0..1 中,您还必须检查它是否是真正的拐点 - 检查 C'(t) <> 0在这个 t 值。

示例:蓝色圆圈是拐点(两个捕获)

enter image description here

真实代码片段(Delphi)
鉴于:
P是控制点数组
Cf 是以幂为基础的贝塞尔系数
P, Cf: array[0..3] of TPoint

//calculate Bezier coefficients
Cf[3].x := p[3].x - 3 * p[2].x + 3 * p[1].x - p[0].x;
Cf[2].x := 3 * (p[0].x - 2 * p[1].x + p[2].x);
Cf[1].x := 3 * (p[1].x - p[0].x);
Cf[0].x := p[0].x;
//the same for Y

//find parameters of quadratic equation
// a*t^2 + b*t + c = 0
a := 3 * (cf[2].X *cf[3].Y - cf[2].Y *cf[3].X);
b := 3 * (cf[1].X *cf[3].Y - cf[1].Y *cf[3].X);
c := cf[1].X *cf[2].Y - cf[1].Y *cf[2].X;

//here solve quadratic equations, find t parameters
//don't forget a lot of special cases like a=0, D<0, D=0, t outside 0..1 range
Discriminant := b * b - 4 * a * c;
....

关于math - 计算三次贝塞尔曲线的拐点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35901079/

相关文章:

c# - 获得离直线最近的点

C++如何扩展/因式分解方程(不求解)

用于云端数学计算的 API

python - 求解方程式,Python

delphi - 如何用Delphi打开PIC图形文件

javascript - 包含可拖动的圆圈到更大的圆圈

javascript - 计算两个旋转度数的绝对距离,作为数字(在 JavaScript 中)

Java Swing - 在 JPanel 上使用 GPS 坐标绘制站名称

java - Swing - 避免不同行之间的行填充

performance - 三角函数的效率/速度