Logo Stapsgewijze verfijning: tekenen van een huis. Uitbreiding naar meerdere huizen, variabele afmetingen, coördinaten en kleuren Opdracht voor het vak Vakdidactiek Door Van Looveren Leen
Doelstellingen We hebben geleerd een probleem op te splitsen in deelproblemen. De deelproblemen werden dan eventueel nog eens verfijnd totdat we allemaal deelproblemen kregen die overeenstemde met een commando of een reeds gekende procedure. We gaan hier nog verder op ingaan door een reeds gekend probleem uit te breiden naar een groter probleem. Om dit groter probleem op te lossen gaan we de eenvoudige deelproblemen van het reeds gekend probleem aanpassen. Hierdoor wordt het nog duidelijker hoe belangrijk het is een probleem op te splitsen in deelproblemen.
De procedure ‘huis’ met parameters We gaan eerst opnieuw een huis bouwen. Deze keer zullen we ervoor zorgen dat we parameters kunnen meegeven aan de procedure “huis” zodanig dat we gemakkelijk de grootte, de positie en de kleur van het huis kunnen aanpassen. to huis :breedte :Xpositie :Ypositie :huiskleur :dakkleur
De procedure ‘huis’ met parameters Het huis werd opgesplitst in deelproblemen: DeelprobleemProcedureVerfijning MurenVierhoek RamenVierhoek DeurDeurVierhoek KlinkCirkel DakDakTrapezium SchoorsteenVierhoek
De procedure ‘huis’ met parameters Opgave 1a: Maak de procedure ‘deur_aangepast’. Deze procedure is een aangepaste versie van de procedure ‘deur’. Zorg ervoor dat de breedte van het huis wordt meegegeven als parameter bij de nieuwe procedure ‘deur_aangepast’. De breedte van de deur is 1/5de van de breedte van het huis. De hoogte van de muur van het huis is de helft van de breedte van het huis. De hoogte van de deur is 3/4de van de hoogte van de muur van het huis.
De procedure ‘huis’ met parameters Implementatie deur_aangepast: to deur_aangepast :breedte repeat 2[fd 3*:breedte/2/4 rt 90 fd :breedte/5 rt 90] pu rt 45 fd 2 setfc [ ] fill bk 2 rt -45 pdend
De procedure ‘huis’ met parameters Opgave 1b: Schrijf de procedure klink_aangepast. De klink is een cirkel. Deze krijgt ook als parameter de breedte van het huis mee. Zorg ervoor dat de grootte van de klink :breedte/400 is.
De procedure ‘huis’ met parameters Implementatie deur_aangepast: to klink_aangepast :breedte repeat 36[fd :breedte/400 rt 10] pu rt 45 fd 1 setfc [ ] fill bk 1 rt -45 pd end
De procedure ‘huis’ met parameters Opgave 1c: Schrijf de procedure deur_met_klink_aangepast. Deze procedure is een aanpassing van de procedure deur_met_klink en moet natuurlijk ook de parameter breedte van het huis meekrijgen. Ook moet deze ervoor zorgen dat de klink altijd verticaal gecentreerd aan de rechterkant van de deur staat (ook als de deur bijvoorbeeld verkleind wordt). De procedure deur_met_klink_aangepast bepaalt zelf zijn positie binnen de muren.
De procedure ‘huis’ met parameters Implementatie deur_met_klink_aangepast: to deur_met_klink_aangepast :breedte :X :Y pu setXY :X+(:breedte/4*3) :Y pd deur_aangepast :breedte pu setXY :X+(:breedte/4*3)+(4/5*(:breedte/5)) :Y+(1/2*(3*:breedte/2/4)) pd klink_aangepast :breedte pu setXY :X :Y pdend
De procedure ‘huis’ met parameters Opgave 2: Maak de procedure raam_aangepast. Dit is een aanpassing van de procedure raam. Geef deze de parameters breedte van het huis, Xpositie en Ypositie mee. Een raam bepaalt zelf zijn positie binnen de muren van het huis.
De procedure ‘huis’ met parameters Implementatie raam_aangepast: to raam_aangepast :breedte :X :Y pu setXY :X+(1/5*(:breedte)) :Y+(:breedte/2/3) pd repeat 2[fd 1/3*(:breedte/2) rt 90 fd 1/3*:breedte rt 90] pu rt 45 fd 2 setfc [ ] fill bk 2 rt -45 setXY :X :Y pdend
De procedure ‘huis’ met parameters Opgave 3: Maak een procedure muur_aangepast. Deze is een aanpassing van de procedure muur. Geef hem de parameters breedte van het huis, Xpositie, Ypositie en kleur mee. to muur :breedt :X :Y :kleur Gebruik ‘setfc :kleur’
De procedure ‘huis’ met parameters Implementatie muur_aangepast: to muur_aangepast :breedte :X :Y :kleur cspu setXY :X :Y pd repeat 2[fd :breedte/2 rt 90 fd :breedte rt 90] pu rt 45 fd 2 setfc :kleur fill bk 2 rt -45 pdend
De procedure ‘huis’ met parameters Opgave 4: Schrijf de procedure muur_deur_raam. Deze is een aanpassing van de procedure muur_met_deur_met_raam. Geef weer de nodige parameters mee.
De procedure ‘huis’ met parameters Implementatie muur_deur_raam: to muur_deur_raam :breedte :X :Y :kleur muur_aangepast :breedte :X :Y :kleur deur_met_klink_aangepast :breedte :X :Y raam_aangepast :breedte :X :Y pu setXY :X :Y pdend
De procedure ‘huis’ met parameters Opgave 5a: Maak de procedure dak_aangepast. Dit is een aanpassing op de procedure dak. Geef de breedte van het huis mee, de Xpositie, de Ypositie en de kleur van het dak. Het dak bepaalt ook zijn eigen positie t.o.v. de muur. Neem als lengte voor de kleine basis van de trapezium 3/4de van de grote basis
De procedure ‘huis’ met parameters (X, Y) (0, 0) breedte Breedte/2 ¾*(breedte) (Breedte-(¾*breedte)) /2 Breedte/4 (X, Y+ breedte/2)(X+breedte, Y+ breedte/2) (Breedte-(¾*breedte)) /2+ (¾*breedte), (X+ (Breedte-(¾*breedte)) /2+ (¾*breedte), Y+ breedte/2+breedte/4) (Breedte-(¾*breedte)) /2, (X+ (Breedte-(¾*breedte)) /2, Y+ breedte/2+breedte/4)
De procedure ‘huis’ met parameters Implementatie dak_aangepast to dak_aangepast :breedte :X :Y :kleur pu setXY :X :Y+(:breedte/2) pd setXY :X+(:breedte-(3*:breedte)/4)/2 :Y+(:breedte/2)+(:breedte/4) setXY :X+(:breedte-(3*:breedte)/4)/2+(3/4*:breedte) :Y+(:breedte/2)+(:breedte/4) setXY :X+:breedte :Y+:breedte/2 setXY :X :Y+(:breedte/2) pu rt 60 fd 2 setfc :kleur fill bk 2 rt -60 setXY :X :Y pdend
De procedure ‘huis’ met parameters Opgave 5b: Schrijf de procedure schoorsteen_aangepast.Deze is een aanpassing van de procedure schoorsteen. Zorg ervoor dat de schoorsteen zichzelf de juiste positie en grootte toekent. Deze krijgt ook de parameters breedte, Xpositie, Ypositie en kleur mee. De kleur is dezelfde als die van de muren. (¾*breedte)) (1/15*breedte) (1/20*breedte)
De procedure ‘huis’ met parameters Implementatie schoorsteen_aangepast to schoorsteen_aangepast :breedte :X :Y :kleur pu setXY :X+(3/4*:breedte) :Y+(:breedte/2)+(:breedte/4) pd repeat 2[fd 1/15*:breedte rt 90 fd 1/10*:breedte rt 90] pu rt 45 fd 2 setfc :kleur fill bk 2 rt -45 pdend
De procedure ‘huis’ met parameters Opgave 5c: Maak de procedure dak_met_schoorsteen_aangepast. Dit is een aanpassing van de procedure dak_met_schoorsteen. Welke parameters moeten hier worden meegegeven? Opgave 6: Maak de procedure huis_aangepast. Dit is een aanpassing van de procedure huis. Vergeet niet je turtle te laten verdwijnen.
De procedure ‘huis’ met parameters Implementatie dak_met_schoorsteen_aangepast: to dak_met_schoorsteen_aangepast :breedte :X :Y :huiskleur :dakkleur dak_aangepast :breedte :X :Y :dakkleur schoorsteen_aangepast :breedte :X :Y :huiskleur pu setXY :X :Y pdend Implementatie huis_aangepast: to huis_aangepast :breedte :X :Y :huiskleur :dakkleur muur_deur_raam :breedte :X :Y :huiskleur dak_met_schoorsteen_aangepast :breedte :X :Y :huiskleur :dakkleur HTend
Een dorp bouwen De procedure dorp: - kies je eigen achtergrondkleur - Roep een aantal keer de procedure huis_aangepast op met verschillende parameters - Voeg er eventueel nog een zonnetje, een boompje of een weggetje bij.
Een dorp bouwen Implementatie van een dorp to dorp setSC [ ] huis_aangepast [ ] [ ] huis_aangepast [ ] [ ] huis_aangepast [ ] [ ] huis_aangepast [ ] [ ] huis_aangepast [ ] [ ] huis_aangepast [ ] [ ] huis_aangepast [ ] [ ] huis_aangepast [ ] [ ] end
Conclusie Om een dorp te tekenen hadden we een huis nodig met parameters. Zo konden we op verschillende posities huizen plaatsen met verschillende kleuren en groottes. Het huis met parameters zijn we bekomen uit een huis zonder parameters. Het huis zonder parameters was opgesplitst in deelproblemen. Zo moesten we enkel, met wat logische denkwerk, eenvoudige procedures aanpassen. Het huis met parameters was dus ook opgesplitst in deelproblemen. Elk deelprobleem zorgde zelf voor zijn positie, grootte en kleur. Als we dan bijvoorbeeld een deur aan de linkerkant van het huis willen of een puntdak willen tekenen, moeten we enkel aan 1 eenvoudige procedure veranderingen aanbrengen. We hebben geleerd dat, door stapsgewijs een groot probleem op te splitsen in deelproblemen en deze deelproblemen eventueel nog te verfijnen totdat ze overeenstemmen met een reeds gekende procedure of een commando, we niet alleen ons probleem vereenvoudigen, maar ook toekomstige veranderingen gemakkelijk maken.