确定给定y(输出)值数组的贝塞尔控制点

时间:2014-01-08 22:23:35

标签: php arrays image bezier

经过多次审判,错误和失败后,我决定提问。 假设我有一个红绿色和蓝色数组,如下所示:http://pastebin.com/FatLy5FW 我还编写了一个函数来生成一个三次贝塞尔曲线,并将其用于图像处理,如gimp或其他图像编辑软件中的颜色曲线。 http://pastebin.com/hAxaYYGJ

如何确定和设置控制点,以便贝塞尔曲线生成的点数组的输出值与前一个粘贴中数组中的值相同。

1 个答案:

答案 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。该等式应适用于曲线上的每个像素。每个像素都有xy坐标。选择您知道的曲线上的像素 - 即B(t)。这转换为两个方程式,每个方程一个。未知数为tP1-xP1-yP2-xP2-y,因为控制点各有两个坐标;总共5个。如果你只选择曲线上的一个点,就会得到2个具有5个未知数的方程。但是如果我们添加一个点,我们得到另一个t并最终得到4个方程和6个未知数。再添加2个以获得 8个等式和8个未知数。由于它是线性方程组,因此可以使用高斯消除来解决。 Stack overflow已回答有关高斯消除的问题,因此我建议您实施其中一个解决方案,例如:Logic error for Gauss elimination

您需要注意许多陷阱:

    <击>
  • 因此使用整数或浮点数。由于解决方案将采用整数(控制点的整数像素值),因此可能可以使用整数。
  • 不要假设像素与曲线完全吻合,它们在任一方向上最多可达0.5像素。这会影响答案的准确性。您可以进行研究以确保其符合您的目的,或者您可以使用随机选择的点进行多次计算并选择最适合的点。
  • 如果您使用浮点算法,请注意舍入错误。例如,浮点数0.5可能无法准确存储,这可能导致2*0.5 == 1错误和其他疯狂的东西。
  • 注意选择好点。理想情况下,您需要在曲线上均匀分布的像素。如果像素聚集在一起而不是间隔开,请检查它是否有所不同。

更新:它实际上不是一个线性方程系统,所以我的方法不起作用。请查看顶部链接的答案。