37 lines
906 B
Text
37 lines
906 B
Text
define halfpi = Num.pi/2
|
|
|
|
# Computing the dragon with a L-System
|
|
var dragon = 'FX'
|
|
{
|
|
dragon.gsub!('X', 'x+yF+')
|
|
dragon.gsub!('Y', '-Fx-y')
|
|
dragon.tr!('xy', 'XY')
|
|
} * 10
|
|
|
|
# Drawing the dragon in SVG
|
|
var (x, y) = (100, 100)
|
|
var theta = 0
|
|
var r = 2
|
|
|
|
print <<'EOT'
|
|
<?xml version='1.0' encoding='utf-8' standalone='no'?>
|
|
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN'
|
|
'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>
|
|
<svg width='100%' height='100%' version='1.1'
|
|
xmlns='http://www.w3.org/2000/svg'>
|
|
EOT
|
|
|
|
dragon.each { |c|
|
|
given(c) {
|
|
when ('F') {
|
|
printf("<line x1='%.0f' y1='%.0f' ", x, y)
|
|
printf("x2='%.0f' ", x += r*cos(theta))
|
|
printf("y2='%.0f' ", y += r*sin(theta))
|
|
printf("style='stroke:rgb(0,0,0);stroke-width:1'/>\n")
|
|
}
|
|
when ('+') { theta += halfpi }
|
|
when ('-') { theta -= halfpi }
|
|
}
|
|
}
|
|
|
|
print '</svg>'
|