Python Kaplumbağa kütüphanesini kullanarak "zarif çiçek ve taze stil ağacı" çizmenin ve kodu hızla almanın bir yolunu öğretin! | Güç Projesi

Yazar | 1_bit

Sorumlu Editör | Wang Xiaoman

Üretildi | CSDN Blogu

Başlat

Bir ağaç çizmek ve İnternet'teki koda bakmak için Turtle'ı kullanın. Temel olarak, temel yöntem özyinelemeyi kullanmaktır; ikinci olarak, kalem kalınlığı, çizim sırasında çizgi segmentini değiştirmek, ağacın gövde boyutunu değiştirmek ve son düğüme geçerken yinelemeli aktarım parametreleri tarafından değiştirilir , Ağacın ucunun yapraklarını veya yeşil yapraklarını çizmek için kalemin rengini ve kalınlığını değiştirin.

Bu blog yazısı internetteki koddan değiştirildi. Temelde basit yazı yazmak için özyineleme de kullanıyorum, bu yüzden aldım ve kullandım. Başlangıçta çevreyi bu arada çizmek istedim, ama yarın işe gidiyorum ve bugün başka şeyler de var, bu yüzden sadece pes edebilirim ve ortamı iyi hale getirmek için başka bir vaka yazmak için zamanım var; aşağıdaki son kod işleminin sonucudur ( Kod optimize edilmemiştir, verimlilik çok iyi olmayabilir):

Biraz taze hissettiriyor, hahaha, kasıtlı olarak eşleşen renkler, çiçek!

Tamam, şimdi nasıl yazılacağını görelim. Son kod en altta. Yukarıda karşılaşılan bazı sorunların adım adım açıklaması var.

İlk olarak, ağacın gövdesini çizmenin en basit yolunu kullanıyoruz, kod aşağıdaki gibidir:

kaplumbağa ithalatından * sol (80) fd (100) sağ (30) fd (30) sağ (30) fd (40) giriş

Sonuçlar aşağıdaki gibidir:

Yukarıdaki kod önce kaplumbağayı yatay çizgiye neredeyse dik bir konuma döndürmek için t.left (80) 'i kullanır ve ardından kesme kafası tarafından gösterilen yönde 100 birimlik bir çizgi parçası çizmek için t.fd (100) kullanır ve ardından t.right (30) 30 derece sağa döndürün ve sonra 30 birim ileriye doğru bir çizgi parçası çizmek için t.fd (30); bu anda, ağacın gövdesini simüle etmek için dik açıyı döndürerek oluşturulan çizgi bölümleri arasında bir düğüm vardır; son olarak t. Sağ (30), 30 derece daha sağa döner ve t.fd (40), son gövdeyi uzatmak için 40 birim uzunlukta çizgi parçasını öne doğru çeker.

Ancak yukarıdaki çizgi parçası ağacı tarif etmek için uygun değildir ama merak etmeyin, çizilen resmin daha çok bir ağaca benzemesi için çizilen çizgi diliminin kalınlığını ve rengini değiştirelim.

renk | yoğunlaştırmak

Kalemin kalınlığını ve rengini değiştirmek için t.pensize, t.color kullanın, kod aşağıdaki gibidir:

kaplumbağa ithalatından *

renk ('# 5E5E5E')

pensize (10)

sol (80)

fd (100)

sağ (30)

fd (30)

sağ (30)

fd (40)

giriş

Kalemin kalınlığını değiştirdikten sonra çizim sonuçları aşağıdaki gibidir:

Belki sonuç bir çimen parçasına benziyor, ama önemli değil, kodu yavaşça değiştiriyoruz; şimdi ağaç dallarını uzatıyoruz ve kalemin kalınlığını azaltıyoruz:

kaplumbağa ithalatından *

renk ('# 5E5E5E')

pensize (6)

sol (80)

fd (150)

sağ (30)

fd (50)

sağ (30)

fd (60)

giriş

Sonuçlar aşağıdaki gibidir:

