12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #!/usr/bin/ruby
- require('Image::Magick')
- class Turtle(
- x = 500,
- y = 500,
- angle = 0,
- scale = 1,
- mirror = 1,
- xoff = 0,
- yoff = 0,
- color = 'black',
- ) {
- has im = %O<Image::Magick>.new(size => "#{x}x#{y}")
- method init {
- angle.deg2rad!
- im.ReadImage('canvas:white')
- }
- method forward(r) {
- var (newx, newy) = (x + r*sin(angle), y + r*-cos(angle))
- im.Draw(
- primitive => 'line',
- points => join(' ',
- round(x * scale + xoff),
- round(y * scale + yoff),
- round(newx * scale + xoff),
- round(newy * scale + yoff),
- ),
- stroke => color,
- strokewidth => 1,
- )
- (x, y) = (newx, newy)
- }
- method save_as(filename) {
- im.Write(filename)
- }
- method turn(theta) {
- angle += theta*mirror
- }
- method state {
- [x, y, angle, mirror]
- }
- method setstate(state) {
- (x, y, angle, mirror) = state...
- }
- method mirror {
- mirror.neg!
- }
- }
|