我想用 Asymptote 制作图形动画。为此,该函数需要一个参数d
;
real f(real x, real y) {
return (x^2 + y^2 + d * x);
}
guide[][] thegraphs = contour(f, a=(-2,-2), b=(2,2), new real[] {0});
我们如何使用轮廓发送参数?
答案1
是的,在 Asymptote 中有所谓的匿名函数(参见这里,第 290 页)可以通过关键字来创建new
,这样就可以简化示例中的函数定义,而无需使用编程技巧(你很难 ^^ 你的技巧很舒服!)。
size(5cm);
import graph;
import contour;
typedef real function(real, real);
function f(real d) {
return new real(real x, real y) {
return x^2 + y^2 -1+ d*x^2*y^2;
};
}
pen[] c={red, blue,purple,orange}; c.cyclic=true; // for different Edwards curves
for(int d=100; d > 0; d -= 10) {
guide[][] thegraphs = contour(f(d), a=(-2,-2), b=(2,2), new real[] {0},nx=200,operator..);
// nx=200 >>> for larger sample (default nx=100,ny=nx)
// operator.. >>> smoother join
draw(thegraphs[0],c[d]);
}
shipout(bbox(5mm,invisible));
我希望你能将其改编成你的动画。顺便说一句,我对最近发现的 Edwards 曲线及其在密码学中的应用印象深刻。
渐近线富有浓郁的数学味道!
更新动画版
// x.asy >>> x.pdf >>> making GIF ưith ImageMagick command in the command line window
// magick -density 200 x.pdf -alpha remove x.gif
unitsize(2cm);
import contour;
import animate;
typedef real function(real, real);
function f(real d) {
return new real(real x, real y) {
return x^2 + y^2 -1+ d*x^2*y^2;
};
}
real a=1.25;
draw(box((a,a),(-a,-a)),invisible);
draw((a,0)--(-a,0)^^(0,a)--(0,-a),gray);
animation A;
for(real d=360; d > -1; d -= 5) {
save();
guide[][] Edwards = contour(f(d), a=(-1,-1), b=(1,1), new real[] {0},nx=200,operator..);
draw(Edwards[0],blue);
label("$d = $ "+string(d),(-a+.2, -a+.2),align=E);
A.add();
restore();
}
erase();
A.movie();
答案2
我已经通过编程技巧解决了我的问题;
real g(real x, real y, real d) {
return (x^2 + y^2 + d * x);
}
animation A=animation(global=false);
for(int i=300; i != 1; i -= 1) {
erase();
real f(real x, real y) {
return g(x, y, i);
}
guide[][] thegraphs = contour(f, a=(-2,-2), b=(2,2), new real[] {0});
draw(thegraphs[0]);
A.add(BBox(1cm, nullpen));
}
erase();
A.movie(delay=240);
这是爱德华兹曲线的动画;