Cubic spline 切线为零的1D Hermite三次样条曲线-如何使其看起来更平滑

Cubic spline 切线为零的1D Hermite三次样条曲线-如何使其看起来更平滑,cubic-spline,catmull-rom-curve,Cubic Spline,Catmull Rom Curve,我得到了3个值y0,y1,y2。它们应该是均匀分布的,比如x0=-0.5,x1=0.5,x2=1.5。为了能够画一条穿过所有点的样条曲线,所有点的导数都被称为dy/dx=0 现在,通过GLSL片段着色器渲染两条Catmull Rom样条曲线的结果,包括一个非线性变换看起来非常合适。也就是说,当曲线弯曲时,它会平滑地弯曲,但弯曲区域非常小。缩小会使折弯看起来过于尖锐 我想换成TCB。Kochanek-Bartels样条曲线,因为它们提供了张力参数-因此我希望能够平滑外观。但我意识到,应用于零切线的

我得到了3个值y0,y1,y2。它们应该是均匀分布的,比如x0=-0.5,x1=0.5,x2=1.5。为了能够画一条穿过所有点的样条曲线,所有点的导数都被称为dy/dx=0

现在,通过GLSL片段着色器渲染两条Catmull Rom样条曲线的结果,包括一个非线性变换看起来非常合适。也就是说,当曲线弯曲时,它会平滑地弯曲,但弯曲区域非常小。缩小会使折弯看起来过于尖锐

我想换成TCB。Kochanek-Bartels样条曲线,因为它们提供了张力参数-因此我希望能够平滑外观。但我意识到,应用于零切线的所有TCB参数都不会有任何好处


你知道如何得到更平滑的曲线吗?

二维参数曲线的切向量ft=xt,yt定义为f't=dxt/dt,dyt/dt。当您要求曲线在某些点处的dy/dx=0时,这意味着这些点处的切线向量将水平移动,即dy/dt=0。这并不一定意味着切线向量本身就是零向量。因此,您应该仍然能够使用TCB样条曲线来执行任何您想执行的操作。

显然没有人有一个好的答案,但由于这是我的工作,我找到了一个解决方案:点的间隔是均匀的,其想法是使过渡更平滑。现在已知,所有给定点的切线都为零,所以最有可能在靠近这些点的地方,我们得到最强的曲率yx。这意味着,我们希望围绕这些点延伸这些区域

考虑到目前我们使用Catmull Rom样条曲线,在点之间剖切。这使得yx=>yt,tx=x-x0

该tx需要在0-和1-区域周围拉伸。所以余弦函数突然出现在我的脑海中:

将tx=x-x0替换为tx=0.5*1.0-cos PI*x-x0为我完成了这项工作

简要说明:

[0,PI]范围内的余弦在1到-1之间平稳运行。 但是,我们希望从0运行到1 所以翻转它:1-cos->现在它从0运行到2 减半:0.5*xxx->现在它从0运行到1 另一个问题是找到正确的切线。通常,使用矩阵向量数学计算此类样条曲线时,只需导出t向量即可得到切线,因此导出[t³t²t 1]得到[3t²2t 1 0]。但在这里,t并不简单。使用我找到了正确的导出向量:

| 0.375*PI*sin(PI*t)(1-cos(PI*t))² |
| 0.500*PI*sin(PI*t)(1-cos(PI*t))  |
| 0.500*PI*sin(PI*t)               |
| 0                                |

哦,对不起,我没有提到它实际上是1D吗?虽然它将被非线性转换为2D,但我有一次只能在[0;1]范围内的x范围内进行转换。所以你可以把我给定的xy看成是ut。不过还是谢谢你。我看到你和我走的是同一条路,直到我意识到他们根本没有提供足够的数据让它看起来真的很好。