# Algorithm for drawing an arc

1. May 6, 2013

### mrcleanhands

Hi,
I'm working through thinkpython and there is an exercise which requires drawing flowers and arcs. I'm having some trouble understanding the arc function.

Code (Text):
def arc(t, r, angle):
"""Draws an arc with the given radius and angle.

t: Turtle
angle: angle subtended by the arc, in degrees
"""
arc_length = 2 * math.pi * r * abs(angle) / 360
n = int(arc_length / 4) + 1
step_length = arc_length / n
step_angle = float(angle) / n

# making a slight left turn before starting reduces
# the error caused by the linear approximation of the arc
lt(t, step_angle/2)
polyline(t, n, step_length, step_angle)
rt(t, step_angle/2)
Here's the polyline code called from the above function:
Code (Text):
def polyline(t, n, length, angle):
"""Draws n line segments.

t: Turtle object
n: number of line segments
length: length of each segment
angle: degrees between segments
"""
for i in range(n):
fd(t, length)
lt(t, angle)

Code (Text):
n = int(arc_length / 4) + 1
I'm guessing the purpose of n is to divide up the movements into separate iterations. How come it's set to arc_length / 4 + 1

Code (Text):
step_angle = float(angle) / n
I'm guessing this is dividing up the total angle subtended by the arc into little bits which it gradually carves out....

2. May 6, 2013

It looks like the value for n (number of arc segments) is fairly arbitrary, and you're right, the step angle is what an arc segment subtends for a given segment of the total arc.

3. May 6, 2013

### gsal

What are the units of 'r' ?

I think those are the same units of the dividing 4

So, it seems to me that they are choosing to draw an arc as small straight lines, except when the arc is smaller than 4, in which the division yields a number smaller than 1 and the int() operation yields zero, which leaves you back with the + 1

In other words, they are choosing the "small segments" to be approx 4 units long, or so, every time.

make sense? or am I missing something?