主要内容

平面中的样条

这个例子展示了如何使用spmakspcrvcscvnrscvn命令从曲线拟合工具箱™在平面上构造样条曲线。这包括绘制切线和计算曲线围成的面积。

一个简单的样条曲线

曲线拟合工具箱可以处理向量值样条函数。d向量值单变量样条提供了d空间中的曲线。在这种模式下,d = 2是最常见的,因为它给出了平面曲线。

下面是一个例子,在这个例子中,一个具有二维系数的样条被构造并绘制。

节= [1,1:9 9];spmak(结点,repmat([0 0;1 0;1 1;0 1], 2,1)。”);t = linspace (8121);值= fnval(曲线、t);:情节(值(1)、价值观(2:)“线宽”2);轴([-。1.4 - 4。2 1.2),轴平等的标题(样条曲线的);持有

警告

您可能已经注意到这个示例没有使用fnplt绘制曲线,而不是绘制曲线上的一些点fnval.下面是代码:

t = linspace (8121);值= fnval(曲线、t);:情节(值(1)、价值观(2:),“线宽”,2)

使用fnplt直接使用这个特殊的样条曲线可以得到下图中的红色曲线。

fnplt(曲线,“r”5);标题(完整的样条曲线,红色

解释吗?

样条是4阶的,但结的末端在结序列中

节= 1 1 2 3 4 5 6 7 8 9 9

只有多重性2。因此,这个结序列的所有4阶b样条在基本区间的端点处都是0。这使得曲线在(0,0)处开始和结束。

补救措施

因为,在这种情况下,我们真正感兴趣的只是与参数区间[3 ..]对应的曲线段。,我们可以使用fnbrk提取这部分,然后用黄色标出来fnplt

Mycv = fnbrk(curve,[3 7]);fnplt (mycv“y”, 2.5);标题(“有趣的样条曲线,用黄色表示”

被曲线包围的区域

因为你现在有一个样条曲线mycv,你可以很容易地计算出这个封闭曲线所包围的面积,如下所示。

面积= diff (fnval (fnint (...fncmb (fncmb (mycv [0, 1]),‘*’曾经(fncmb (mycv [1 0])))...), fnbrk (mycv,“间隔”)))
面积= -0.8333

稍加努力,你就能认出这个是积分的值

int y(t) d(x(t)) = int y(t) Dx(t) dt

在样条的基本区间内mycv,(x (t), y (t)): = fnval (mycv t)曲线上与参数值对应的点t.在这里,fncmb (mycv [1,0])fncmb (mycv [0,1])描述样条曲线的两个组成部分,即标量值样条xy

同样,曲线大致是一个半径为1/2的圆。因此,大致上,

disp(π/ 4)
0.7854

但是为什么计算面积?因为当一个人在曲线上移动时,曲线所包围的面积是在左边的t.为了证明这一点,我们画一些切向量。

添加一些切向量

我们重画曲线,并在某些点上画出曲线的切向量。

持有fnplt (mycv“y”, 2.5);持有t = 3: .4:6.2;CV = fnval(curve, t);CDV = fnval(fnder(curve), t);箭袋(简历(1:),简历(2:),cdv (1:), cdv (2:));标题(有一些切线的样条曲线((-)轴。1.4 - 4。2 1.2),轴平等的

曲线与直线的交点

如果你想确定样条曲线和直线的交点y = x,下面的代码会给出它们,并在曲线内绘制直线的线段:

削减= fnval (mycv,...意思是(fnzeros (fncmb (fncmb (mycv [0,1]),“- - -”fncmb (mycv (1,0))))));削减:情节(削减(1),(2,:)“y”“线宽”, 2.5)标题(带有切线和横切的样条曲线

控制多边形和相应的样条曲线

样条曲线被广泛地用于生成插图,其中没有什么比光滑的曲线的某种粗略想象的形状是必需的。为此,曲线拟合工具箱包含一个特殊命令,spcrv,它可以独立于工具箱的其他部分使用。

给定一个平面上的点序列,或者一个顺序kspcrv通过重复插入中点结,生成有序的样条曲线k其控制多边形由给定序列指定。

下图显示了这样一个控制多边形,以及相应的3阶样条曲线。

积分= [0 0;1 0;1 1;0 2;1 1;1 0;0 1;0 2]。”;值= spcrv(点,3);情节(点(1:),点(2:)“k”);轴([-2 2.25 -2.1 2.2]);持有:情节(值(1)、价值观(2:)“r”“线宽”, 1.5);传奇({控制多边形的二次样条曲线的},“位置”“本身”);

请注意,曲线在控制多边形的中点接触到每个分段,并遵循控制多边形勾勒出的形状。

提高订单

提高订单k将拉曲线远离控制多边形,使它更平滑,但也更短。在这里,我们添加了相应的4阶样条曲线。

value4 = spcrv(点,4);情节(value4 (1:), value4 (2:)“b”“线宽”2);传奇({控制多边形的二次样条曲线的...三次样条曲线的},“位置”“本身”);

CSCVN

另一方面,为了得到插值曲线,你可以使用cscvn命令,它提供一个参数化的“自然”三次样条曲线。

fnplt (cscvn(点),‘g’, 1.5);传奇({控制多边形的二次样条曲线的...三次样条曲线的插值样条曲线的},...“位置”“本身”);

通过在第二个控制点(1,0)附近添加点(.95,-.05),我们可以创建一个插值样条曲线,在那里转得更快。

Np = size(points, 2);Fnplt (cscvn([points(:,1)] [.95;-.05)点(:,2:np)]),“米”, 1.5);情节(.95、0。‘*’);传奇({控制多边形的二次样条曲线的...三次样条曲线的插值样条曲线的...“更快转弯”(1,0)},...“位置”“本身”);持有

RSCVN

你也可以得到一条由圆弧组成的切线-连续曲线,它通过平面上给定的点序列,并且任意地与点上给定的法向正交。命令rscvn提供这样的曲线。

例如,下面生成一个圆

C = rscvn([-1 1 -1;0 0 0],[1 1;0 0]);

正如情节所示。

fnplt (c);轴([-1.05 1.05 -1.05 1.05]),轴平等的,轴

c是一个仅由两部分组成的二次有理样条,如下面的命令所示。

[form, order, breaks] = fnbrk(c,“f”“o”“b”
1 . form = 'rBform' order = 3 break = 0

使用这个工具很容易生成引人注目的模式,只需使用几个数据点。举个例子,这是贝尔法斯特阿尔斯特博物馆(Ulster Museum)的铜制三氏奖章(Bronze Triskele Medallion)的设计版本,据说是很久以前用圆形弧线做的。

页= [0 (7);5.4, 3, 6.9, 2.75, 2.5, .5, 5];α= 2 *π/ 3;ca = cos(α);sa =罪(α);C = [ca sa;-sa ca];D = [0 0 .05 -.05;1 -1 .98 .98];D = [D c* D];阴= rscvn ([pp (: [7, 1:3]), c *页(:,3:4)、pp (:, 3)], d (:, [1 2 1 4 7 5 1]));fnplt(阴)殷,fnplt (fncmb (c)), fnplt (fncmb(阴,c '))杨= rscvn ([pp(:, 6)、pp (:, 6), pp (:, 5), c *页(:,4)],[d (:, (2 1 1)), c (:, 2)));Fnplt (yang), Fnplt (fncmb(yang,c)), Fnplt (fncmb(yang,c’))轴([-7.2 7.2 -7.2 7.2]),轴平等的,轴,保持