Logo Design

| tags: code web

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)]

...