如何在photoshop曲线背后重现数学

sot*_*ips 12 math graphics

基本上,我想要做的是理解如何计算沿着'曲线'的值,如photoshop曲线框中所示:

Photoshop曲线

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

换句话说,我想像曲线框那样修改颜色值,但是以编程方式.

我已经读过这些是"catmull-rom splines" - 但我看到的只是一个依赖于参数T的函数 - 我希望能够查找x的值.如果可能的话,我想在C中这样做

Jac*_*ack 5

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

在任何情况下,您只需要一个函数,该函数采用一个值(0..1 中的浮点数或 0..255 中的整数或您拥有的任何颜色空间)将产生另一个值。

float fun(float x) {
  y = /* something */
  return y;
}
Run Code Online (Sandbox Code Playgroud)

这当然可以通过任何类型的函数来完成。最基本的一个是默认的,它是一个恒等函数

float fun(float x) {
  y = x;
  return y;
}
Run Code Online (Sandbox Code Playgroud)

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

  • Photoshop 不使用 Catmull-Rom 样条。这些样条是局部的:如果您有点 ABCDEFG,并且您四处移动 B 点,则 EF 之间的曲线不会改变。在 Photoshop 的曲线中,修改任何段都会导致整条曲线发生变化。(谷歌说 PS 使用双三次样条,但我还没有证实。) (3认同)