furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

Rysowanie w Turtle - Wstęp

WERSJA ROBOCZA WPISU

Uwagi

W przykładach nie stosuje from <modul> import * aby było widać, z jakich modułów pochodzą jakie funkcje. Z powodu nieczytelności import * jest niezalecane także przez dokument PEP 8 -- Style Guide for Python Code (wyszukaj import *).

W turle niektóre funkcje mają także skrócone nazwy - przykładowo fd() jako skrót dla forward(). Dla czytelności przykładów stosuje jednak tylko pełne nazwy. Przy pisaniu na własny użytek stosował bym jednak wersje skrócone bo to jednak mniej pisania.

O przykładach dostarczonych wraz z Pythonem: Rysowania w Turtle - przykłady dostarczane z Pythonem

Wartości ujemne

turtle pozwala na ujemne wartości w forward()/backward() i wtedy rysuje w przeciwną stronę.

forward(-100) daje to samo co backward(100).

turtle pozwala też na ujemne wartości w left() / rigth() i wtedy skręca w przeciwną stronę.

left(-45) daje to samo co right(45).

Można też stosować kąty większe niż 360 - bo 360+X stopni to to samo co X stopni.

left(360 + X) daje to samo co left(X). I tak samo jest z right().

mainloop() | done()

Zamykanie przez kliknięcie przycisku zamykającego okno [X]

turtle.mainloop()

Zamykanie przez kliknięcie w dowolnym miejscu okna

turtle.exitonclick()

odpowiednik powyższego to

turtle.onscreenclick(lambda x,y:turtle.bye())
turtle.mainloop()

Kod źródłowy

Moduł turtle jest napisany w czystym Pythone - bez żadnych bibliotek w C - więc można zobaczyć jego kod.

import turtle

print(turtle.__file__)

Powyższe wyświetla ścieżkę do pliku z kodem źródłowym modułu turtle - u mnie to jest /usr/lib/python3.7/turtle.py - i można to otworzyć w dowolnym edytorze tekstu lub IDE.

Pod Linux można nawet otworzyć to wprost ze skryptu w domyślnym programie

import turtle
import os

os.system('xdg-open ' + turtle.__file__)

https://stackoverflow.com/a/435669/1832058

import subprocess
import os

if sys.platform.startswith('darwin'):
    subprocess.call(('open', filepath))
elif os.name == 'nt': # For Windows
    os.startfile(filepath)
elif os.name == 'posix': # For Linux, Mac, etc.
    subprocess.call(('xdg-open', filepath))

Wielobok

Pięciokąt foremny i pentagram - rysowanie i liczenie powierzchni.

http://www.obliczeniowo.com.pl/284

Sześciokąt foremny i heksagram - rysowanie i liczenie powierzchni.

http://www.obliczeniowo.com.pl/285

Krzywe

Wikipedia:

Rekurencja

Silnia

def silnia(n):
    if n <=1:
        return 1
    else:
        return n * silnia(n-1)

for x in range(10):
    print(x, silnia(x))
import turtle

def rekurencja(n, bok):
    if n <= 0:
        turtle.forward(bok)
    else:
        turtle.color('red')
        rekurencja(n-1, bok/3)

        turtle.left(90)

        turtle.color('blue')
        rekurencja(n-1, bok/3)
        turtle.right(90)

        turtle.color('green')
        rekurencja(n-1, bok/3)
        turtle.right(90)

        turtle.color('blue')
        rekurencja(n-1, bok/3)
        turtle.left(90)

        turtle.color('red')
        rekurencja(n-1, bok/3)

turtle.tracer(False)
turtle.pensize(5)
poziom = 2
ilosc = 5
kat = 360/ilosc
for _ in range(ilosc):
    rekurencja(poziom, 100)
    turtle.right(kat)

turtle.update()
turtle.done()
turtle w python
turtle w python
import turtle

turtle.color('red')
turtle.begin_fill()
for _ in range(2):
    turtle.forward(80)
