问题标签 [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 投票
2 回答
6059 浏览

c++ - 三次样条:开始/结束段插值

我正在用 C++ 进行样条插值。我使用了这里的代码:http: //tehc0dez.blogspot.ch/2010/04/nice-curves-catmullrom-spline-in-c.html(代码也链接在那个页面上,它在github上) . 该应用程序适用于闭合轮廓,因为它将前三个点复制到末尾。

但在我的情况下,我需要能够制作一个“开放”的形状——或者更确切地说是线——,其中第一个和最后一个点没有连接。

我的理解是,由于 Catmull-Rom 样条曲线是三次的,如果不添加任何额外的点,我将无法计算第一段和最后一段的插值点。

我读到插值这两个段中的点的常用方法是使用二次插值。

不幸的是,我无法理解如何做到这一点。我已经找到了如何进行二次贝塞尔近似,但这不是我想要做的,因为我不想引入任何额外的支持点。

我找到了这个网站:http ://dafeda.wordpress.com/2010/09/01/newtons-divided-difference-polynomial-quadratic-interpolation/这很好地解释了如何进行二次插值。但我不知道如何根据我的情况调整它,我想计算一个新点而不仅仅是 y。

任何帮助,将不胜感激。谢谢 !

0 投票
1 回答
4171 浏览

java - CatmullRomSplines 和其他平滑路径

我一直在研究让二维平面上的对象遵循由多个控制点定义的平滑曲线。根据我的发现,我正在寻找Catmull-Rom-Spline

我一直在为我的项目使用 LibGDX,它有自己的 Catmull-Rom-Spline 实现,但是我很难理解它是如何工作的,因为我很难找到实现 Catmull 的文档或其他源代码-使用 LibGDX 的 Rom-Splines。

我正在寻找对 LibGDX Catmull-Rom-Spline 实现的解释或另一种实现平滑路径的方法,该路径使用 Catmull-Rom-Splines 或其他方法实现控制点。我正在寻找的是能够生成路径并传回该路径上某个点的 x 和 y 坐标。如果有人有任何建议或指示,将不胜感激。谢谢。

0 投票
1 回答
1554 浏览

opengl - 如何通过线性插值执行快速 Catmull-Rom 纹理倾斜?

我读过一些介绍使用 GL_LINEAR 的快速三阶插值的文章。

因为 [1] 包含大量勘误表,如果您想了解形式主义,我建议您阅读 [2]。

他们都提到了这种方法的限制。对于具有 GL_LINEAR 的过滤纹理,仅当 0 <= b/(a+b) <= 1时,下一个关系才成立

a*f(i, j) + b*f(i+1, j) = F(i+b/(a+b), j)

其中 f 是原始图像数据,F 是 OpenGL 的线性插值纹理。

这就是问题所在。[1] 提到这种方法也可以应用于 Catmull-Rom 双三次。

该方法还可以适用于插值滤波器,例如 Catmull-Rom 样条

但是,很明显,对于包含负数部分的 Catmull-Rom 加权函数,条件 (0 <= b/(a+b) <= 1) 无法满足。事实上,我尝试用相同的逻辑实现 Catmull-Rom,它只会产生模糊的图像。

有没有一种特殊的方法可以将 [1] 和 [2] 中的方法应用于 Catmull-Rom 插值?或者我是否必须为 Catmull-Rom 获取所有 16 个纹素?

0 投票
1 回答
85 浏览

eclipse - CatmullRomSpline 不接受类型争论

我希望为我的 2D 游戏创建平滑的路径。看着CatmullRomSpline它正是我需要的东西。每一篇文章,甚至在这里SE都给它一个类型,并通过Boolean构造函数传递所有控制点和一个。这现在似乎已经过时了,CatmullRomSpline不再接受任何类型参数,没有它它只能与V3路径一起使用。构造函数也不接受控制点列表。

这给出了以下错误:The type CatmullRomSpline is not generic; it cannot be parameterized with arguments <Vector2>

在此处输入图像描述

我是否遗漏了什么或者 CatmullRomSpline 现在的工作方式有所不同,以及如何?

这是来自 badlogic 的 CatmullRomSpline 类。看起来事情确实发生了变化,我从“import com.badlogic.gdx.math.CatmullRomSpline;”得到这个类

公共类 CatmullRomSpline 实现 Serializable { private static final long serialVersionUID = -3290464799289771451L; 私有列表 controlPoints = new ArrayList(); 矢量3 T1 = 新矢量3(); 矢量3 T2 = 新矢量3();

/** 添加一个新的控制点 * * @param point 点 */ public void add (Vector3 point) { controlPoints.add(point); }

/** @return 所有控制点 */ public List getControlPoints () { return controlPoints; }

/** 返回一条路径,在每两个控制点之间生成 numPoints 并且控制点本身也被添加。* 第一个和最后一个控制点被省略。如果控制点少于 4 个,则返回空路径。* * @param numPoints 段返回的点数 * @return 路径 */ public List getPath (int numPoints) { ArrayList points = new ArrayList();

(numPoints + 1); 浮动 t = 增量;

1)).mul(0.5f); T2.set(controlPoints.get(i + 2)).sub(controlPoints.get(i)).mul(0.5f);

points.add(controlPoints.get(controlPoints.size() - 2));

/** 返回一条路径,在每两个控制点之间生成 numPoints 并且控制点本身也被添加。* 第一个和最后一个控制点被省略。如果控制点少于 4 个,则返回空路径。* * @param 指向 Vector3 实例的数组以存储路径 * @param numPoints 为段返回的点数 */ public void getPath (Vector3[] points, int numPoints) { int idx = 0; if (controlPoints.size() < 4) 返回;

/ (numPoints + 1); 浮动 t = 增量;

1)).mul(0.5f); T2.set(controlPoints.get(i + 2)).sub(controlPoints.get(i)).mul(0.5f);

/** 返回路径中点的所有切线。与 getPath 的语义相同。* * @param numPoints 为段返回的点数 * @return 路径中点的切线 */ public List getTangents (int numPoints) { ArrayList tangents = new ArrayList();

增量 = 1.0f / (numPoints + 1); 浮动 t = 增量;

1)).mul(0.5f); T2.set(controlPoints.get(i + 2)).sub(controlPoints.get(i)).mul(0.5f);

1)).sub(controlPoints.get(controlPoints.size() - 3)) .mul(0.5f).cpy().nor());

/** 返回路径中点在 2D 空间中的所有切线法线。控制点必须位于 x/y 平面上才能使 * 起作用。与 getPath 的语义相同。* * @param numPoints 为段返回的点数 * @return 路径中点的切线 */ public List getTangentNormals2D (int numPoints) { ArrayList tangents = new ArrayList();

增量 = 1.0f / (numPoints + 1); 浮动 t = 增量;

1)).mul(0.5f); T2.set(controlPoints.get(i + 2)).sub(controlPoints.get(i)).mul(0.5f);

/** 使用切线返回切线的法线,并提供向上向量做叉积。* * @param numPoints 每段的点数 * @param up 向量 * @return 切线法线列表 */ public List getTangentNormals (int numPoints, Vector3 up) { List tangents = getTangents(numPoints); ArrayList 法线 = new ArrayList();

Vector3(切线).crs(上).nor());

public List getTangentNormals (int numPoints, List up) { List tangents = getTangents(numPoints); ArrayList 法线 = new ArrayList();

Vector3(切线).crs(up.get(i++)).nor());

0 投票
0 回答
364 浏览

libgdx - CatmulRomSpline libgdx 中的最小控制点数

我正在使用 libgdx 的CatmullRomSpline类来创建通过三个点的平滑曲线。基本上我想在两个平台之间以弯曲的路径放置硬币。为此,我遵循以下算法参考图像

  • 以第一平台的终点为第一控制点;

  • 取第一个平台的顶端和第二个平台的顶端的中间点,在y方向上增加一点高度,并以此点作为第二个控制点。

  • 以顶部起点作为第二平台作为第三控制点。

现在,当我尝试使用这三个控制点为我的硬币生成创建一条平滑路径时,我只得到一个值,即 t 所使用的值(CatmullRomSpline 使用浮点值 t 作为参数,它必须改变 bw 0 和 1)。

有什么我想念的吗。是我需要提供更多控制点吗?

0 投票
1 回答
6341 浏览

c# - 如何更新 Unity GameObject 以沿样条曲线移动?

下午好,

我正在尝试在 Unity 中实现一个 GameObject,它在给定 8 个受约束的随机值的情况下沿着 Cubic CatMull-Rom Spline 移动。我已经实现了一个函数ComputePointOnCatmullRomCurve,它返回三次 Catmull-Rom 曲线上的一个点(给定一个从 0 到 1 的标量 'u' 和表示用于插值的 4 个点的段数)。

我在实现更新功能以使游戏对象顺利移动时遇到问题。我目前在每次更新时都调用ComputePointOnCatmullRomCurve,并且每次都在递增 segment_number。然后将 GameObjects 位置设置为函数的结果。

然而,这会导致 GameObject 移动得非常快。我相信我的更新函数不正确,但我不确定如何相对于插值函数输出的点移动游戏对象。

如果有人能够向我解释我做错了什么,或者提供示例或示例链接,那将非常有帮助!

计算曲线上的点的函数:

更新功能:

变量:

谢谢!

马特

0 投票
3 回答
2653 浏览

r - 在 R 中计算二维样条曲线

我正在尝试计算通过一系列 xy 坐标的贝塞尔样条曲线。cscvn一个示例类似于Matlab中函数的以下输出(示例链接):

在此处输入图像描述

