RosettaCodeData/Task/Dragon-curve/Sidef/dragon-curve.sidef
2017-09-25 22:28:19 +02:00

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>'