2026a

# 构造二维和三维样条


这个示例展示了如何使用曲线拟合工具箱中的 cscvn 指令在二维和三维构造三次样条曲线。

# 选择点

这个例子将展示如何通过一个点列表,按照它们出现的顺序绘制一条平滑曲线。 首先,我们在平面中选择一些随机点,并将它们存储在一个矩阵中,每列一个点。

using TyPlot
using TyCurveFitting
using TyMath
npts = 10
rng = MersenneTwister(1234)
xy = [randn(rng, 1, npts); randn(rng, 1, npts)]
plot(xy[1, :], xy[2, :], "ro", linewidth = 2)
text(xy[1, :], xy[2, :], [repeat(["  "], npts, 1) .* string.((1:npts))...])
ax = gca()
ax.XTick = []
ax.YTick = []

# 连接点

接下来,使用 cscvn 命令构建曲线并使用 fnplt 绘制曲线。

hold("on")
fnplt(cscvn(xy), "r", 2)
hold("off")

# 3-D 样条曲线

在三个维度上创建样条曲线同样容易。 这一次,我们将做一些不那么随机的事情。 首先,我们生成点。

npts = 13
t = LinRange(0, 8 * pi, npts)
z = LinRange(-1, 1, npts)
omz = @. sqrt(1 - z .^ 2)
xyz = transpose([cos.(t) .* omz sin.(t) .* omz z])
plot3(xyz[1, :], xyz[2, :], xyz[3, :], "ro", linewidth = 2)
ax = gca()
ax.XTick = []
ax.YTick = []
ax.ZTick = []

# 连接点

这是通过 cscvn 提供的这些点的 3D 样条曲线。 通过将第一个点附加到列表的末尾,我们得到了一条平滑的闭合曲线。

hold("on")
fnplt(cscvn(xyz[:,[1:end;1]]),"r",2)
hold("off")