我相信(不再维护的)grid包用于执行此操作(grid.xspline功能?),但我无法安装该包的存档版本,并且没有找到与我想要的完全一致的任何示例.

这个bezier包看起来也很有希望,但它很慢,我也不能完全正确:

在此处输入图像描述

如您所见,它不通过除结束值之外的任何点。

我将非常感谢这里的一些指导!

0 投票
0 回答
1616 浏览

java - 在 libgdx 中绘制带有端点和起点的 CatmullRomSpline

所以我的目标是绘制一个类似于这个的样条线(线穿过每个点): 在此处输入图像描述

但样条循环(从终点 2 回到起点):

在此处输入图像描述

我尝试更改 catmullromspline 中的“连续”布尔值,但这导致仅在屏幕中心绘制了一个点。

当它到达最后一点时,我也结束了线条绘制,但结果很丑,因为线条在起点和终点仍然弯曲。

我在源代码中到处查看,找不到可以阻止它循环的函数。

据我所知,贝塞尔样条曲线不会通过所有点(它们只在它们附近通过)。

所以我该怎么做?

这是我的代码:

0 投票
3 回答
3879 浏览

svg - Catmull-Rom interpolation on SVG Paths

I am experimenting with creating high-performance, good-looking pencil tools using SVG paths.

I am logging the mouse coordinates to draw a path. To get a high-fidelity path (accurate to the user's movements) I need to log a point for every pixel movement.

Keeping each and every point in the path creates a huge amount of points which is not ideal for collaborative features later-on (sending huge amount of points back and forth is not efficient), plus parsing huge paths every time I need to manipulate them is a bottleneck

On linear areas of the path, redundant points are removed keeping only the points necessary to represent the segment - I do this using the Ramer-Douglas-Peucker algorithm.

But simplifying a path turns it into a low-fidelity polygon

At this point the paths are effectively just connected lines - therefore the paths look jagged.

A possible solution is to connect the path points with Cubic Bezier's - however this doesn't work nice on simplified paths. The distance between each point is too large for the Cubic Bezier's to "sit" nice so the smoothed path no longer accurately represents the intended path of the user.

Another solution is to simply use a "post-processing" algorithm such as Schneider's Algorithm on the original path - This algorithm won't practically work in real-time though since it's a performance hog

An ideal solution

A solution that(I think) could work is to use a Centripetal Catmull-Rom interpolation.

Centripetal Catmull Rom vs rest of Catmull-Rom variants

Out of all the algorithms I researched, this seems to be the most promising since:

  1. It doesn't create self-intersections on tight corners
  2. It fits more snug on the points thus it more accurately represents the original path.

Is Catmull-Rom an algorithm that interpolates a series of regular x/y points or does the original path need to be comprised of curves?

0 投票
1 回答
1138 浏览

matrix - 弦 Catmull-Rom 样条

我一直在努力让 Catmull-Rom 样条线为一个辅助项目工作,并且很难让它完成我需要的工作。我尝试了以下两种实现,但都不适用于我,而且我无法追踪我的代码中相对于他们的任何错误(我必须假设已经过测试)。我称他们为“ABC”解决方案:

没有尖点和自相交的 Catmull-rom 曲线

https://en.wikipedia.org/wiki/Centripal_Catmull%E2%80%93Rom_spline

然后我实现了以下解决方案(我称之为“矩阵”解决方案),它确实使用编辑后的第 3 版帖子工作: https ://www.opengl.org/discussion_boards/showthread.php/159518-catmull-rom-样条

但是,此 Matrix 解决方案仅实现了具有 0.5 'a' 值的 Catmull-Rom 内置到矩阵中。我想让 Chordal 工作,因此我需要 'a' == 1。

鉴于我对 ABC 版本的解决方案引起了问题,我尝试使用此处的矩阵 ( http://algorithmist.net/docs/catmullrom.pdf ) 来传递我自己的“a”。这是原始的 0.5 代码,后面是我修改后的代码,它传入了用户指定的“a”。

原始代码:

修改代码:

这当然行不通。但是,我不明白为什么。在 pdf 第 4 页的底部,它显示了带有“a”的矩阵。我已经在上面修改过的代码中替换了它,并对其进行了三次检查,但样条曲线被搞砸了。它应该给我同样的答案。更令人困惑的是,他在第 5 页上的结果采用了生成的矩阵并将其乘以 0.5,从而将所有 /2 从矩阵条目中删除。最终矩阵使用这些值,但第 4 页上的原始矩阵不是 0.5 * 矩阵,它只是“矩阵”。为什么这个 0.5 是任意添加的,为什么没有它一切都会崩溃?

无论如何,有谁知道我的方程式可能做错了什么?我可以使用这种矩阵形式从 0-1 传入我自己的“a”并创建均匀、向心和弦样条线,还是必须使用 ABC 形式?

提前致谢!