如何绘制曲线

时间:2019-03-18 18:27:07

标签: maple

我正在从事一个处理封闭曲线的项目。我想找出由坐标矢量移动扫出的曲线。只是为了减少代码,我试图用一个圆圈实现目标。我可以使用以下命令为矢量的运动设置动画

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

是否有办法跟踪被该曲线扫出的圆。同样,我的目标是能够对任意参数化曲线执行此操作。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

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);

enter image description here

如果这看起来很复杂,那么最好查看Maple的评估规则以进行过程调用。 Maple通常在传递给过程的参数之前进行求值。

但是有时您不希望执行该求值,例如,该过程可以在某些参数中为参数提供数值。也就是说,有时您想避免对参数进行过早评估

seq命令通过具有所谓的特殊评估规则来解决此问题,其中,对参数的评估被延迟到{{1 }}索引变量具有各个值。

通过seq命令,您可以通过将main命令与其参数(在列表中分别传递)分开来处理它。这通常是足够的,但是当列表中的这些参数还包含对绘制命令的完整调用时,这是不足够的,直到动画参数获得其实际值之前,该命令才能评估为ok(即,没有错误,在前面)。

这就是为什么我在上例中还使用单右引号延迟评估对plots:-animateplots:-arrow的调用的原因。这些评估需要等待,直到动画参数plot具有其实际数值为止。

另一种相关方法是创建一个过程,该过程接受动画参数值并构造整个框架。

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:

enter image description here

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

现在,对cos的呼叫很简洁

plots:-animate

上面产生的动画与以前相同。

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

请注意,按照书面规定,以未知的未分配名称plots:-animate(F, [ n ], n=0..1000, frames = 30); 评估F会产生错误。

n

发生错误是因为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

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