OEFENINGEN PYTHON – REEKS 5 Vraag 1: Interpoleren (vervolg) Bouw verder op je code van Reeks 3, vraag 4. Voeg vier constanten toe aan je code: X0 = 280, Y0 = 0, Z0 = 50 en SIZE = 8. a) Teken een kubus met grootte SIZE op plaats (X0,Y0,Z0). b) Teken 25 kubussen. Gebruik de elementen van de x-lijst als x-coördinaat en die van de y-lijst als y-coördinaat. Gebruik Z0 als z-coördinaat. Neem SIZE als grootte voor de kubussen. c) Verbind de opeenvolgende punten met een (dikke) lijn. d) Verbind de opeenvolgende punten met het punt (X0, Y0, Z0).
Vraag 2: Rooster a) Teken een rooster op het scherm in een 500x500 rechthoek in het XY-vlak, met een interlinie (= ruimte tussen de roosterlijnen) van 50 pixels. b) Vraag de gebruiker eerst een waarde voor de interlinie en teken dan het rooster. c) Vraag de gebruiker eerst voor het aantal roosterlijnen en teken dan een rooster dat het scherm helemaal opvult (bereken dus de juiste interlinie).
Vraag 3: Kubussen a) Teken 10 kubussen met middelpunt (0, 25*i, 0) waarbij i het volgnummer van de kubus is (i heeft dus waardes van 1 t/m 10). De ribbegrootte van de kubussen neem je constant. b) Vraag telkens de ribbegrootte van de kubus aan de gebruiker. Teken de kubussen tot de gebruiker een 0 of een ongeldig getal ingeeft.
Vraag 4: Toren bouwen We wensen een toren van maximaal 5m te bouwen door het opstapelen van kubussen. Neem 1 meter = 100 pixels. De onderste kubus heeft een ribbe van 2m, de volgende kubussen zijn telkens 2/3 kleiner. Opgelet: vergeet de eerste oefeningenreeks niet! 2/3 wordt in Python immers afgerond naar … ! Stapel de kubussen opeen tot je toren net hoger is dan 5m. Hoeveel kubussen heb je hiervoor nodig? Print deze waarde af in de shell.
Extra vraag: Maak een functie hiervoor die de maximale hoogte van de toren en de waarde van de ribbe van de onderste kubus meekrijgt.
Vraag 5: Verbonden Kopieer volgende code naar een nieuw werkschrift: from visual import * # given N=8 X0 = 300 Y0 = 300 Z0 = 700 # define scene scene = display(x=0, y=0, width=800, height=600,center=(X0,Y0,Z0), background=(0,0,0)) scene.autocenter = false x = range(N) y = range(N) z = range(N) x[0] = 201 y[0] = 60 z[0] = 100 x[1] = 401 y[1] = 60 z[1] = 100 x[2] = 542 y[2] = 201 z[2] = 100 x[3] = 542 y[3] = 401 z[3] = 100 x[4] = 401 y[4] = 542 z[4] = 100
x[5] = 201 y[5] = 542 z[5] = 100 x[6] = 60 y[6] = 401 z[6] = 100 x[7] = 60 y[7] = 201 z[7] = 100 a) Je krijgt 8 punten gedefinieerd in 3 arrays, 1 array voor de x-waarden, 1 voor de y-waarden en 1 voor de z-waarden. Teken een kubus van grootte 10 in elk punt. b) Verbind alle punten met een lijn: punt 1 met punt 2, punt 2 met punt 3, ... en het laatste punt met het eerste. c) Verbind de punten ook met punt (X0, Y0, Z0), maar in een andere kleur en een dunnere lijn.
Vraag 6: Zuilen a) Teken een zuil door 5 cilinders met een verschillende kleur op elkaar te stapelen en er een blok op te zetten.
b) Maak een functie die een zuil op een bepaalde positie met een bepaalde radius en hoogte tekent. De grootte van de cilinders bepaal je a.d.h.v. de totale hoogte van de zuil: er moeten steeds 5 even grote cilinders en een blok worden gebruikt. c) Teken een rij van 8 zuilen in de y-richting. Gebruik hiervoor uiteraard de functie die je net hebt aangemaakt. d) Teken 2 van rijen zuilen naast elkaar en zet er een dak op zodat je een tempel hebt getekend.
e) Zet deze code om in een functie die een tempel van een zekere hoogte tekent op een bepaalde positie. f) Teken een zadeldak in plaats van een plat dak. Zorg dat de functie de graden van de helling meekrijgt.
Vraag 7: Van cilinder tot koeltoren a) Vul 2 arrays met de punten van een cirkel, 1 array voor de x-coördinaten en 1 voor de zcoördinaten. Teken met behulp van deze arrays 2 cirkels evenwijdig met het XZ-vlak: 1 op hoogte 0 en een op hoogte 400. b) Ter herinnering: de parametrische vergelijking van de cirkel in het XZ-vlak is: {
c) Verbind de punten van de 2 cirkels. Zo bekom je een cilinder. d) Gebruik een shift-parameter s om punt i van cirkel 1 met punt i+s te verbinden. Dan bekom je een koeltoren. Let op als de indexen buiten de lijst vallen! e) Teken in een animatie kerncentrales met oplopende shift-parameter: voor s=0 wordt een cilinder getoond, voor s>0 krijg je een koeltoren.
Vraag 8: Brug
a) Teken een kabelbrug die van 1 oever tot de andere met aan elke zijde 1 grote pijler in het midden en een variabel aantal kabels die evenredig over de brug verdeeld zijn. b) Vraag het aantal kabels aan de gebruiker. c) Definieer de breedte van de brug met een variabele. Wanneer deze variabele aangepast wordt moet de brug nog steeds juist getekend worden.
Vraag 9: Van cirkel via spiraal tot trap a) Maak een functie die 2 lijsten aanmaakt die de (x en z) coördinaten van punten die op een cirkel liggen bevatten. De functie geeft deze lijsten als returnwaarde terug (denk aan meerdimensionale lijsten!). { (x0,y0,z0) zijn de coördinaten van het middelpunt van de cirkel, r de straal van de cirkel en t de hoek tussen twee punten (in radialen!). De expressie math.radians(mydegree) zet graden naar radialen om (vergeet import math niet) Maak een nieuwe functie om de punten te tekenen. b) Verbind de punten met een lijn. c) Maak een derde array met de y-coördinaten. Vul die met de veelvouden van een bepaalde parameter. Gebruik dan deze y-waarden om de punten in de y-dimensie te tekenen. d) Verbind de punten met de centrale as (gedefinieerd door x0, z0). e) Maak er een trap van.
EXTRA OEFENINGEN
Vraag 10: Schaakbord Maak een functie ‘drawChessBoard(number,width)’ die een ‘number x ‘number’ schaakbord tekent. Elk vakje is een vierkant met zijde ‘width’. Gebruik twee verschillende kleuren voor de vlakken en begin op positie (0,0,0). Teken in 2D dus neem steeds z=0.
Vraag 11: Curve tekenen Kopieer volgende code naar een nieuw werkschrift: from visual import * # constanten f1 = false LENGTE= 10 # variabelen x = range(LENGTE) y = range(LENGTE) for i in range(LENGTE): x[i] = 20.*i if f1: y[i] = 20.*i - 4*pow(i,2) + pow(i,3)/5. - pow(i,4)/ 370. else: y[i] = i*2./3. + pow(i,2) - pow(i,3)/67. Gevraagd: a) Print beide lijsten (x en y) af als koppels, waarbij eerste element het i-de element van x is en tweede het i-de element van y is. Vb.: (10, 5) (20, 7) (30, 8) ... b) Deze punten stellen een functie voor in het XY vlak. Teken deze door een kubusje van grootte 10 te tekenen in elk punt. Test je code voor LENGTE = 20 en voor f1 = true Definieer de array van -LENGTE tot LENGTE, laat elke FOR-lus ook van -LENGTE tot LENGTE lopen. c) Verbind elk punt met de oorsprong (0,0,0). d) Verbind alle punten met een lijntje.
Vraag 12: Curve tekenen (deel 2) a) Zoek de grootste waarde van de y-lijst en print deze af. Test je code voor LENGTE = 40 en voor F1 = FALSE. b) Print de elementen van de lijst af, zolang de waarden stijgen (zolang de functie die voorgesteld wordt met y[i], monotoon stijgend is). Eventueel mag je de punten ook tekenen. Test je code voor LENGTE = 40 en voor F1 = FALSE, het programma moet blijven werken!