我正在从事一个处理封闭曲线的项目。我想找出由坐标矢量移动扫出的曲线。只是为了减少代码,我试图用一个圆圈实现目标。我可以使用以下命令为矢量的运动设置动画
animate(arrow, [[cos(2*Pi*n/1000),sin(2*Pi*n/1000)], shape = arrow,
scaling = constrained], n=0..1000, frames = 100);
是否有办法跟踪被该曲线扫出的圆。同样,我的目标是能够对任意参数化曲线执行此操作。任何帮助将不胜感激。
答案 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);
如果这看起来很复杂,那么最好查看Maple的评估规则以进行过程调用。 Maple通常在传递给过程的参数之前进行求值。
但是有时您不希望执行该求值,例如,该过程可以在某些参数中为参数提供数值。也就是说,有时您想避免对参数进行过早评估。
seq
命令通过具有所谓的特殊评估规则来解决此问题,其中,对参数的评估被延迟到{{1 }}索引变量具有各个值。
通过seq
命令,您可以通过将main命令与其参数(在列表中分别传递)分开来处理它。这通常是足够的,但是当列表中的这些参数还包含对绘制命令的完整调用时,这是不足够的,直到动画参数获得其实际值之前,该命令才能评估为ok(即,没有错误,在前面)。
这就是为什么我在上例中还使用单右引号延迟评估对plots:-animate
和plots:-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:
(我没有费力地优化F(307.2);
,但是您可能会注意到F
和sin
调用发生了两次,而是在过程中只执行了一次并分配给局部变量。当您继续使用更复杂的参数曲线时,这可能会使事情变得更容易。)
现在,对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帧动画。