问题标签 [cubic-spline]

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 回答
165 浏览

math - 沿着等于给定切线向量的二维三次贝塞尔曲线计算时间 t

我有一个由四个点定义的三次贝塞尔曲线。我需要沿着三次贝塞尔曲线找到切线等于给定向量的时间 t。这个问题并不像乍看起来那么简单。我将首先解释我如何处理它的基本数学,以便您找到缺陷并​​可能找到更好的解决方案。

二维三次贝塞尔曲线及其切线可以由这些方程定义。特别是切线:

并扩展为二维向量:

然后我们还有一个向量 (x, y) 表示我们想要找到时间 t 的切线。

这些是简单的二次方程,所以我们只需要一个方程来求解。我们可以取两者之间的叉积 (vx0 * vy1 - vy0 * vx1) 并求解 0。这将发现三次贝塞尔曲线的切线等于我们给定的切线向量并且我们将求解 t。(我不在乎向量是否与切线相反,所以如果我们的向量是 (1, 0),那么它也会寻找 (-1, 0))。在 Mathematica 中,使用这种叉积方法求解 t 如下所示:

然后 Mathematica 将输出:

这是一个更容易看到的图像。也就是说,大多数情况下都有重复的变量,所以它比看起来要简单得多。(这两种情况是相同的,并且解是方程中的正例或负例,因为它求解了一个二次方程)。在代码形式中,这很容易看到:

因此,由于问题是二次的,因此我们所拥有的可能是我们预期的两次。这是 JS 中的一个交互式示例。该示例使用 (0.707, 0.707) 的硬编码切向量。(因此在该坐标系中指向下方和右侧的向量)。

上面的代码虽然有问题。即使在不等式和平方根计算中纠正浮点错误,也有一些没有明确定义的情况。就像当 y2 - y3 为 0 时导致除以零的情况一样。这也有一些微妙之处,例如在某些情况下 temp4 的有效结果非常接近于零,要么产生正确的结果,要么由于浮点问题产生的 t1 和 t2 的值比预期的大得多。在 t1 或 t2 为 0.5 的情况下,我特别注意到了这一点。正在考虑将其翻转过对角线并再次解决可能会解决一些极端情况,但我只是对这种方法没有信心。

我想要的是一种久经考验的方法,可能带有代码示例,或者在没有奇怪边缘情况的情况下解决这个问题的另一种方法。

0 投票
1 回答
635 浏览

javascript - 三个js中具有稳定过渡的样条曲线

我正在三个 js 中绘制 CubicBezierCurve3 曲线。但是,我希望它以稳定的过渡逐部分绘制,而不是一次绘制整条曲线。你可以把它想象成一个移动的火箭,留下一条气体轨迹。

我的想法如下

  1. 找到构成 CubicBezierCurve3 的所有点,并保存在一个名为“allpoints”的变量中。假设我们在 CubicBezierCurve3 中正好找到 50 个点,如下所示

    /li>
  2. 在每次迭代中,绘制 10 个点,这意味着

迭代 0:绘制点 0 到 9 迭代 1:绘制点 10 到 19 迭代 2:绘制点 20 到 29 迭代 3:绘制点 30 到 39 迭代 4:绘制点 40 到 49

这个函数负责在每次迭代中绘制 10 个点,因为我们有 50 个点,我们可以在第 5 次迭代结束时调用 cancelAnimationFrame。该函数包含一些变通方法,以处理时间问题。(仅在每 10 次迭代后,我绘制 10 点序列,否则,转换将太快,我们将无法确定区别)

JS小提琴

  1. 这是我尝试过的平滑过渡的JS Fiddle
  2. 这是CubicBezierCurve3 中所有点的JS Fiddle

我的问题是,有没有更好的方法/API 来实现这一点?另外,我想在关闭之前稍微延迟一下,比如 LED 如何关闭而不是突然变得不可见。实际上,它甚至不必通过使用单个点来完成,正如我所尝试的那样,我正在寻找任何可以增量绘制给定三次贝塞尔曲线的部分的东西。

预期输出的一个例子是here

0 投票
1 回答
858 浏览

matlab - 具有平面外推的夹紧三次样条

我正在尝试在边界节点处实现具有零斜率(平面外推)的钳位三次样条,但我无法获得所需的结果。

例如设置:

我可以使用 CSPE 函数来获得分段多项式

接下来,评估 [0-10] 范围内的 pp 得到,

在此处输入图像描述

但是,此方法无法实现 [3-9] 范围之外的平坦外推(即,对于 x<3,y 的所有值都应该是 2,对于 x>9,y 的所有值都应该是 0.5)

有什么方法可以达到预期的效果吗?

编辑:应保留边界结处的连续性

0 投票
1 回答
1606 浏览

python - scipy.interpolate 中的 interp1d 函数使用什么算法

