Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > [Solution] [Quiz] Turtle Graphics (#104)

Reply
Thread Tools

[Solution] [Quiz] Turtle Graphics (#104)

 
 
David Tran
Guest
Posts: n/a
 
      12-06-2006
Here is my quick solution.
( Quick, so, it will fail the unit test, since it does not check the
parameters and throw the expected exception; however, it shows the
example graphics correctly )



# Created by Morton Goldberg on November 02, 2006.
# Modified on November 14, 2006
# turtle.rb

# An implementation of Turtle Procedure Notation (TPN) as described in
# H. Abelson & A. diSessa, "Turtle Geometry", MIT Press, 1981.
#
# Turtles navigate by traditional geographic coordinates: X-axis pointing
# east, Y-axis pointing north, and angles measured clockwise from the
# Y-axis (north) in degrees.

class Turtle
include Math # turtles understand math methods
DEG = Math:I / 180.0

attr_accessor :track
alias run instance_eval

def initialize
clear
end

attr_reader y, :heading

# Place the turtle at [x, y]. The turtle does not draw when it changes
# position.
def xy=(coords)
@xy = coords.dup
end

# Set the turtle's heading to <degrees>.
def heading=(degrees)
@heading = degrees
end

# Raise the turtle's pen. If the pen is up, the turtle will not draw;
# i.e., it will cease to lay a track until a pen_down command is given.
def pen_up
@pen = false
end

# Lower the turtle's pen. If the pen is down, the turtle will draw;
# i.e., it will lay a track until a pen_up command is given.
def pen_down
@pen = true
end

# Is the pen up?
def pen_up?
!pen_down?
end

# Is the pen down?
def pen_down?
@pen
end

# Places the turtle at the origin, facing north, with its pen up.
# The turtle does not draw when it goes home.
def home
@xy = [0.0, 0.0]
@heading = 0.0
pen_up
end

# Homes the turtle and empties out it's track.
def clear
home
@track = []
end

# Turn right through the angle <degrees>.
def right(degrees)
@heading += degrees
end

# Turn left through the angle <degrees>.
def left(degrees)
right(-degrees)
end

# Move forward by <steps> turtle steps.
def forward(steps)
x = @xy[0] + steps * cos((90 - @heading) * DEG)
y = @xy[1] + steps * sin((90 - @heading) * DEG)
go([x,y])
end

# Move backward by <steps> turtle steps.
def back(steps)
forward(-steps)
end

# Move to the given point.
def go(pt)
if @pen
if !@track.empty? && @track.last.last == @xy
@track.last << pt.dup
else
@track << [@xy.dup, pt.dup]
end
end
@xy = pt.dup
end

# Turn to face the given point.
def toward(pt)
@heading = 90 - acos((pt[0] - @xy[0]) / distance(pt)) / DEG
end

# Return the distance between the turtle and the given point.
def distance(pt)
sqrt((@xy[0] - pt[0]) ** 2 + (@xy[1] - pt[1]) ** 2)
end

# Traditional abbreviations for turtle commands.
alias fd forward
alias bk back
alias rt right
alias lt left
alias pu pen_up
alias pd pen_down
alias pu? pen_up?
alias pd? pen_down?
alias set_h heading=
alias set_xy xy=
alias face toward
alias dist distance
end

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Detecting a click on the turtle screen when the turtle isn't doinganything? Adam Funk Python 7 02-06-2013 09:52 PM
Turtle graphics speed(). Seems broken Alexander.Oot@gmail.com Python 3 02-28-2010 05:49 AM
Smoother Lines in Turtle Graphics tomy Python 5 08-10-2007 02:23 PM
Saving output of Turtle Graphics? Dick Moores Python 7 04-07-2007 05:35 PM
Python and Turtle Graphics Brent W. Hughes Python 4 07-20-2004 09:08 PM



Advertisments