如何描出曲线
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:-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);
以上生成与之前相同的动画。
这是另一种方法,通过构建包含所有帧序列的列表。
请注意,如前所述,在未知、未分配的名称 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 帧动画。
我正在处理一个处理闭合曲线的项目。我想描绘出一条由坐标向量移动扫出的曲线。只是为了写下代码,我正在尝试使用圆圈来实现目标。我可以使用以下命令为矢量的运动设置动画
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:-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);
以上生成与之前相同的动画。
这是另一种方法,通过构建包含所有帧序列的列表。
请注意,如前所述,在未知、未分配的名称 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 帧动画。