Backdated content; see this post for details.
The idea of having the biographical stuff (i.e. my own face) be the very first thing on the site felt somehow banal.
I was therefore forced to put in a usability-decreasing splash page
sort of thing instead.
The logo is randomly chosen out of N more or less different L-systems and IFS fractals.
Both are drawn on a HTML5 canvas with some JavaScript.
If you would like to see a particular logo, try adding ?logo=N
, where N
is either a non-negative integer or the logo name (shown in the bottom-right corner), to the URL.
(Did you only see a static image and are now wondering what on earth I'm talking about? Sorry about that. You might have scripts disabled, though it's also very possible the scripting — which certainly hasn't been tested in multiple browsers — has broken down. Just close your eyes and imagine some fractals?)
Logo specifications are written in YAML; a three-line (well, discounting use
statements and such) Perl script converts them to the JSON file included by the index page.
The L-system plotter supports giving arguments to nonterminals (and plotting commands), which is used e.g. to shorten the step size in further iterations.
There's also a built-in function to generate Gaussian random numbers.
The IFS plotter can do affine transformations, and also named parameters that can have random values.
For details on the syntax, deduce it from the full list of logo specifications below.
Logo specifications
--- name: ltree1 type: lsystem iter: 7 delay: 2000 start: pos: (N(0.5,0.05);0.02) dir: (1@N(pi/2,0.05)) init: tree(0.9) rules: - tree(len) -> [ J(N(len/3,len/10)) L(N(pi/6,0.05)) tree(N(len/2,len/8)) ] [ J(N(len/3,len/10)) R(N(pi/6,0.05)) tree(N(len/2,len/8)) ] F(2*len/3) tree(len/3) --- name: ltree2 type: lsystem iter: 5 delay: 2000 start: pos: (N(0.5,0.05);0.02) dir: (1@N(pi/2,0.05)) init: tree(0.9) rules: - tree(len) -> [ J(N(0.3*len,len/10)) L(N(pi/6,0.05)) tree(N(0.6*len,len/8)) ] [ J(N(0.55*len,len/10)) L(N(pi/6,0.05)) tree(N(0.4*len,len/8)) ] [ J(N(0.3*len,len/10)) R(N(pi/6,0.05)) tree(N(0.6*len,len/8)) ] [ J(N(0.55*len,len/10)) R(N(pi/6,0.05)) tree(N(0.4*len,len/8)) ] F(2*len/3) tree(len/3) --- name: ltree3 type: lsystem iter: 6 delay: 2000 start: pos: (N(0.5,0.05);0.02) dir: (1@N(pi/2,0.05)) init: tree(0.9) rules: - tree(len) -> [ J(N(len/3,len/10)) L(N(pi/6,0.05)) tree(N(len/2,len/8)) ] [ J(N(len/3,len/10)) R(N(pi/6,0.05)) tree(N(len/2,len/8)) ] [ J(0.6*len) R(N(0,pi/8)) tree(len/3) ] F(2*len/3) R(N(0,0.2)) tree(len/3) --- name: lfern1 type: lsystem iter: 8 delay: 2000 start: pos: (0.3;0.1) dir: (0;1) init: fern(1.6) rules: - fern(h) -> F(h/10) [ L(N(pi/4,0.02)) fern(N(h/4,h/32)) ] [ R(N(pi/2,0.02)) fern(N(h/3,h/24)) ] R(pi/20) fern(9*h/10) --- name: lfern2 type: lsystem iter: 9 delay: 2000 start: pos: (0.3;0.1) dir: (0;1) init: fern(1.6) rules: - fern(h) -> F(h/10) [ L(N(pi/8,0.02)) fern2(N(h/4,h/32)) ] [ R(N(pi/3,0.02)) fern(N(h/3,h/24)) ] R(pi/20) fern(9*h/10) - fern2(h) -> fern(h) --- name: lsierp type: lsystem iter: 7 delay: 2000 start: pos: (0.05;0.15) dir: (1;0) init: sl(0.9) rules: - sl(l) -> L(pi/3) [ sr(l/2) ] F(l/2) R(pi/3) [ sl(l/2) ] F(l/2) R(pi/3) [ sr(l/2) ] F(l/2) L(pi/3) - sr(l) -> R(pi/3) [ sl(l/2) ] F(l/2) L(pi/3) [ sr(l/2) ] F(l/2) L(pi/3) [ sl(l/2) ] F(l/2) R(pi/3) --- name: lsierp2 type: lsystem iter: 8 delay: 2000 clear: true start: pos: (0.05;0.15) dir: (1;0) init: sl(0.9) rules: - sl(l) -> L(pi/3) sr(l/2) R(pi/3) sl(l/2) R(pi/3) sr(l/2) L(pi/3) - sr(l) -> R(pi/3) sl(l/2) L(pi/3) sr(l/2) L(pi/3) sl(l/2) R(pi/3) draw: sl: F sr: F --- name: lzem type: lsystem iter: 3 delay: 5000 clear: true start: pos: (0.05;0.5) dir: (1;0) init: zem(0.9) rules: - zem(l) -> F(2*l/14) L(pi/4) zem(sqrt(2)*l/14) R(pi/4) zem(2*l/14) R(3*pi/4) zem(sqrt(2)*2*l/14) L(3*pi/4) zem(2*l/14) L(acos(0.5)) zem(sqrt(5)*l/14) R(acos(0.5)) [ zem(2*l/14) ] R(pi/2) zem(l/14) [ L(pi/2) zem(1.5*l/14) ] zem(l/14) L(pi/2) zem(2*l/14) F(l/14) L(pi/2) zem(2*l/14) R(3*pi/4) zem(sqrt(2)*l/14) L(pi/2) zem(sqrt(2)*l/14) R(3*pi/4) zem(2*l/14) L(3*pi/4) zem(sqrt(2)*l/14) R(pi/4) F(2*l/14) draw: zem: F --- name: ldragon type: lsystem iter: 12 delay: 1000 start: pos: (0.4;0.76) dir: (0;1) init: F(0.01) x(0.01) rules: - x(l) -> x(l) R(pi/2) y(l) F(l) - y(l) -> F(l) x(l) L(pi/2) y(l) --- name: ifsfern type: ifs iter: 100 step: 200 delay: 200 canvas: -0.4 -0.05 1 1 functions: - 0.01 aff [0 0 0; 0 0.18 0.03] - 0.85 aff [0.848 0.053 0; -0.053 0.848 0.15] - 0.07 aff [0.2 -0.2 0; 0.2 0.2 0.15] - 0.07 aff [0.2 0.2 0; -0.2 0.2 0.08] --- name: ifssierp type: ifs iter: 100 step: 200 delay: 200 canvas: -0.05 -0.05 1.1 1.1 functions: - 1 aff [0.5 0 0; 0 0.5 0] - 1 aff [0.5 0 0.5; 0 0.5 0] - 1 aff [0.5 0 0.25; 0 0.5 0.5] --- name: ifsdragon type: ifs iter: 100 step: 200 delay: 200 canvas: -0.42 -0.7 1.7 1.7 functions: - 1 aff [0.5 -0.5 0; 0.5 0.5 0] - 1 aff [-0.5 -0.5 1; 0.5 -0.5 0] --- name: ifsglider type: ifs iter: 100 step: 200 delay: 200 canvas: -0.05 -0.05 1.1 1.1 functions: - 1 aff [0.33333 0 0; 0 0.33333 0.66667] - 1 aff [0.33333 0 0.33333; 0 0.33333 0.66667] - 1 aff [0.33333 0 0.66667; 0 0.33333 0.66667] - 1 aff [0.33333 0 0; 0 0.33333 0.33333] - 1 aff [0.33333 0 0.33333; 0 0.33333 0] --- name: ifsfeedback type: ifs iter: 100 step: 200 delay: 200 canvas: 0 0 1 1 functions: - 0.05 aff [0 0 0; 0 1 0] - 0.05 aff [0 0 1; 0 1 0] - 0.05 aff [1 0 0; 0 0 0] - 0.05 aff [1 0 0; 0 0 1] - 0.80 aff [0.790 -0.125 0.167; 0.125 0.790 0.042] --- name: ifsfeedback2 type: ifs iter: 100 step: 200 delay: 200 canvas: 0 0 1 1 functions: - 0.05 aff [0 0 0; 0 1 0] - 0.05 aff [0 0 1; 0 1 0] - 0.05 aff [1 0 0; 0 0 0] - 0.05 aff [1 0 0; 0 0 1] - 0.40 aff [0.790 -0.125 0.167; 0.125 0.790 0.042] - 0.40 aff [0.790 0.125 0.042; -0.125 0.790 0.167] --- name: ifsfernr type: ifs iter: 100 step: 200 delay: 200 canvas: -0.5 -0.05 1 1.2 params: a: N(0, pi/40) functions: - 0.01 aff [0 0 0; 0 0.18 0.03] - 0.85 aff [0.85*cos(a) -0.85*sin(a) 0; 0.85*sin(a) 0.85*cos(a) 0.15] - 0.07 aff [0.2 -0.2 0; 0.2 0.2 0.15] - 0.07 aff [0.2 0.2 0; -0.2 0.2 0.08] --- name: ifsfeedbackr type: ifs iter: 100 step: 200 delay: 200 canvas: 0 0 1 1 params: a: N(0, pi/12) r: N(0.8, 0.2/3) functions: - 0.05 aff [0 0 0; 0 1 0] - 0.05 aff [0 0 1; 0 1 0] - 0.05 aff [1 0 0; 0 0 0] - 0.05 aff [1 0 0; 0 0 1] - 0.80 aff [r*cos(a) -r*sin(a) 0.5-0.5*r*(cos(a)-sin(a)); r*sin(a) r*cos(a) 0.5-0.5*r*(cos(a)+sin(a))] --- name: ifstree type: ifs iter: 100 step: 500 delay: 200 canvas: -0.5 -0.05 1 1.2 params: a: N(0, pi/120) b1: N(pi/4, pi/60) b2: N(-pi/4, pi/60) b3: N(pi/2, pi/60) b4: N(-pi/2, pi/60) s1: N(0.4, 0.04) s2: N(0.4, 0.04) s3: N(0.2, 0.03) s4: N(0.2, 0.03) p1: N(0.16, 0.04) p2: N(0.16, 0.04) p3: N(0.5, 0.04) p4: N(0.5, 0.04) functions: - 0.02 aff [0 0 0; 0 0.5 0] - 0.56 aff [0.5*cos(a) -0.5*sin(a) 0; 0.5*sin(a) 0.5*cos(a) 0.5] - 0.08 aff [s1*cos(b1) -s1*sin(b1) 0; s1*sin(b1) s1*cos(b1) p1] - 0.08 aff [s2*cos(b2) -s2*sin(b2) 0; s2*sin(b2) s2*cos(b1) p2] - 0.06 aff [s3*cos(b3) -s3*sin(b3) 0; s3*sin(b3) s3*cos(b1) p3] - 0.06 aff [s4*cos(b4) -s4*sin(b4) 0; s4*sin(b4) s4*cos(b1) p4] --- name: ifsbush type: ifs iter: 100 step: 200 delay: 200 canvas: -0.2 0 0.4 0.5 functions: - 1 aff [0 0 0; 0 0.5 0] - 15 aff [0.8 0 0; 0 0.5 0.2] - 10 aff [0.7*cos(pi/4) -0.42*sin(pi/4) 0; 0.7*sin(pi/4) 0.42*cos(pi/4) 0.2] - 10 aff [0.7*cos(pi/4) 0.42*sin(pi/4) 0; -0.7*sin(pi/4) 0.42*cos(pi/4) 0.2] - 7 aff [0.4*cos(pi/2) -0.25*sin(pi/2) 0; 0.4*sin(pi/2) 0.25*cos(pi/2) 0.2] - 7 aff [0.4*cos(pi/2) 0.25*sin(pi/2) 0; -0.4*sin(pi/2) 0.25*cos(pi/2) 0.2] --- name: ifszem type: ifs iter: 100 step: 250 delay: 200 canvas: -0.05 -1.05 3.1 3.1 functions: - 1 aff [0.9/3 0 0; 0 0.2 0] - 1 aff [0.9/3 0 0; 0 0.2 0.8] - 1 aff [0.2 -0.14142 0.15+0.1/sqrt(2); 0.2 0.14142 0.2-0.1/sqrt(2)] - 1 aff [0 -0.2 1.2; 1/3 0 0] - 1 aff [0.7/3 0 1.2; 0 0.2 0] - 1 aff [0.7/3 0 1.2; 0 0.2 0.8] - 1 aff [0.7/3 0 1.2; 0 0.2 0.4] - 1 aff [0 -0.2 2.2; 1/3 0 0] - 1 aff [0 -0.2 3; 1/3 0 0] - 0.5 aff [0.1 -0.07071 2.5+0.05/sqrt(2); 0.1 0.07071 0.7-0.05/sqrt(2)] - 0.5 aff [0.1 0.07071 2.2-0.05/sqrt(2); -0.1 0.07071 1-0.05/sqrt(2)] ...