我有四个点可以形成三次贝塞尔曲线:
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](https://i.sstatic.net/2YnbR.png)
最佳答案
对于贝塞尔曲线,您有两个参数方程 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](https://i.sstatic.net/tgJXR.png)
真实代码片段(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/