Reputation: 35
The code given below was provided by the author on Github to show how to draw a generalized arc, but what I fail to understand is how in the final arc function the error can be reduced by making a slight left turn before starting
import math
import turtle
def square(t, length):
"""Draws a square with sides of the given length.
Returns the Turtle to the starting position and location.
"""
for i in range(4):
t.fd(length)
t.lt(90)
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):
t.fd(length)
t.lt(angle)
def arc(t, r, angle):
"""Draws an arc with the given radius and angle.
t: Turtle
r: radius
angle: angle subtended by the arc, in degrees
"""
arc_length = 2 * math.pi * r * abs(angle) / 360
n = int(arc_length / 4) + 3
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
t.lt(step_angle/2)
polyline(t, n, step_length, step_angle)
t.rt(step_angle/2)
Upvotes: 1
Views: 147
Reputation: 371
# making a slight left turn before starting reduces # the error caused by the linear approximation of the arc t.lt(step_angle/2) polyline(t, n, step_length, step_angle) t.rt(step_angle/2)
I think this is the portion that you are referring to. This might seem like a redundant step since all it does is turns left before calling the polyline function & then turns right by an equal amount after calling the polyline function.
What this seemingly small change does is that it changes the "polyline" from a tangent to a secant of the same length. If you draw both these scenarios on a piece of paper, you will realize that secant is a close approximation to the circle since it has 2 points common with the circle, unlike tangent which has only one common point.
Upvotes: 2