经过多次审判,错误和失败后,我决定提问。 假设我有一个红绿色和蓝色数组,如下所示:http://pastebin.com/FatLy5FW 我还编写了一个函数来生成一个三次贝塞尔曲线,并将其用于图像处理,如gimp或其他图像编辑软件中的颜色曲线。 http://pastebin.com/hAxaYYGJ
如何确定和设置控制点,以便贝塞尔曲线生成的点数组的输出值与前一个粘贴中数组中的值相同。
答案 0 :(得分:2)
TL; DR 在此处查看更好的答案:Algorithm for deriving control points of a bezier curve from points along that curve?
首先,使用stackoverflow上的优秀搜索功能查找与您的问题类似的所有问题。像这样:https://stackoverflow.com/search?q=fit+points+to+bezier+curve
在我写完一面长篇文章之前,我没有看到。所以我要分享一下,最后,在搜索结果中可能会有一个更简单(和测试)的解决方案。
二次贝塞尔曲线由四个控制点定义。数学符号(来自维基百科)是:
B(t) = (1-t)^3*P0 + 3(1-t)^2*t*P1 + 3(1-t)*t^2*P2 + t^3*P3
<击>
保证线路通过端点P0和P3,但不能通过P1和P2。该等式应适用于曲线上的每个像素。每个像素都有x
和y
坐标。选择您知道的曲线上的像素 - 即B(t)。这转换为两个方程式,每个方程一个。未知数为t
,P1-x
,P1-y
,P2-x
和P2-y
,因为控制点各有两个坐标;总共5个。如果你只选择曲线上的一个点,就会得到2个具有5个未知数的方程。但是如果我们添加一个点,我们得到另一个t
并最终得到4个方程和6个未知数。再添加2个以获得 8个等式和8个未知数。由于它是线性方程组,因此可以使用高斯消除来解决。 Stack overflow已回答有关高斯消除的问题,因此我建议您实施其中一个解决方案,例如:Logic error for Gauss elimination
您需要注意许多陷阱:
击>2*0.5 == 1
错误和其他疯狂的东西。 更新:它实际上不是一个线性方程系统,所以我的方法不起作用。请查看顶部链接的答案。