Math 如何重新创建photoshop曲线背后的数学

Math 如何重新创建photoshop曲线背后的数学,math,graphics,Math,Graphics,基本上,我想做的是了解如何计算“曲线”上的值,如photoshop曲线框中所示: 因此,给定N个点,x在0和1之间,y在0和1之间-我们将创建一条穿过所有这些点的曲线。给定这条曲线,我希望能够计算任意给定X的所有曲线值 换句话说,我想像曲线框一样修改颜色值,但要编程 我读过这些是“catmull-rom样条曲线”——但我看到的是一个依赖于参数T的函数——我希望能够查找x的值。如果可能的话,我想在C中这样做。我不熟悉C-R,但是如果它像beziers,那么T参数的变化范围是从曲线段的一个端点的0

基本上,我想做的是了解如何计算“曲线”上的值,如photoshop曲线框中所示:

因此,给定N个点,x在0和1之间,y在0和1之间-我们将创建一条穿过所有这些点的曲线。给定这条曲线,我希望能够计算任意给定X的所有曲线值

换句话说,我想像曲线框一样修改颜色值,但要编程


我读过这些是“catmull-rom样条曲线”——但我看到的是一个依赖于参数T的函数——我希望能够查找x的值。如果可能的话,我想在C中这样做。我不熟悉C-R,但是如果它像beziers,那么T参数的变化范围是从曲线段的一个端点的0到另一个端点的1。这就是你如何“沿着”曲线前进。所以你不能只插入一个x值。您可以以任意间隔对长样本进行采样,也可以使用某种目标搜索算法将给定的x值逼近到您认为必要的精度。

之所以使用Catmull Rom样条曲线,是因为它是一种表示曲线的样条曲线,您可以在其中添加控制点并细化曲线本身(这是您在Photoshop上单击以添加新点时所做的操作),其特殊性是使曲线通过您指定的每个控制点

在任何情况下,您只需要一个取值(0..1中的float或0..255中的int或任何颜色空间)的函数就可以生成另一个值

float fun(float x) {
  y = /* something */
  return y;
}
当然,这可以通过任何类型的函数来实现。最基本的是默认的标识函数

float fun(float x) {
  y = x;
  return y;
}

任何其他函数都可以用曲线来计算,这很好,但开发起来更复杂,我建议你从简单的例子开始,比如贝塞尔曲线。在任何情况下,都要使用
t
参数,因为这些是参数曲线,在深入开发之前,您需要了解一些曲线的数学背景,看看。

此代码似乎与Photoshop的曲线完全匹配(不是我的代码):

这里有一个指向vbscript的链接,该脚本用于实现photoshop使用的三次样条曲线


Photoshop使用一个来绘制曲线,如上文所述。

我想说的更像样条曲线而不是贝塞尔曲线,因为直线通过控制点。在某些情况下,实际曲线可能是相同的,但你是对的,控制点是不同的。如果你想让曲线固定在控制点上,可以使用样条曲线。Photoshop不使用Catmull Rom样条曲线。这些样条曲线是局部的:如果有点A-B-C-D-E-F-G,并且移动点B,则E-F之间的曲线不会改变。在Photoshop的曲线中,修改任何线段都会导致整个曲线发生更改。(谷歌说PS使用双三次样条曲线,但我还没有证实。)我认为格伦是对的,它不是catmump rom样条曲线。这里有一个链接指向一些似乎实现了相同功能的代码:@Jack但这条曲线的工作原理就像我们把它往下拉,增加青色,如果我们把它往上拉,增加红色,我们可以同时处理这两个问题吗?我想Photoshop使用自然三次样条曲线-多项式呢?对不起,我不知道样条曲线和多项式之间的关系。样条曲线可能更好。对我来说真的很好。当心,如果你让Chrome翻译页面,它会插入代码,所以在仍然是法语的时候复制代码,然后如果你想阅读解释,就进行翻译。我花了很长时间才弄明白这就是为什么代码会乱七八糟。但是当它向我们展示图形,我们根据结果调整它时,我们怎么能得到那些我们调整图形的值呢?如果我们不想下次出现那条曲线,我们只想把我们之前测试过的那些值放进去,那么这些三次样条曲线是不是?如果是,哪一个?自然三次样条曲线?