从贝塞尔曲线控制点中找到一条直线的方程

4

我希望能够从以下svg路径找到y = ax2 + bx + c的曲线方程:

<path id="curve1"  d="M100,200 C100,100 400,100 400,200" />

这给出了四个点,可以在附图中看到。
  • 100,200(紫色起点)
  • 100,100(红色控制点1)
  • 400,100(绿色控制点2)
  • 400,200(蓝色终点)
维基百科有一篇很棒的文章,解释了贝塞尔曲线,但我不确定如何应用其中展示的数学知识来得到曲线的方程。 http://en.wikipedia.org/wiki/B%C3%A9zier_curve 绘制的曲线,请点击查看图片
1个回答

7
你做不到。
你展示的SVG使用了立方路径,这意味着它使用了三阶参数曲线,其形式为:
fx(t) = x1 * (1-t)³ + x2 * 3 * (1-t)²t + x3 * 3 * (1-t)t² + x4 * t³
fy(t) = y1 * (1-t)³ + y2 * 3 * (1-t)²t + y3 * 3 * (1-t)t² + y4 * t³

这条曲线是按照t从0到1的范围绘制的。

所以你无法将这条曲线表示为y=ax²+b的形式,原因有两个:

  1. 至少需要一个形式为ax³+bx²+c的公式;
  2. 这是一个参数曲线,不是简单的函数图表;对于Bezier曲线,情况并非如此,y根本就不能用x来表示,而是同时控制xy值的“主参数”t

我们知道,像y=ax²+b这样的二次函数只能模拟抛物线,但是从图像中我们可以看出,这条曲线看起来根本不像其中任何一种(甚至不像被压扁的抛物线),因此在这种情况下,我们甚至无法用二次函数“勉强近似”这条曲线。

(有时候你可以做到这一点,但在这种情况下肯定不行)


谢谢Mike,我正在阅读你的入门指南(http://pomax.github.io/bezierinfo/),试图弄清楚该怎么做。是否可以计算由y = mx + c给出的直线和三次路径的交点? - Derek Ewing
将曲线旋转,使其x轴与该直线对齐,然后在曲线上执行根查找(参见http://pomax.github.io/bezierinfo/#intersections) - Mike 'Pomax' Kamermans
假设我已知: fx(t) = x1 * (1-t)³ + x2 * 3 * (1-t)²t + x3 * 3 * (1-t)t² + x4 * t³
fy(t) = y1 * (1-t)³ + y2 * 3 * (1-t)²t + y3 * 3 * (1-t)t² + y4 * t³ 并且我从你的文章中得到了三个t值(0.315、0.041和0.932),并且我知道y=0,因为我们将直线与轴对齐了。我能否重复使用对齐功能中的角度、ca、sa、ox和0y变量来查找交点xy坐标?如果我不需要绘制曲线,并且希望不必找到所有曲线的XY值,那么我不需要这样做。
- Derek Ewing
抱歉,我忘记提到我已经更改了p0-p4的值和直线上的两个点,以匹配您文章中显示的值。即直线:(100,20),(195,255)三次曲线:(150,125),(40,30),(270,115),(145,200)。 - Derek Ewing
你不能直接找到三阶贝塞尔曲线的根,但可以运行所谓的Cardano算法,始终找到该曲线的三个根(尽管有些可能是复数根,因此我们会排除那些)。 - Mike 'Pomax' Kamermans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接