Çok daha iyi görünüyor. Gövde kısmının tamamı ana gövdeye ve dağınık dallara bölünebilir.Bunu birkaç parçaya yazabiliriz; önce ağacın gövdesini çizin ve ardından işlevi kullanarak ağacın dallarını çizin:

kaplumbağa ithalatından *

def drawTree (uzunluk):

sağ (20)

fd (uzunluk)

renk ('# 5E5E5E')

pensize (5)

yukarı

goto (0, -300) # çizimin başlangıç noktasına atla

aşağı

sol (80)

fd (140)

drawTree (60)

giriş

Sonuçlar aşağıdaki gibidir:

Bu sırada kod, en çok çizilen alanın altından başlar ve çizim rengini ayarlamak için color ('# 5E5E5E') kullanarak yukarı doğru çizilir; pensize (5), çizilen çizgi parçasının kalınlığını ayarlar; goto (0, -300) çizim alanına atlar Alt kısmı başlangıç noktası olarak kullanılır; sonra 80 derece sola dönün, ağacın gövdesi olarak bir çizgi parçası çizin; daha sonra drawTree fonksiyonunda, sağa (20) dalları çizmek için uzunluğu geçmek için drawTree (120) fonksiyonunu çağırın Sağ taraf 20 derece döndürülür ve fd (uzunluk) dal olarak bir çizgi parçası çizer.

Artık fonksiyon yazıldığına göre, dalları çizmeye başlamak için özyinelemeyi kullanabiliriz:

kaplumbağa ithalatından *

def drawTree (uzunluk):

uzunluk> 1 ise:

sağ (20)

fd (uzunluk)

drawTree (uzunluk-10)

renk ('# 5E5E5E')

pensize (5)

yukarı

goto (0, -300) # çizimin başlangıç noktasına atla

aşağı

sol (80)

fd (140)

drawTree (60)

giriş

Sonuçlar aşağıdaki gibidir:

Kod açısından, yalnızca drawTree işlevinin kod içeriği değiştirilir; işlevde özyineleme kullanılır ve özyinelemeden sonra aktarılan değer, geçerli uzunluk eksi 10 uzunluktur ve işlev, uzunluğun 1'den büyük olduğuna karar verir. Bu, özyinelemede koşulun dışına atlamayan sonsuz döngüyü önler.

Mevcut uzunlukların hepsinin sabit bir farkı vardır. Çizilen dalların uzunluğunu gerçek dalların durumuna daha yakın olacak şekilde rastgele yapmak için rasgele sayılar kullanın (kodun yalnızca değiştirilen kısmı buraya yazılır):

def drawTree (uzunluk):

uzunluk> 1 ise:

sağ (20)

fd (uzunluk)

randlen = random.random

drawTree (uzunluk-10 * randlen)

operasyon sonucu:

Kod rastgele bir sayı kullanır, rastgele değer 10 sabit farktan çıkarılır ve değer elde edilir ve ardından çıkarma işlemine katılır.

Yani burada dönme açısı da sabittir, dönme açısını rastgele seçelim:

def drawTree (uzunluk):

uzunluk> 1 ise:

randangle = random.random

randlen = random.random

sağ (20 * randangle)

fd (uzunluk)

drawTree (uzunluk-10 * randlen)

operasyon sonucu:

Resmen başla

Şimdi şubemizin tek yönü var, yani sağa, şimdi sol dal çizimini ekliyoruz:

kaplumbağa ithalatından *

rastgele içe aktar

def drawTree (uzunluk):

uzunluk> 1 ise:

randangle = random.random

randlen = random.random

sağ (20 * randangle)

fd (uzunluk)

drawTree (uzunluk-10 * randlen)

sol (40 * randangle)

fd (uzunluk)

renk ('# 5E5E5E')

pensize (5)

yukarı

goto (0, -300) # çizimin başlangıç noktasına atla

aşağı

sol (80)

fd (140)

drawTree (60)

giriş

Ancak bir şeyler ters gitti:

Bu neden oluyor?

Bunun nedeni, son çizim konumuna atlamamız, sadece geri işlevini kullanmamız ve drawTree işlevini aşağıdaki gibi değiştirmemiz gerektiğidir:

