如何描出曲线

How to trace out a curve

我正在处理一个处理闭合曲线的项目。我想描绘出一条由坐标向量移动扫出的曲线。只是为了写下代码,我正在尝试使用圆圈来实现目标。我可以使用以下命令为矢量的运动设置动画

animate(arrow, [[cos(2*Pi*n/1000),sin(2*Pi*n/1000)], shape = arrow, 
        scaling = constrained], n=0..1000, frames = 100);

有没有办法追踪这条曲线扫过的圆。同样,我的目标是能够对任意参数化曲线执行此操作。非常感谢任何帮助。

这是一个基本但冗长的方法,

restart;
plots:-animate(plots:-display,
               [ 'plots:-arrow([cos(2*Pi*n/1000),
                                sin(2*Pi*n/1000)],
                               shape = arrow)',
                 'plot([cos(2*Pi*nn/1000),
                        sin(2*Pi*nn/1000),nn=0..n])',
                 scaling = constrained ],
               n=0..1000, frames = 30);

如果这看起来很复杂,那么复习一下 Maple 的过程调用求值规则或许是件好事。 Maple 通常会在 将参数传递给过程 之前计算参数。

但有时您不希望发生该评估,例如,该过程可以为某个参数中的参数提供数值。也就是说,有时您想避免 过早评估 参数。

seq命令通过所谓的特殊求值规则来处理这个问题,其中参数的求值是延迟seq 索引变量采用单独的值。

plots:-animate 命令允许您通过将主命令与其参数(在列表中单独传递)分开来处理它。这通常就足够了,但当列表中的那些参数还包含对绘图命令的完整调用时,这些命令在动画参数获得其实际值之前不会评估 ok(即没有错误,预先)。

这就是为什么我还使用单右引号 延迟 上例中对 plots:-arrowplot 调用的评估。这些评估需要等到动画参数 n 呈现其实际数值。

另一种相关方法是创建一个接受动画参数值并构建整个帧的过程。

F := proc(n)
       plots:-display(
         plots:-arrow([cos(2*Pi*n/1000),
                       sin(2*Pi*n/1000)],
                      shape = arrow),
         plot([cos(2*Pi*nn/1000),
               sin(2*Pi*nn/1000),
               nn=0..n]),
         scaling = constrained);
     end proc:

这很方便,因为它可以让您预先测试。

F(307.2);

(我没有费心去优化 F,但是你会注意到 sincos 调用发生了两次,而是在过程中只执行了一次并且分配给局部变量。当您继续处理更复杂的参数曲线时,这可能会使事情变得更容易。)

现在对 plots:-animate 的调用可以变得简洁,

plots:-animate(F, [ n ],
               n=0..1000, frames = 30);

以上生成与之前相同的动画。

这是另一种方法,通过构建包含所有帧序列的列表。

请注意,如前所述,在未知、未分配的名称 n 处计算 F 会产生错误。

F(n);
  Error, (in plots/arrow) invalid input: plottools:-arrow
  expects its 3rd argument, pv, to be of type {Vector, list, 
  vector, complexcons, realcons}, but received 0.5000000000e-1* 
  (cos(0.6283185308e-2*n)^2+sin(0.6283185308e-2*n)^2)^(1/2)

错误发生是因为n没有数值。

但是 seq 命令的特殊求值规则允许我们继续进行,因为它延迟了 F(n) 的求值,直到 n 获得它的值。

# note termination with full colon, to suppress output
S := [seq(F(n), n=0..1000, (1000-0)/(30-1))]:

nops(S);  # check that we really got 30 frames
                     30

plots:-display(S, insequence=true);

最后一条命令也显示相同的 30 帧动画。