PRAKTICUMOPGAVE 1

De eerste practicumopgave is het maken van een programma om een "Mandelbrotfiguur" te tekenen, zoals hieronder omschreven.

Het practicum moet in groepjes van twee worden gemaakt en ingeleverd. Steekproefsgewijs kan aan beide auteurs om een toelichting worden gevraagd. Overnemen van (delen van) programma's van anderen of van Internet is niet toegestaan.

De uitwerking van deze opdracht moeten worden ingeleverd met behulp van het automatische inleversysteem Submit. Kies als opgave-naam: Imperatief programmeren - Mandelbrot. Zet alle source-files (extensie .cs) en de project-file (extensie .csproj) samen in een zip- of rar-file, en lever die in. Door de compiler gegenereerde files hoeven niet te worden ingeleverd.

Mandelgetallen

Voor elk punt (x,y) van het platte vlak, waarbij x en y reële getallen zijn, kan een bijbehorend getal worden bepaald - laten we dit het "mandelgetal" noemen. Om het mandelgetal te kunnen uitrekenen, bekijken we eerst de volgende functie, die punten (a,b) van het vlak transformeert naar andere punten:

f (a,b) = (a*a-b*b+x, 2*a*b+y)

Let op: deze functie transformeert het punt (a,b), maar in de berekening speelt ook de waarde van x en y, dat is het punt waarvan we het mandelgetal willen bepalen, een rol.

Deze functie f nu, passen we toe op het punt (a,b) = (0,0). Op het punt dat daar uitkomt, passen we nog eens de functie f toe. Op het punt dat daar weer het resultaat van is, passen we opnieuw f toe, enzovoorts enzovoorts. We stoppen pas met toepassen van f als het resultaat-punt een afstand van meer dan 2 tot (0, 0) heeft. Het mandelgetal is nu gelijk aan het aantal keren dat f is toegepast.

Voor sommige punten (x,y) is dat meteen al zo, en is het mandelgetal dus gelijk aan 1. Voor andere punten duurt het langer: die hebben een groter mandelgetal. Er zijn ook punten waarbij je f kan blijven toepassen, zonder dat de afstand tot (0, 0) ooit meer dan 2 wordt: die punten hebben mandelgetal oneindig.

In de praktijk kunnen we niet oneindig vaak een functie toepassen; daarom stoppen we met toepassen van f bij een bepaald maximum aantal keren, zeg 100 keer; is dan de afstand nog niet groter dan 2, dan nemen we maar aan dat het mandelgetal oneindig is.

Een voorbeeld

Als voorbeeld berekenen we het Mandelgetal van het punt (0.5, 0.8). We beginnen met (a, b)=(0, 0) en zetten de teller op 0. Bij het toepassen van de formule zijn a en b nog 0, en komen we dus uit op het punt (0.5, 0.8). De teller staat nu op 1. De afstand van (0.5, 0.8) tot (0, 0) is volgens Pythagoras wortel(0.25+0.64) = wortel(0.89) is ongeveer 0.94, en dat is niet groter dan 2. We mogen dus doorgaan.

We berekenen met de formule de nieuwe a: 0.5*0.5 - 0.8*0.8 + 0.5 = 0.11 en de nieuwe b: 2*0.5*0.8 + 0.8 = 1.6, en de teller komt op 2. De afstand van (0.11, 1.6) tot (0, 0) is volgens Pythagoras ongeveer 1.6038, dus we mogen nog steeds doorgaan.

We berekenen met de formule weer een nieuwe a: 0.11*0.11 - 1.6*1.6 + 0.5 = -2.0479 en een nieuwe b: 2*0.11*1.6 + 0.8 = 1.152, en de teller komt op 3. De afstand van (-2.0479, 1.152) tot (0, 0) is royaal meer dan 2, dus de teller blijft staan op 3. Het mandelgetal van (0.5, 0.8) is dus 3.

De Mandelbrot-figuur

Aan de hand van mandelgetallen kunnen we gemakkelijk een kleur van elk punt bepalen. Een mogelijkheid is deze: punten met een even mandelgetal worden wit, punten met een oneven mandelgetal worden zwart. Ook punten met mandelgetal oneiding worden zwart. Geef je elk punt van het scherm de aldus bepaalde kleur, dan zie je een afbeelding van de Mandelbrot-figuur.

Het interessante gedeelte van de figuur zit in het gedeelte voor x en y tussen -2 en 2 (daarbuiten is het menadelgetal 2 en het plaatje dus zwart). We moeten dus een beetje inzoomen om de figuur goed te kunnen bekijken. Voor x en y tussen -2.5 en 2.5 ziet die er als volgt uit:

De figuur is opmerkelijk grillig, zeker als je bedenkt hoe relatief eenvoudig het algoritme eigenlijk is. Het wordt nog mooier als je verder inzoomt op een onderdeel van de figuur.

De userinterface

We gaan een programma maken waarmee de gebruiker kan inzoomen op de Mandelbrotfiguur. In het window staan behalve de figuur vier tekstboxes. De gebruiker kan daarin intikken: Drukt de gebruiker daarna op de OK-button, dan moet het daarin aangegeven deel van de Mandelbrotfiguur worden getoond.

De userinterface hoeft er niet precies zo uit te zien als in het voorbeeld. In plaats van een OK-button mag je ook andere manieren gebruiken om de invoer te bevestigen. Je mag kiezen of je de interface maakt met hulp van Visual Studio's visuele designer, of dat je hem helemaal zelf uitprogrammeert.

Verdere interactie

Ook kan de gebruiker ook met de muis op de figuur klikken. Het aangeklikte punt wordt het nieuwe middelpunt, en de schaal wordt twee keer zo klein; de gebruiker zoomt daarmee in op het aangeklikte punt. De nieuwe waarden van midden en schaal worden ook in de tekstvelden weergegeven.

Verder is er nog een control waarmee de gebruiker kan kiezen uit een aantal voorbeeldplaatjes. De tekstvelden worden dan automatisch ingevuld en het bijbehorende plaatje getoond. Kies zelf een aantal mooie details, waaronder het basisplaatje. Het basisplaatje moet ook zichtbaar zijn als het programma begint.

De kleuren

Hierboven is een zeer eenvoudige kleuring van de figuur beschreven: punten met even mandelgetal worden wit, andere punten zwart. Daar kun je het programma in eerste instantie mee testen. Maar in het definitieve programma moeten de punten gekleurd worden, waarbij de rood-, groen- en blauw-component alledrie van het mandelgetal afhangen. Hier zijn twee voorbeelden, maar er zijn nog vele andere mogelijkheden. Wees eens creatief!

Optionele extra (voor als je nog tijd over hebt): je kunt de kleurbepaling wellicht nog laten afhangen van extra, door de gebruiker te bepalen parameter(s). Daarvoor kun je eventueel nog extra interactiecomponenten toevoegen.

Beoordelingspunten

Behalve op de werking wordt het programma ook beoordeeld op grond van stijlkenmerken in het programma, zoals: