Exit

Net als veel andere studenten informatica heb ik software geschreven1 dat afbeeldingen van de Mandelbrot-verzameling rendert. Hoewel mijn implementatie vrij eenvoudig is (een samenvatting met de belangrijkste details wordt hieronder vermeld), is het een goed werkend voorbeeld dat misschien anderen kan helpen die moeite hebben met het renderen van fractals, het implementeren van multithreading of het programmeren in C# in het algemeen.

Het is behoorlijk verbazingwekkend hoe deze ogenschijnlijk eenvoudige berekening zulke complexe afbeeldingen kan genereren.

C#
/// <summary>
/// This is the core function where the fractal magic happens. It calculates for the given coordinates in the complex plane the mandel number which is used for colouring.
/// </summary>
/// <param name="x">Real number.</param>
/// <param name="y">Imaginairy number.</param>
/// <returns>Complex number.</returns>
private int GiveMandelNumber(double x, double y)
{
    var mandelNumber = 0;
    double a = 0, aOld = 0, b = 0, c = 0;
    while (c <= 4 && mandelNumber < _iterations)
    {
        a = a * a - b * b + x;
        b = 2 * aOld * b + y;
        aOld = a;
        c = a * a + b * b;
        mandelNumber++;
    }
    return mandelNumber;
}

Details over mijn implementatie (volgorde is tamelijk willekeurig)

  1. 7 presets (op locaties die ik mooi vind).
  2. Maximaal 60.000 iteraties ondersteund (standaard settings is 400).
  3. Anti-aliasing tot 6 keer (resolutie van 7.200 x 7.200 pixels op high-res displays).
  4. Afbeelding is verdeeld in blokken voor parallelle berekening (standaard blokgrootte is 10, dus de afbeelding wordt vervolgens in 10 * 10 = 100 delen gesneden).
  5. Een voortgangsbalk wordt bijgewerkt die het aantal voltooide blokken aangeeft.
  6. Alle berekeningen worden uitgevoerd door de CPU.
  7. De rode, groene en blauwe tonen kunnen afzonderlijk worden aangepast.
  8. Een gerenderde afbeelding kan worden opgeslagen als PNG, JPEG of BMP.
  9. Sleep met de muis om het gerenderde beeld te verplaatsen.
  10. Dubbelklik links om in te zoomen en dubbelklik rechts om uit te zoomen (zoomfactor is 2).
  11. Maximaal zoomniveau ligt ergens rond 5E-17.

Op bijna elk punt is er ruimte voor verbetering, maar dat laat ik aan jou over 😁. Je kunt de broncode of het uitvoerbare bestand downloaden op Github.

1 Onderdeel van het vak “Imperatief programmeren” op de UU.

Leave a reply

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Close
Go top