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?