def drawTree (uzunluk):

uzunluk> 1 ise:

randangle = random.random

randlen = random.random

sağ (20 * randangle)

fd (uzunluk)

yukarı

geriye (uzunluk)

aşağı

sol (40 * randangle)

fd (uzunluk)

drawTree (uzunluk-10 * randlen)

Sonuçlar aşağıdaki gibidir:

Aslında bu etki iyidir, ancak istediğimiz bu değildir. Bu etki köpeğin kuyruk otu çekmek için iyi olabilir; kodu değiştirin:

kaplumbağa ithalatından *

rastgele içe aktar

def drawTree (uzunluk):

uzunluk> 1 ise:

# Rastgele açı ve uzunluk

randangle = random.random

randlen = random.random

# İlk önce çizgi parçasını çizmek ve ardından açıyı ayarlamak için işlevi her kullandığınızda, işte sağa doğru açı dönüşü

fd (uzunluk)

sağ (20 * randangle)

drawTree (uzunluk-10 * randlen)

# İşte soldaki açı

sol (40 * randangle)

drawTree (uzunluk-10 * randlen)

# Neden 20 derece sağa dönmem gerekiyor? Bunun nedeni, geri çekilmek için geriye doğru kullanarak toplamda 40 derece sola döndüğüm için, aynı açı olmalı, aksi takdirde pozisyon farklıysa açı farklı olacaktır.

sağ (20 * randangle)

yukarı

geriye (uzunluk)

aşağı

izleyici (Yanlış)

renk ('# 5E5E5E')

pensize (5)

yukarı

goto (0, -300) # çizimin başlangıç noktasına atla

aşağı

sol (80)

fd (140)

drawTree (60)

giriş

Sonuçlar aşağıdaki gibidir:

Açıklamalarda kod açıklaması basit bir özyinedir ancak geçirilen uzunluğun uzunluğu uzun olmadığı için, dallar tarafından çizilen çok sayıda çizgi parçası yoktur, bu da tüm ağacın yeterince uzun olmamasına neden olur, değerde aktarılan uzunluğu değiştirelim. 120'dir ve çizim sonucu aşağıdaki gibidir.Çizim çok uzun olduğu için, efekti doğrudan görüntülemek için izleyiciyi (False) doğrudan kullanabileceğinizi unutmayın. Bir kez çizmeye ve render etmeye gerek yoktur (bu parametrelerinize bağlıdır, sadece False olarak değiştirin); burada Koordinat sistemini değiştirmek için, mevcut koordinat sisteminden daha büyük bir koordinat sistemine özelleştirin, aksi takdirde ekran tam olarak görüntülenmez, sadece setworldcoordinates (-1000, -750,1000,750) kodunu kullanın, genel kod aşağıdaki gibidir:

kaplumbağa ithalatından *

rastgele içe aktar

def drawTree (uzunluk):

uzunluk> 1 ise:

# Rastgele açı ve uzunluk

randangle = random.random

randlen = random.random

# İlk önce çizgi parçasını çizmek ve ardından açıyı ayarlamak için işlevi her kullandığınızda, işte sağa doğru açı dönüşü

fd (uzunluk)

sağ (20 * randangle)

drawTree (uzunluk-10 * randlen)

# İşte sola dönme açısı

sol (40 * randangle)

drawTree (uzunluk-10 * randlen)

# Neden 20 derece sağa dönmem gerekiyor? Bunun nedeni, geri çekilmek için geriye doğru kullanarak toplamda 40 derece sola döndüğüm için, aynı açı olmalı, aksi takdirde pozisyon farklıysa açı farklı olacaktır.

sağ (20 * randangle)

yukarı

geriye (uzunluk)

aşağı

setworldcoordinates (-1000, -750,1000,750)

izleyici (Yanlış)

renk ('# 5E5E5E')

pensize (5)

yukarı

goto (0, -300) # çizimin başlangıç noktasına atla

aşağı

sol (80)

fd (140)

drawTree (120)

giriş

Sonuçlar aşağıdaki gibidir:

Bununla birlikte, rastgele sayıların köşeleri ve dalların uzunluğu minimum uzunluğu sınırlamadığından, rastgele olduğunda uygun bir sayıyı çarpabilir ve başlangıç konumunu tekrar aşağı ayarlayabilirsiniz, kod aşağıdaki gibidir:

randangle = 2 * random.random

randlen = 2 * random.random

.

.

.

.

.

.

goto (0, -700)

Sonuçlar aşağıdaki gibidir:

Neredeyse bitti

Bir ağacın genel şekli çizilir.Şimdi ağacın dallarının yeşil ve kırmızı çiçeklerini doldurun; genel olarak konuşursak, ağaç dallarının tepesi ne kadar küçükse ve uzunluğu belirli bir aralıkta yeşil olarak değerlendirilir. , Renk belirli bir aralıkta kırmızıdır, ardından ağaç çiçeğinin ve ağaç yeşil yapraklarının etkileri simüle edilebilir.Kod aşağıdaki gibidir ve renk kodu kendiniz ayarlanabilir:

kaplumbağa ithalatından *

rastgele içe aktar

def drawTree (uzunluk):

uzunluk> 1 ise:

length14 ise: # Gövdeyi daraltın

pensize (4)

elif length5: # Bu aralıktaki uzunluk yeşil yapraklardır

renk ('# 04B486') #

pensize (3)

elif uzunluk1: #

renk ('# FE2E9A')

pensize (2)

Başka:

color ('# 5E5E5E') # Diğer aralıklar normal ağaç gövdeleridir

pensize (5)

# Rastgele açı ve uzunluk

randangle = 2 * random.random

randlen = 2 * random.random

# İlk önce çizgi parçasını çizmek ve ardından açıyı ayarlamak için işlevi her kullandığınızda, işte sağa doğru açı dönüşü

fd (uzunluk)

sağ (20 * randangle)

drawTree (uzunluk-10 * randlen)

# İşte soldaki açı

sol (40 * randangle)

drawTree (uzunluk-10 * randlen)

# Neden 20 derece sağa dönmem gerekiyor? Bunun nedeni, geri çekilmek için geriye doğru kullanarak toplamda 40 derece sola döndüğüm için, aynı açı olmalı, aksi takdirde pozisyon farklıysa açı farklı olacaktır.

sağ (20 * randangle)

yukarı

geriye (uzunluk)

aşağı

setworldcoordinates (-1000, -750,1000,750)

izleyici (Yanlış)

renk ('# 5E5E5E')

pensize (5)

yukarı

goto (0, -700) # çizimin başlangıç noktasına atla

aşağı

sol (80)

fd (140)

drawTree (120)

giriş

Sonuçlar aşağıdaki gibidir:

Düşen çiçekleri çizin

Ağaç biraz uzun ve bereketli hahaha; her seferinde rastgele farklı bir ağaç şekli oluyor, yani ekranda gösterilmeyeceğini anlamıyorum ama önemli değil, şimdi düşen yaprakların ve düşen çiçeklerin etkisini çizmeye başlayacağız.

Düşme etkisinin işlevi aşağıdaki gibidir:

def fallFlowers (m):

x, y = -1000, -750

yval = 50

aralıktaki i için (m):

a = 100 * random.random

b = 2 * random.random

baskı (a)

a> 59 ise:

renk ('# FE2E9A')

Başka:

renk ('# 04B486')

daire (5)

yukarı

goto (x, y + (yval * b))

fd (a)

yval + = 50

aşağı

Aşağıdaki gibi çalıştırın:

Kendi tanımladığımız koordinat sistemi olduğu için sol alt köşeden düşen çiçekleri çizmeye başlarız.x ve y koordinatları kodda x, y = -1000, -750 olarak tanımlanır ve daha sonra döngüde bir kullanılır Y değeri her seferinde artırılır ve her çizimin konumu sol alt köşeden yukarı çıkar, böylece y koordinatı döngü her tekrarlandığında artar ve rastgele çarpma atanır, böylece daha iyi rasgele hale getirilir ve her seferinde goto kullanılır (x, y + yval) belirtilen x, y koordinat konumuna atlar, ancak burada x'in değerinin değişmediğine dikkat edilmelidir; ve döngüde a değişkenini ayarladım, bu değişken a esas olarak kullanılır Fd (a) x ekseninde rasgele çalışır, aynı değer aynı düzenlemeye yol açar, bu çok güzel değildir ve rasgele değer b ile yval'ın çarpımı için aynı neden aynıdır.

