Billard
>function d(z0,z1,z) := abs(z-z0)+abs(z-z1)
>t=linspace(0,2*pi,300); z=exp(1i*t);
>z0=0.5+0.5i; z1=-3/5; plot2d(t,d(z0,z1,z)); insimg;

>function f(t,z0,z1) := d(z0,z1,exp(1i*t));
>{mi,ma}=fextrema("f",0,2*pi,400;z0,z1); "Minima:", mi, "Maxima", ma,
Minima:
[ 0.938077034984 2.7509726365 ]
Maxima
[ 2.27479673985 5.03172779154 ]
>plot2d(z); ...
>hold on; mark(z0); mark(complex(z1)); hold off; ...
>hold on; plot([z0,exp(1i*mi[1]),z1]); hold off; ...
>hold on; plot([z0,exp(1i*mi[2]),z1]); hold off; ...
>hold on; plot([z0,exp(1i*ma[1]),z1]); hold off; ...
>hold on; plot([z0,exp(1i*ma[2]),z1]); hold off; insimg;

>function gamma0(t) := exp(1i*t);
>function f1 (t,fff,z0,z1) := d(z0,z1,fff(t));
>function billard (fgamma,z0,z1) ...
keepsquare(1);
t=linspace(0,2*pi,300); xplot(fgamma(t));
hold on; mark(complex(z0)); mark(complex(z1)); hold off;
{mi,ma}=fextrema("f1",0,2*pi,300;fgamma,z0,z1);
loop 1 to cols(mi);
hold on; plot([z0,fgamma(mi[#]),z1]); hold off;
end;
loop 1 to cols(ma);
hold on; plot([z0,fgamma(ma[#]),z1]); hold off;
end;
keepsquare(0);
return ""
endfunction
>billard("gamma0",z0,z1); insimg;

>function gamma1(t) := cos(t)+0.8i*sin(t);
>billard("gamma1",-0.6-0.3i,0.5+0.5i); insimg;

>function gamma2(t) := (cos(t)+1i*sin(t))*(1+sin(5*t)^2/10);
>billard("gamma2",-0.8+0.2i,0.6-0.8i); insimg;

Examples Homepage