#    turtle.left(90)
    turtle.circle(20, 90)
    turtle.forward(50)
#    turtle.left(90)
    turtle.circle(20, 90)
turtle.end_fill()
turtle.color('black')

size = 25
turtle.penup()
turtle.forward( (80//2)-(size * 0.7))
turtle.left(90)
turtle.forward( (45)-size )
turtle.pendown()

turtle.color('white')
turtle.begin_fill()
for _ in range(3):
    turtle.forward(size*2)
    turtle.right(120)
turtle.end_fill()
turtle.color('black')

turtle.mainloop()

Stackoverflow: https://stackoverflow.com/questions/52005422/rounded-edge-rectangles-with-python-turtle

http://mathworld.wolfram.com/RoundedRectangle.html

Serce

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0,2*np.pi, 0.1)

x = 16*np.sin(t)**3
y = 13*np.cos(t) - 5*np.cos(2*t) - 2*np.cos(3*t) - np.cos(4*t)

plt.plot(x,y)
plt.show()

https://www.quora.com/How-can-I-draw-a-heart-using-Python/answer/Jamie-Morton

https://qph.fs.quoracdn.net/main-qimg-4c9586028914f9234b6e1d5851bc9979

---

https://www.quora.com/How-can-I-draw-a-heart-using-Python/answers/9685740

from turtle import *

def curvemove():
    for i in range(200):
        right(1)
        forward(1)
color('red','pink')
begin_fill()
left(140)
forward(111.65)
curvemove()
left(120)
curvemove()
forward(111.65)
end_fill()
done()

https://qph.fs.quoracdn.net/main-qimg-c5d9b01eb2e477801d7b1e5235626a07

---

https://www.quora.com/How-can-I-draw-a-heart-using-Python/answer/Nur-Zhakibaev

n = turtle.Turtle()

n.left(45)

n.forward(90)

n.circle(45, 180)

n.right(90)

n.circle(45, 180)

n.forward(90)

po poprawie czytelności

import turtle

turtle.left(45)
turtle.forward(90)
turtle.circle(45, 180)
turtle.right(90)
turtle.circle(45, 180)
turtle.forward(90)

turtle.mainloop()
turtle w python

Z kolorami

import turtle

turtle.left(90)

turtle.pensize(5)

turtle.color('red')
turtle.circle(-60, 60)

turtle.color('black')
turtle.forward(35)

turtle.color('red')
turtle.circle(60, 60)

turtle.color('green')
turtle.circle(45, 180)

turtle.right(180)

turtle.color('blue')
turtle.circle(45, 180)

turtle.color('red')
turtle.circle(60, 60)

turtle.color('black')
turtle.forward(35)

turtle.color('red')
turtle.circle(-60, 60)

turtle.mainloop()

Bez kolorów

import turtle

turtle.left(90)

turtle.circle(-60, 60)
turtle.forward(35)
turtle.circle(60, 60)

turtle.circle(45, 180)
turtle.right(180)
turtle.circle(45, 180)

turtle.circle(60, 60)
turtle.forward(35)
turtle.circle(-60, 60)

turtle.mainloop()

Rekurencja

import turtle

def rekurencja(n, bok):
    if n <= 0:
        turtle.forward(bok)
    else:
        turtle.color('red')
        rekurencja(n-1, bok/3)

        turtle.left(90)

        turtle.color('blue')
        rekurencja(n-1, bok/3)
        turtle.right(90)

        turtle.color('green')
        rekurencja(n-1, bok/3)
        turtle.right(90)

        turtle.color('blue')
        rekurencja(n-1, bok/3)
        turtle.left(90)

        turtle.color('red')
        rekurencja(n-1, bok/3)

turtle.tracer(False)
turtle.pensize(5)
poziom = 2
ilosc = 5
kat = 360/ilosc
for _ in range(ilosc):
    rekurencja(poziom, 100)
    turtle.right(kat)

turtle.update()
turtle.done()
Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury