/usr/lib/open-axiom/input/mountain.input is in open-axiom-test 1.4.1+svn~2626-2ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | --Copyright The Numerical Algorithms Group Limited 1994.
-- Draw a fractal mountain
)clear all
-- compile the functions
)set function compile on
-- Generate Gaussian random numbers
-- Algorithm by Richard Voss from "The Science of Fractal Images", pg. 77
-- function to convert a number into machine floating point
sf f == f::DFLOAT
Nrand := 4
Arand := 2**26 - 1
GaussAdd := sqrt(sf(3.0) * Nrand)
GaussFac := sf(2.0) * GaussAdd/((sf Nrand) * (sf Arand))
-- generate a random number
Gauss() ==
sum := sf 0.0
for i in 1..Nrand repeat
sum := sum + random()$INT
GaussFac * sum - GaussAdd
-- Generate fractal mountains.
-- Algorithms by Richard Voss from "The Science of Fractal Images", pg. 100
sfHalf := sf 0.5
sfThree := sf 3.0
sfFour := sf 4.0
f3(delta,x0,x1,x2) == (x0+x1+x2)/sfThree + delta*Gauss()
f4(delta,x0,x1,x2,x3) == (x0+x1+x2+x3)/sfFour + delta*Gauss()
-- perform midpoint subdivision
MidPointFM(maxLevel, sigma, H) ==
N := 2**maxLevel
delta := sigma
arraySize := (N+1)
X:IARRAY2(DFLOAT,0,0) := new(arraySize, arraySize, sf 0.0)
setelt(X, 0, 0, delta*Gauss())
setelt(X, 0, N, delta*Gauss())
setelt(X, N, 0, delta*Gauss())
setelt(X, N, N, delta*Gauss())
D := N
d := N quo 2
for stage in 1..maxLevel repeat
delta := delta*(sfHalf**(sfHalf*H))
for x in d..(N-d) by D repeat
for y in d..(N-d) by D repeat
setelt(X, x, y, f4(delta, elt(X,x+d,y+d), elt(X,x+d,y-d),
elt(X, x-d, x+d), elt(X, x-d, y-d)))
for x in 0..N by D repeat
for y in 0..N by D repeat
setelt(X, x, y, elt(X,x,y) + delta*Gauss())
delta := delta*(sfHalf**(sfHalf*H))
for x in d..(N-d) by D repeat
setelt(X,x,0, f3(delta, elt(X,x+d,0), elt(X,x-d,0), elt(X,x,d)))
setelt(X,x,N, f3(delta, elt(X,x+d,N), elt(X,x-d,N), elt(X,x,N-d)))
setelt(X,0,x, f3(delta, elt(X,0,x+d), elt(X,0,x-d), elt(X,d,x)))
setelt(X,N,x, f3(delta, elt(X,N,x+d), elt(X,N,x-d), elt(X,N-d,x)))
for x in d..(N-d) by D repeat
for y in D..(N-d) by D repeat
setelt(X,x,y, f4(delta, elt(X,x,y+d), elt(X,x,y-d),
elt(X,x+d,y), elt(X,x-d,y)))
for x in D..(N-d) by D repeat
for y in d..(N-d) by D repeat
setelt(X,x,y, f4(delta, elt(X,x,y+d), elt(X,x,y-d),
elt(X,x+d,y), elt(X,x-d,y)))
for x in 0..N by D repeat
for y in 0..N by D repeat
setelt(X,x,y, elt(X,x,y) + delta*Gauss())
for x in d..(N-d) by D repeat
for y in d..(N-d) by D repeat
setelt(X,x,y, elt(X,x,y) + delta*Gauss())
D := D quo 2
d := d quo 2
X
sfZero := sf 0
Sigma := sf 7
-- function passed to the draw
tableVal(x: DFLOAT, y:DFLOAT):DFLOAT ==
free table, xIndex, yIndex, rowSize
val := elt(table, xIndex, yIndex)
xIndex := xIndex + 1
if xIndex > rowSize then (xIndex := 0; yIndex := yIndex + 1)
val < sfZero => sfZero
val
-- draw a mountain with maxLevel subdivisions with Haussdorf dimension H
-- the number of subdivisions of the mountain is 2**maxLevel, so you
-- probably should keep maxLevel <= 8. Also 0 < H <= 1. The closer
-- H is to one, the smoother the mountain will be.
drawMountain(maxLevel, H) ==
free table, xIndex, yIndex, rowSize
table := MidPointFM(maxLevel, Sigma, H)
N := 2**maxLevel
xIndex := 0
yIndex := 0
rowSize := N
draw(tableVal, -20..20, -20..20,
var1Steps == N, var2Steps == N, title == "Fractal Mountain")
drawMountain(3, sf 0.95)
|