miller/test/input/mand.mlr
2021-11-11 14:15:13 -05:00

86 lines
2 KiB
Text

# Mandelbrot set generator: simple example of Miller DSL as programming language.
begin {
# Set defaults. They can be overridden by e.g.
# mlr -n put -e 'begin{@maxits=200}' -f nameofthisfile.mlr
# or
# mlr -n put -s maxits=200 -f nameofthisfile.mlr
@rcorn ??= -2.0;
@icorn ??= -2.0;
@side ??= 4.0;
@iheight ??= 50;
@iwidth ??= 100;
@maxits ??= 100;
@levelstep ??= 5;
@chars ??= "@X*o-.";
@silent ??= false;
@do_julia ??= false;
@jr ??= 0.0; # Real part of Julia point, if any
@ji ??= 0.0; # Imaginary part of Julia point, if any
}
end {
if (!@silent) {
print "RCORN = ".@rcorn;
print "ICORN = ".@icorn;
print "SIDE = ".@side;
print "IHEIGHT = ".@iheight;
print "IWIDTH = ".@iwidth;
print "MAXITS = ".@maxits;
print "LEVELSTEP = ".@levelstep;
print "CHARS = ".@chars;
}
for (int ii = @iheight-1; ii >= 0; ii -= 1) {
num ci = @icorn + (ii/@iheight) * @side;
for (int ir = 0; ir < @iwidth; ir += 1) {
num cr = @rcorn + (ir/@iwidth) * @side;
str c = get_point_plot(cr, ci, @maxits, @do_julia, @jr, @ji);
if (!@silent) {
printn c
}
}
if (!@silent) {
print;
}
}
}
func get_point_plot(num pr, num pi, int maxits, bool do_julia, num jr, num ji): str {
num zr = 0.0;
num zi = 0.0;
num cr = 0.0;
num ci = 0.0;
if (!do_julia) {
zr = 0.0;
zi = 0.0;
cr = pr;
ci = pi;
} else {
zr = pr;
zi = pi;
cr = jr;
ci = ji;
}
int iti = 0;
bool escaped = false;
num zt = 0;
for (iti = 0; iti < maxits; iti += 1) {
num mag = zr*zr + zi+zi;
if (mag > 4.0) {
escaped = true;
break;
}
# z := z^2 + c
zt = zr*zr - zi*zi + cr;
zi = 2*zr*zi + ci;
zr = zt;
}
if (!escaped) {
return ".";
} else {
int level = (iti // @levelstep) % strlen(@chars);
return substr(@chars, level, level);
}
}