问题标签 [catmull-rom-curve]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
952 浏览

c++ - 向心 Catmull-Rom 样条插值 alpha 参数

在搜索了 Catmull-Rom 样条曲线上的几乎所有主题并最终成功实现它之后,我现在陷入了一个我不知道我是否犯了逻辑错误或者我的代码是否完全错误的地步。

我的问题是,我的代码不接受向心 catmull-rom 样条插值的 alpha 参数。不同 alpha 值的结果总是相同的。

我的主要目标是使用向心 catmull-rom 算法插入 4 个点(当我将第一个点和最后一个点加倍时为 6 个)。我基本上实现了可以在此处找到的 C# 版本(向心 Catmull-Rom Spline)或在整个 SO 中的其他几个线程中(Catmull-rom 曲线没有尖点和自相交Catmull-Rom 插值在 SVG 路径上) .

我的实现:

首先,我有一个 3D 图像,其中 4 个不同的体素设置为一个。我尝试识别那些体素并保存坐标。例如 z=250、y=100、x=323。我保存这些值并将它们转换为 double 以将它们用作我的 CR 算法的控制点。

只是为了澄清。数组具有以下布局:坐标[z0,y0,x0,z1,y1,x1,...,zn,yn,xn]。

我对 catamull-rom 插值的实现如下:

现在我尝试做的是,将每个体素(或 2D 中的像素)设置为 1,这是通过 CR 插值方法计算的。我基本上想用CR算法计算坐标。如果我设置 alpha=0,则结果符合预期(我使用了与维基百科示例相似的点)。我在顶部有一个很好的自相交。但是,如果我将值更改为 0.5 或 1,我仍然会得到相同的结果。

现在我怀疑我使用的类型有问题。将整数坐标转换为双精度或将它们转换回整数(+0.5)可能是不明智的。但这并不能解释我得到的自相交。我实际上没有提供图像,因为它与我们在12中的图像非常相似。 感谢所有甚至考虑阅读本文的人。

0 投票
1 回答
354 浏览

cut - 切割catmull-rom样条的算法?

我有一个带有 6 个 CV 的 catmull-rom 样条曲线,并且想在样条曲线的任意点切割它。

如何计算两条新样条线的端点,以使它们保持被切成两半之前的形状?

所以,想象这是一条有 6 个点的样条曲线:

如果我想在 C 点切割这条样条线,我将有两条新样条线,我猜每个有 5 个 CV?

其中 X 是我需要添加的 CV 以保持样条曲线的形状。但是我如何计算 X 需要在的位置呢?

还是我的逻辑完全错误,问题有完全不同的解决方案?

谢谢!

0 投票
0 回答
240 浏览

bezier - 将 3 次立方 Nurbs 曲线转换为 Catmull-Rom?

有没有办法将 3 次三次 Nurbs 曲线转换为 Catmull-Rom 曲线?

Nurbs 曲线有一个标准的节点向量,例如一条有 10 个控制点的曲线有这 12 个节点:

我假设生成的 Catmull-Rom 曲线将有 12 个控制点?或者更多..?

如果无法进行一对一转换,是否有一种好的算法可以至少获得非常接近的匹配?

0 投票
1 回答
47 浏览

java - 在 Catmull-Rom 样条曲线中使用相同坐标两次时的问题

我目前正在处理 Catmull-Rom 样条,并且发现了一个我不知道如何解决的问题。所以当我使用一种方法来做 Catmull 的事情时,我必须给一个 4 分的 ArrayList。但在某些情况下,我并不总是有这 4 个点,有时只有 2 个或 3 个。我认为我可以(在 2 个点的情况下)我可以将两个点加两次以创建一条直线。每当我这样做时,我什么都没有得到。我尝试调试,得到输出“NaN”。你们有人知道我能做什么吗?这是我用于公式的代码:

0 投票
1 回答
192 浏览

c++ - 使用 C++ 和 opencv 进行图像缩放的 Spline Catmull-Rom

我正在尝试使用 C++ 和 OpenCV 实现样条 Catmull-Rom 进行图像缩放。我进行了两个测试,第一个是图像缩放(X2),第二个是图像重建(缩放图像抽取)。我的问题是,在插值的图像中出现了一些白色和黑色像素(image1),当我显示像素值时,我发现白色像素的值为负值,黑色像素的值大于 255,重建的图像也显得模糊(图像2和图像 3)。

提前致谢。

0 投票
1 回答
857 浏览

c# - 如何找到贝塞尔曲线的控制点?

我需要在 C# (Unity) 中以曲线的形式实现连接。我希望得到与 Miro.com 中的实现尽可能相似的结果(见截图)。

附加曲线后,我计算三次贝塞尔曲线的路径。对于第一段,使用锚点和与其连接的对象的偏移量。在这个阶段没有任何问题。

问题:当通过单击并拖动线段的一个蓝点(见截图)将曲线分割成线段时,它在中间被一分为二。在两条新曲线的交界处,形成了一个新的交互(可移动)点,其控制点的切线和坐标是未知的。每次交互点的位置发生变化(下图中的白点)时,我都需要找到这些控制点的位置。此外,曲线在分割时不应剧烈改变其位置,而不是形成循环,具有不同长度的控制点向量(我不确定这里)并尽可能充分地表现(就像在 Miro 的板上)。

控制点是指 Bezier 段的 2 个不可见的引导点。

我用黑色绘制了已知的控制点,用红色绘制了我需要找到的那些。(Pn - 交互点,Cn - 控制点) Miro.com 中的弯曲连接

我试图找到它们的算法给出了不正确的控制点距离和方向。

测试了以下算法:

  1. Interpolation from Tacent - 分离时曲线的跳跃,控制点的方向和缩进量不合适;
  2. Chaikin 算法 - 分离过程中的曲线跳跃,创建循环;
  3. 基于猜测的“自定义”插值(考虑到线段起点和终点之间到线段中心的距离,以及起点和终点之间的方向) - 有所有相同的问题,但看起来比上面的稍微好一点。

我怀疑解决方案是使用 Catmull-Rom 样条对点进行弦内插,并将结果转换为贝塞尔曲线的点。但是,实施上仍然存在问题。

来自 3DMax 的曲线看起来也非常相似。在他们的文档中,我发现只提到了参数曲线。

3DMax中的曲线 米罗的相同曲线

我没有使用(或不起作用)的方法:

  1. Catmull-Rom 插值;
  2. B样条插值;
  3. 厄米插值;
  4. De Casteljau 的算法(虽然它似乎不适合这个)

我将非常感谢任何帮助,但我要求尽可能详细。

0 投票
0 回答
105 浏览

three.js - 从 CatmullRomCurve3 和 ExtrudeBufferGeometry 更新路径

我正在研究如何更新保存在 ExtrudeBufferGeometry 中的 CatmullRomCurve3

此代码笔中显示的代码

我通过以下方式创建该行:

使用 BufferGeometry 我通常使用我添加的属性位置更新位置(显示在 l.119 上)

我在代码本身中放置了两组行,一组显示如何使用 BufferGeometry 和 Line(蓝线)执行此操作,第二组是 CatmullRomCurve3 和 Extrusion(白线)。

任何提示/提示/建议都会很棒!谢谢