Nauki wywiedzione z trójkąta

W porządku, zerknijmy, czego się nauczyliśmy, pisząc funkcje drawTriangle i drawOctagon. Pierwszą rzeczą, jaką należało zrobić, była zmiana wartości argumentu funkcji range, związaną z liczbą boków wielokąta. Następnie, co być może stanowiło dla Ciebie najtrudniejszy przeskok myślowy, o jaką wartość zmieniać kierunek ruchu żółwia przy rysowaniu kolejnych boków. Poniższa tabela podsumowuje to, do czego prawdopodobnie doszedłeś z łatwością. Jeśli nie, to zerknij na tabelę, wróć do poprzedniej strony i zobacz, czy teraz potrafisz poprawnie ukończyć funkcje drawTriangle i drawOctagon.

Figura Liczba boków range() Kąt
Trójkąt 3 3 360/3 = 120
Kwadrat 4 4 360/4 = 90
Ośmiokąt 8 8 360/8 = 45

Analiza powyższej tabeli pozwala zauważyć pewną zależność. Jeśli znasz liczbę boków figury, którą chcesz narysować, reszta po prostu wynika z tej tabeli. To doprowadza nas do następnego kroku rozwiązywania zadania narysowania wielokąta, uogólnienia. Dlaczego pisać osobną funkcję do rysowania każdego wielokąta, kiedy można napisać jedną funkcję, którą można wykorzystać do rysowania wielu różnych wielokątów?

Nasza nowa funkcja drawPolygon musi mieć 3 parametry: nazwę żółwia, długość boku – podobnie jak w poprzednich funkcjach, i teraz następny parametr, numSides, określający liczbę boków.

Poniżej wpisano kod, stanowiący szkielet funkcji drawPolygon. Sprawdź, czy umiesz dokończyć ją samodzielnie, dopisując brakujący kod.




(lab0401a)

Wreszcie rysujemy okrąg

Teraz, kiedy dysponujemy poprawnie działającą funkcją drawPolygon, prawie już doszliśmy do funkcji rysującej okrąg. Jeśli próbowałeś narysować wielokąt o 100 bokach, prawdopodobnie zauważyłeś, że wygląda on prawie jak okrąg. Jedyną rzeczą, którą należy przy tym mieć na uwadze jest fakt, że zwykle definiujemy okrąg nie poprzez określenie liczby jego boków (!), ale poprzez określenie długości jego promienia.

Tak więc przed nami następne wyzwanie. Zakładając, że wiemy, jaką długość ma mieć promień okręgu, w jaki sposób przekształcić wartość tej długości na odpowiednie wartości parametrów funkcji drawPolygon? Podzielmy problem na dwa kroki. Po pierwsze, jakiej wartości należy użyć jako liczby boków? Po drugie, jak określić wartość długości boków? W celu uproszczenia zdania zróbmy proste założenie o liczbie boków. Przyjmijmy, że 360 boków to liczba wystarczająco duża dla potrzeb narysowania dowolnego okręgu. Wydaje się, że ma to sens, bo rysując 360 boków i skręcając przy rysowaniu kolejnych o 1 stopień powinniśmy otrzymać ładny okrąg.

Teraz, kiedy określiliśmy liczbę boków, zastosujmy troszkę matematyki do ustalenia długości każdego z tych 360 boków. Jeśli znamy promień okręgu, to znamy też długość jego obwodu, prawda? Być może pamiętasz z lekcji matematyki, że długość obwodu okręgu jest równa 2*pi*(długość promienia). Znając długość obwodu i liczbę boków (360) dochodzimy do wniosku, że długość każdego boku powinna być równa 1/360 części całego obwodu.

Oto końcowe rozwiązanie:




(lab0401aa)

Jedną z niedogodności tak napisanej funkcji drawCircle jest to, że rysuje okrąg w prawo od bieżącej pozycji żółwia i kierunku jego ustawienia. Krótkie pytanie do Ciebie – jak zmienić jedną linię kodu funkcji, aby okrąg rysował się w lewo od bieżącej pozycji żółwia i kierunku jego ustawienia? Tak naprawdę satysfakcjonujące byłoby dopiero, by startowa pozycja żółwia stanowiła środek rysowanego okręgu. Zmodyfikuj kod funkcji tak, aby to uzyskać.

Na koniec napisz jeszcze jedną funkcję, drawFilledCircle, której argumentami są nazwa żółwia, promień okręgu oraz kolor jego wnętrza.

Następna część - Zliczanie liter