Kodu tekrar değiştirin ve x koordinat değerlerini çizim alanını yatay olarak kaplayacak şekilde eklemek için dış katmanda bir döngü ayarlayın:

kaplumbağa ithalatından *

rastgele içe aktar

def drawTree (uzunluk):

uzunluk> 1 ise:

length14 ise: # Gövdeyi daraltın

pensize (4)

elif length5: # Bu aralıktaki uzunluk yeşil yapraklardır

renk ('# 04B486') #

pensize (3)

elif uzunluk1: #

renk ('# FE2E9A')

pensize (2)

Başka:

color ('# 5E5E5E') # Diğer aralıklar normal ağaç gövdeleridir

pensize (5)

# Rastgele açı ve uzunluk

randangle = 2 * random.random

randlen = 2 * random.random

# İlk önce çizgi parçasını çizmek ve ardından açıyı ayarlamak için işlevi her kullandığınızda, işte sağa doğru açı dönüşü

fd (uzunluk)

sağ (20 * randangle)

drawTree (uzunluk-10 * randlen)

# İşte soldaki açı

sol (40 * randangle)

drawTree (uzunluk-10 * randlen)

# Neden 20 derece sağa dönmem gerekiyor? Bunun nedeni, geri çekilmek için geriye doğru kullanarak toplamda 40 derece sola döndüğüm için, aynı açı olmalı, aksi takdirde pozisyon farklıysa açı farklı olacaktır.

sağ (20 * randangle)

yukarı

geriye (uzunluk)

aşağı

def fallFlowers (m):

x, y = -1000, -750

aralıktaki i için (30):

yukarı

goto (x, y)

x + = 100

aşağı

yval = 50

aralıktaki i için (m):

a = 100 * random.random

b = 2 * random.random

baskı (a)

a> 59 ise:

renk ('# FE2E9A')

Başka:

renk ('# 04B486')

daire (5)

yukarı

goto (x, y + (yval * b))

fd (a)

yval + = 50

aşağı

setworldcoordinates (-1000, -750,1000,750)

izleyici (Yanlış)

renk ('# 5E5E5E')

pensize (5)

# yukarı

# goto (0, -700) # Çizimin başlangıç noktasına atla

# aşağı

# kaldı (80)

# fd (140)

# drawTree (120)

Düşen Çiçekler (10)

giriş

operasyon sonucu:

Yeni dış döngü, x'in değerini artırır ve son olarak çizim alanının alt yarısını doldurur.

Nihai sonuçlar

Son olarak, ağacın çizim kodunu birleştirin, yorumu açın ve arka plan rengini ayarlayın bgcolor ("# F5F6CE"):

kaplumbağa ithalatından *

rastgele içe aktar

def drawTree (uzunluk):

uzunluk> 1 ise:

length14 ise: # Gövdeyi daraltın

pensize (4)

elif length5: # Bu aralıktaki uzunluk yeşil yapraklardır

renk ('# 04B486') #

pensize (3)

elif uzunluk1: #

renk ('# FE2E9A')

pensize (2)

Başka:

color ('# 5E5E5E') # Diğer aralıklar normal ağaç gövdeleridir

pensize (5)

# Rastgele açı ve uzunluk

randangle = 2 * random.random

randlen = 2 * random.random

# İlk önce çizgi parçasını çizmek ve ardından açıyı ayarlamak için işlevi her kullandığınızda, işte sağa doğru açı dönüşü

fd (uzunluk)

sağ (20 * randangle)

drawTree (uzunluk-10 * randlen)

# İşte soldaki açı

sol (40 * randangle)