所以我正在为我的数值课程编写一个 python 程序,我不得不编写一个三次样条程序。所以我实现了在Chapra 和 canale 的数值方法和chenny和 kincaid 的数值数学等书中给出的三次样条公式。

所以我的数据是

x=1.5使用这些数据并应用三次样条,我得到y=1.79122340426

在使用相同的数据但使用 scipy 函数时给出:

那么,为什么会出现这种结果差异呢?很明显,他们没有使用相同的公式。该 scipy 函数中使用的三次样条公式是什么?它是自然三次样条公式还是改进的东西?注意:值 1.2656 更准确。

0 投票
0 回答
237 浏览

r - 样条曲线拟合和平滑

我正在尝试使用样条曲线拟合曲线。

当我研究它时,结和控制点是制作曲线的重要因素。

然而,支持制作样条曲线的函数,没有关于控制点的参数。(包括关于结的论点......)

这是我想用于曲线拟合的函数。 bssmooth.spliner 中的函数。

你能解释一下控制点和节点之间的关系吗?

以及如何为我的数据集确定合适的结数?(坐标数据,三次样条,想用样条做轨迹)

这个问题可能很幼稚,请为幼稚的工程师回答。

谢谢。

0 投票
0 回答
187 浏览

r - 使用固定大小的时间窗口的样条插值

我想做样条插值,但不是一般的方法。

我的数据分布不均,充满了空白。

要插值的数据

我希望样条做的不是考虑一定数量的插值观察,而是考虑某个时间窗口,例如。10年。

有谁知道要使用什么功能,因为下面的代码

似乎没有办法,我不知道该插手什么。

所需资料:

0 投票
0 回答
154 浏览

r - 三次样条插值,R和matlab中的差异

我正在尝试使用 R 的 splinefun {stat}s 包中的 spline() 函数在 matlab 中复制 spline() 函数,但没有完全访问 matlab(我没有它的许可证)。我能够将所有必要的数据输入到 R 中,这些数据将出现在 matlab 中,但我的样条输出与 matlab 的输出平均相差 0.0036(maxdif 为 .0342,mindif 为 -.0056,stdev 为 .0094) . 我的主要问题是,matlab 的公式与 R 的公式相比如何,我的计算差异可能来自哪里?

我的代码的第一部分是将 excel 电子表格输入 R,然后计算必要的变量以获得 tau 和快速增量。在此之后,我运行样条计算,然后旋转输出以便导出回 excel。下面是基本脚本,加上一些数据来尝试看看我的计算是否存在缺陷。我使用样条曲线(自然),因为它返回最接近 matlab 模型的值。

这个样条运行的基本数据点都包括在内(我认为),一切都应该正确排列。提前感谢您的帮助!

0 投票
0 回答
144 浏览

matlab - 如何使用 MATLAB 在断点(不仅结束)处制作具有特定一阶导数值的 B 样条曲线?

csape在曲线拟合工具箱中使用了函数,它使用户可以选择两端的导数值。

有没有办法控制特定断点的导数值?

我想在一个断点处将导数的值之一设置为零,以使其成为最大值。

这是代码:

在评论之后,%% Spline generation using cubic spline. 我有两个向量,一个用于时间,一个用于另一个随时间变化的值,我想制作三阶 b 样条。

我使用csape它是因为它使用户能够确定端点的导数值。cs = csape(tt,zz,[1 0 0 0 1],[0 0 0 0 0])那些是告诉工具在端点处进行一阶导数 = 0。

我希望时间 = tmaxh 出现的点是样条曲线上的最大值。

我尝试通过在其中放置 1 来实现这一点,[1 0 0 0 1]因此[1 0 1 0 1]我知道一阶导数最多为 0,但这种方法对我不起作用。

谢谢你。

0 投票
1 回答
494 浏览

python - Python梯度匹配样条

我正在尝试使用 Python 中的样条线填充两条曲线之间的间隙。我希望我的新线与每一端原始曲线的渐变相匹配。问题源于在 scipy.interpolate 样条例程中需要单调增加的 x 值。下面的代码是我正在处理的示例。蓝色的两条曲线(“第 1 行”和“第 2 行”)是我所拥有的,并且(类似于)我想要的样条曲线由标有“想要”的线显示。

有没有人有任何建议我该怎么做?

样条图示例

0 投票
2 回答
4952 浏览

java - 如何使用三次样条插值在java中获得曲线?

我正在图像处理中使用三次样条插值来获得中间点,如此处所示。我怎样才能用 Java 语言实现这一点。比如我有一些要点:

  • x = 24、35、67、78,79。
  • y = 13, 45, 8, 45, 23。我想得到 x=1 到 100 的中间点。

在此处输入图像描述

java中是否有任何可用的库或函数。请告诉。