---------------------------------------------------------------------------
-- Champ de vecteurs / Vector Field Plot
---------------------------------------------------------------------------
with Graph; use Graph;
with Ada.Numerics; use Ada.Numerics;
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
procedure Champ_vt is
function F(x,y: Float) return Vector2 is
r2: constant Float:= x*x+y*y;
r: constant Float:= Sqrt(r2);
a: constant:= 0.05;
begin
return (a*((r-1.0)*(r-1.0)/r)*x-y,a*((r-1.0)*(r-1.0)/r)*y+x);
-- return (x,0);
end F;
procedure Dessine_Champ(xa,ya,xb,yb: Float; points_x, points_y: Positive) is
xab: constant Float:= xb-xa;
yab: constant Float:= yb-ya;
ipx: constant Float:= 1.0 / Float(points_x+1);
ipy: constant Float:= 1.0 / Float(points_y+1);
carr: constant Float:= Float'Max(xab*ipx,yab*ipy);
x,y,cal: Float;
begin
Set_math_plane(xa,ya, xb,yb);
Draw_axes(units=>true, grid_points=>true, scale=>true);
cal:= 0.0;
for calibrate in reverse False..True loop
for i in 1..points_x loop
for j in 1..points_y loop
x:= xa + Float(i)*ipx*xab;
y:= ya + Float(j)*ipy*yab;
if calibrate then
cal:= Float'Max(cal,Norm2(F(x,y)));
else
if cal>0.0 then DrawVector(x,y, F(x,y) * (carr/cal) ); end if;
end if;
end loop;
end loop;
end loop;
end;
procedure Dessin(d:device_type) is
begin
current_device:= d;
InitGraph(d, "Champ_Vt.ps");
Circle(0.0,0.0,1.0);
Dessine_Champ(-3.0,-3.0,3.0,3.0, 30,20);
CloseGraph;
end;
begin
Dessin(PostScript);
end;