drawTree (uzunluk-10 * randlen)

# Neden 20 derece sağa dönmem gerekiyor? Bunun nedeni, geri çekilmek için geriye doğru kullanarak toplam 40 derece sola döndüğüm için, aynı açı olmalı, aksi takdirde konum farklıysa açı farklı olacaktır.

sağ (20 * randangle)

yukarı

geriye (uzunluk)

aşağı

def fallFlowers (m):

x, y = -1000, -750

aralıktaki i için (30):

yukarı

goto (x, y)

x + = 100

aşağı

yval = 50

aralıktaki i için (m):

a = 100 * random.random

b = 2 * random.random

baskı (a)

a> 59 ise:

renk ('# FE2E9A')

Başka:

renk ('# 04B486')

daire (5)

yukarı

goto (x, y + (yval * b))

fd (a)

yval + = 50

aşağı

setworldcoordinates (-1000, -750,1000,750)

izleyici (Yanlış)

fallFlowers (10) # Düşen yaprakları çiz

bgcolor ("# F5F6CE")

renk ('# 5E5E5E')

pensize (5)

yukarı

goto (0, -700) # çizimin başlangıç noktasına atla

aşağı

sol (80)

fd (140)

drawTree (120)

giriş

Sonuçlar aşağıdaki gibidir:

Yeterli yaprak ve çiçek olmadığını düşünüyorsanız, parametreleri değiştirebilirsiniz. Kod optimize edilmediğinden, çalıştırma etkisi çok yavaştır ve ardından optimizasyondan sonra yayınlanır.

Telif hakkı bildirimi: Bu makale, CSDN blogger "1_bit" in orijinal makalesidir. CC 4.0 BY-SA telif hakkı sözleşmesine uygundur. Lütfen orijinal kaynak bağlantısını ve yeniden yazdırmak için bu bildirimi ekleyin.

Orijinal bağlantı: https://blog.csdn.net/a757291228/article/details/106029202

Flash öldü ve Deno iktidarda mı?

OceanBase on yıl: bir grup rüya yakalayıcının büyüme tarihi

2 yıl, 6 ay ve 11 gün, Ali'nin ekim yoluna taşeronluk! | Güç Projesi

Sunucu yazılım okuryazarlığı!

Tencent'in 30 makalesi, AI En İyi Konferansının ACL'si için seçildi

Satoshi Nakamoto görünmedi, gerçek nedir?

JDnin bu hafta cep telefonu satış listesi: Honor Play4T serisi en büyük kazanan oldu
önceki
Sekiz kuşaktır "Pokémon" Pokkisi mi? Hem bekarlar hem de çiftler popüler mi?
Sonraki
Mi Band 5 gerçek telefon pozlama: oval ekran, fişli şarj
Pakistan uçak kazaları, 107 kişinin hayatı yok, yolcu listesinde Çinli yok
Saçı 10 yaşında olarak değiştirin! Yin Tao'nun kıvırcık saçları saniyeler içinde teyze oldu, pembe tırnakları ve siyah çorapları biraz toprak gibi
Göz makyajı böyle boyanır, küçük gözlerin göze çarpan anı şişer ve kabarcıklar
Güzellik ağır makyaj! Yaz yüksek değerli tanrıça makyajını nasıl çizeceğinizi öğretin
Adalet ve adalet kalabalığa karşı çıksın! Supreme Law 2020 çalışma raporunu anlamak için bir resim
Hainan Lingao Kukla Gösterisi: Birlikte Performans Gösteren ve Somut Olmayan Mirası Devralan Kuklalar
Şangay Müzesi, Jiangnan Kültür ve Sanat Sergisine ev sahipliği yapıyor
Pek çok kez Çin için ses Russell: Yaşamı boyunca mutluluk temasını arayan
İlk Gözlem | Genel Sekreterin 12 kelimesi büyük bir oyun düzeni
Şangay Müzesi, Jiangnan Kültür ve Sanat Sergisine ev sahipliği yapıyor
Pekin'deki Lujiashan Döngüsel Ekonomi Üssünü ziyaret edin
To Top