netrate
netrate

Reputation: 443

Get Python turtle to face in direction of line being plotted

I'm trying to get the turtle shape to follow the direction of a line.

I have a simple parabola and I want the turtle shape to follow the direction of the line - when the graph goes up, the turtle faces up and when the graph comes down, the turtle faces down.
I am using goto() for the position of the turtle and x=x+1 for the x position on the graph:

t.goto(x,y)
t.right(??) - this?
t.left(??) - this?
t.setheading(??) or this?

What is the best method to achieve this? When I have tried using t.right() in a while loop (I am looping until x is complete), the turtle continues to spin in a circle as it moves, which is not what I want.


Still not getting this. I added the extra code that was suggested - here is the EDIT and the full code for what I am trying to achieve...

I am using the physics formula for trajectory (I used this so I know my values outputted are correct). http://www.softschools.com/formulas/physics/trajectory_formula/162/

import math
import turtle
import time
w=turtle.Turtle()


i=0
angle=66.4
velocity=45.0
g=9.8

t=math.tan(math.radians(angle))
c=math.cos(math.radians(angle))

turtle.delay(9)

w.shape("turtle")
w.setheading(90)

while i < 150:
    start = i * t
    middle = g*(i**2)
    bottom =(2*(velocity**2)*c**2)
    total = start-middle/bottom
    print(total)

    w.setheading(turtle.towards(i,total))
    w.goto(i,total)

    i=i+1

turtle.exitonclick()

Upvotes: 0

Views: 1095

Answers (2)

cdlane
cdlane

Reputation: 41872

I agree with @NicoSchertler that the arc tangent of the derivative is the way to go mathematically. But if it's just for good visuals, there's a simpler way. We can combine turtle's setheading() and towards() methods, constantly setting the turtle's heading towards the next position just before we go there:

from turtle import Screen, Turtle

turtle = Turtle(shape='turtle', visible=False)
turtle.penup()
turtle.goto(-20, -400)
turtle.pendown()
turtle.setheading(90)
turtle.showturtle()

for x in range(-20, 20):

    y = -x ** 2

    turtle.setheading(turtle.towards(x, y))
    turtle.goto(x, y)

screen = Screen()
screen.exitonclick()

enter image description here

Upvotes: 1

Nico Schertler
Nico Schertler

Reputation: 32587

The orientation of the turtle can be determined from the derivative of your function at the current position.

If you have the function as a sympy function, you can ask Python to do the differentiation. Or you could just do it on your own. If your function is

y = x^2

, then the derivative is

dy = 2 * x

Given that derivative at the current position, its arc tangent gives you the turtle's heading:

t.setheading(math.atan(dy))

Make sure that the angle mode of the turtle is set to radians or convert them to degrees

t.setheading(math.degrees(math.atan(dy)))

Upvotes: 1

Related Questions