---------------------------------------------------------------------------
--
-- File:
--
-- man.adb
--
-- Description:
--
-- This program draws a Mandelbrot picture centered at location
-- (x0, y0) and with a given magnification. When the magnification
-- is set to 1.0 and the center set to (0.0, 0.0) we see a circle
-- radius 2.0, with internal detail.
--
-- Author:
--
-- Chris Nettleton, 1988, for XD Ada
--
-- Revision:
--
-- $Id: man.adb,v 1.1.1.1 2004/03/25 09:20:46 cvs Exp $
--
---------------------------------------------------------------------------
with Ada.Real_Time;
with Report;
procedure Man is
use Ada.Real_Time;
use Report;
Start_Time, Stop_Time : Time;
------------------------
-- Stuff to configure --
------------------------
-- Coordinates of center of view
x0 : constant := 0.0;
y0 : constant := 0.0;
-- Magnification of view
Mag : constant := 1.0;
-- Max iterations in function Mandelbrot
Limit : constant := 100;
-- Scale of terminal in cols/lines across circle radius 2
x_Scale : constant := 100.0;
y_scale : constant := 60.0;
----------------
-- Mandelbrot --
----------------
function Mandelbrot (Cx, Cy : Float) return Natural is
Zx : Float := Cx;
Zy : Float := Cy;
begin
for N in 1 .. Limit loop
declare
Zxzx : constant Float := Zx * Zx;
Zyzy : constant Float := Zy * Zy;
begin
if Zxzx + Zyzy >= 4.0 then
return N;
else
Zy := 2.0 * Zx * Zy + Cy;
Zx := Zxzx - Zyzy + Cx;
end if;
end;
end loop;
return 0;
end Mandelbrot;
begin
Test ("man", "A Mandelbrot benchmark");
Start_Time := Clock;
declare
xmin : constant := x0 - 2.0 / Mag;
xmax : constant := x0 + 2.0 / Mag;
ymin : constant := y0 - 2.0 / Mag;
ymax : constant := y0 + 2.0 / Mag;
dx : constant := (xmax - xmin) / x_Scale;
dy : constant := (ymax - ymin) / y_Scale;
x, y : Float;
begin
-- Visit each pixel position and compute pixel color.
y := ymin;
while y <= ymax loop
x := xmin;
while x <= xmax loop
declare
Cnt : constant Natural := Mandelbrot (x, y);
begin
-- Put (Character'Val (Character'Pos (' ') + Cnt rem 96));
x := x + dx;
end;
end loop;
-- New_Line;
y := y + dy;
end loop;
end;
Stop_Time := Clock;
Comment (
"Time taken =" &
Duration'Image (To_Duration (Time_Span'(Stop_Time - Start_Time))) &
" seconds");
Result;
end Man;