Simulering av kristallbildning

Bakgrund

I uppgiften skall vi simulera ett enkelt fysikaliskt/kemikaliskt experiment. Vi konstruerar ett elektrolytbad som vi omger med en cirkulär anod av zink, och i vars mitt vi placerar en kolkatod - vi lägger därefter en svag spänning över systemet.

Om vi nu släpper zinkjoner i badets kant så kommer de att vandra omkring slumpmässigt (så kallad Brownsk rörelse) i badet. Den första jonen kommer förr eller senare att fastna på katoden i elektrolytbadets mitt, därefter kommer nästa jon att fästa vid den första när den passerar förbi. Efterhand som nya joner passerar förbi och fastnar vid de joner som tidigare fastnat, byggs en kristall upp. Det blir svårare och svårare för jonerna att ta sig in till kristallens mitt, istället fastnar de på de 'kristallarmar' som växer ut. Denna tillväxt följer ett till synes komplicerat mönster, och ger upphov till en så kallad fraktal (dvs en figur som har icke-heltalig dimension.).

En färdig kristall kan se ut som i följande figur:

Uppgift

Din uppgift är att skriva ett program som simulerar joner som får vandra omkring slumpmässigt tills de fastnar på den växande kristallen. Ditt huvudprogram får inte vara mer än högst 2-3 rader långt, det bör anropa underprogram eller eventuellt operationer på lämpliga objekt (det är helt OK att lägga hela programmet i en klass, men då måste du använda lämpliga underprogram).

Jonerna vandrar en åt gången, och de rör sig i ett rutnät, där de i varje steg går ett steg uppåt/nedåt eller höger/vänster (figuren nedan visar en jon som vandrar nio steg):

Vi inleder experimentet med att placera en jon i badets mitt. Därefter släpper vi joner från slumpmässiga punkter på en startcirkel (markerad med en prickad cirkel i figuren nedan), och låter dem vandra tills de antingen passerar tätt förbi en jon som fastnat i den växande kristallen, eller tills de kommit längre än ett givet avstånd (flyktradien) från badets mitt. En jon passerar "tätt förbi" en kristalliserad jon när den är ett steg ovanför, under, till vänster om, eller till höger om en redan kristalliserad jon. Om en jon kommer utanför flyktcirkeln ersätter vi den med en ny jon som släpps på ett slumpmässigt ställe utmed startcirkeln. Det kan vara lämpligt att låta startcirkeln ligga 10 punkter innanför flyktcirkeln (dvs låta startradien vara 10 punkter mindre än flyktradien).

I varje steg som dina joner tar skall du alltså:

Du skall fortsätta släppa ut joner tills den sista jon som fastnar är så långt från mittpunkten som startcirkeln.

Användaren skall kunna bestämma storleken på fönstret (som är dubbelt så brett och högt som flyktradien) och den storlek jonerna skall ha i fönstret (dvs storleken på prickarna i ditt DotWindow). Fönstret skall uppdateras efter att varje ny jon har vandrat färdigt.

Idén till uppgiften är tagen från kursboken i den Kaos-kurs som ges vid institutionen för matematisk fysik vid LTH. Läs gärna mer i den.

Krav för godkänt

Tips och kommentarer