Tarun Gupta
Tarun Gupta

Reputation: 35

Ex-4.1 part-2 of Think Python book by Allen Downey

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

Answers (1)

BOT_bkcd
BOT_bkcd

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

Related Questions