Arduino + TFT--> sköldpadda grafik (16 / 18 steg)
Steg 16: Rekursiva ritning
Hittills har vi talat sköldpaddan var att dra och den har gjort vad det berättades - även med mer komplicerade ritningar till exempel bil exempel. Men rekursion ger sköldpaddan ett eget liv. Ni det vad att göra och sedan luta sig tillbaka och titta.
Här är en länk till Wikipedias diskussion om rekursion:
www.wikipedia.org/wiki/Recursion _ (computer_science...
Vad är rekursion? För en person skriver Arduino sköldpadda grafikfunktioner, är det ett annorlunda sätt att tänka. Sköldpaddan som gör ritningen, är det ett mått av oberoende: "Bara få mig igång och se mig gå!"
Obs: Arduino Uno har begränsad SRAM-minne, men fortfarande tillräckligt att använda rekursion i vår sköldpadda grafik exempel. Om du försöker att använda för många rekursiva steg, kanske din funktioner inte fungerar. Vi har emellertid inte kommit att begränsa i vårt exempel, så låt oss gå vidare och se hur det här fungerar...
När vi åberopa rekursion använder vi en funktion som anropar sig själv. Hur gör vi det? Det är lättast att förklara med ett kort exempel som drar en V:
void vee(length); Om du kör detta exempel, prova med längden på 80 pixlar
{
t.Left(45); turnor vänster 45 grader
t.Forward(length); drar vänster arm i V med längd anges - 80 pixlar, till exempel
t.Back(length); återgår till början punkt av V
t.Right(90); vrider höger 90 grader - vilket är 45 grader till höger om den ursprungliga orienteringen
t.Forward(length); drar höger arm i V
t.Back(length); återvänder till utgångspunkten
t.Left(45); tillbaka till ursprungliga orienteringen
}
Där - drar som ett V. Nu är vi redo att lägga till rekursion. Efter den första raden det påstår t.forward(length), Lägg till följande rad:
Vee(length / 2); Detta är rekursion - en funktion som anropar sig själv!
Du har ritat i vänster arm i V och nu du kallar samma funktion för att rita en annan V som är halv storlek. När är klar, fortsätter den ursprungliga funktionen att dra det ursprungliga, större V. Detta är ett intressant sätt att rita något. Det är faktiskt ett intressant sätt att tänka om hur saker kan dras.
Nu ska vi lägga till en mindre mot slutet av höger arm också. Lägg till denna rad igen efter den andra t.forward(length); :
Vee(length / 2); Detta är rekursion - en funktion som anropar sig själv!
Vi är nästan klar, förutom en sak - funktionen inte fungerar som det är - det finns något att fixa. Rekursion behöver en stopp-punkt, kommer inte att det fortsätta på obestämd tid. (Detta misstaget jag gjorde när jag första försökt Rita en V med hjälp av rekursion - det fungerade inte för mig och jag var tvungen att få råd.) Lägg till detta stopp rutin i början av funktionen:
om (längd < 10)
{
hemkomst.
}
Där. Nu har vi en stopp-punkt - när armarna på V minskas till mindre än 10 pixlar (Observera att längden halveras varje gång funktionen anropas) - funktionen stoppen.
Här är den kompletta rekursiva vee funktionen:
int längd = 80. en variabel som anger längden på den V vapen
void vee(length); namn funktion, med en parameter, som är längden av den V sidor
{
om (längd < 10)
{
hemkomst. Detta stoppar rekursion när längd är mindre än 10 pixlar!
}
t.Left(45); vänder vänster 45 grader
t.Forward(length); drar vänster arm i V med längd 80 pixlar
Vee(length / 2); Detta är rekursion - funktionen kallar sig för att dra mindre V!
t.Back(length); återvänder till botten av V
t.Right(90); vänder rätt 45 grader
t.Forward(length); drar höger arm i V
Vee(length / 2); Detta är rekursion igen!
t.Back(length); återvänder till utgångspunkten
t.Left(45); tillbaka till ursprungliga orienteringen
}
Nu kan du prova funktionen. Prova med olika värden för längden på V - titta och se vad som händer!
EXEMPEL 1 - KOTTAR
I detta exempel används en funktion som vi har heter rCones Rita två bågar, t.arcLeft() och t.arcRight(), var och en av 360 pixlar i omkrets. Efter ritning första bågen, funktionen appeller sig själv (!-rekursion)- och drar en mindre båge, 30 bildpunkter kortare i omkrets. Detta fortsätter tills stopp gränsen är nådd, när den mindre bågen är mindre än 100 bildpunkter i omkrets.
EXEMPEL 2 - ETT LITET TRÄD
Funktionen rTree exempel liknar V exemplet ovan.
EXEMPEL 3 - ETT TRÄD MED FLER GRENAR
Här används samma rTree funktion används i exempel 2, men genom att ange en längre gren storlek funktionen drar många fler grenar. Det är intressant att se hur mycket detaljer kan läggas till genom att helt enkelt ändra detta en parameter.
EXEMPEL 4 - ETT MER KOMPLEXT TRÄD
Principen är densamma - men i denna funktion kan vi ange olika längder av vänster grenar och rätt grenar, och annan vänstra vinkel och rätt vinkel för grenar. Även kortare slutet grenar dras en annan färg. Vår sköldpadda blir ganska konstnärliga. Beroende på de värden som används, kan den resulterande bilden vara sofistikerat. Prova några olika gren längder och färger och se vad som händer.
EXEMPEL 5 - REKURSIV TRIANGLAR
Detta exempel ritar Sierpinski trianglar. Läs mer om dem på Wikipedia: