Sierpinski trekant er nem at lave, men kræver bladning af programmering og matematik. På disse sider lærer du hvordan den kan laves med hjælp af Excel beregninger og so med advanceret program. Sierpinski trekanten er Fraktal, et mønster som gentager sig evigt på mindre og mindre skalar efter som vi zoomer ind i billedet.
Vi begynder med at lave os en trekant. En trekant har tre hjørner, som vi kan give koordinater i et koordinatsystem, som gjort på billedet. Derefter vælger vi et tilfældigt punkt (x, y) indeni trekanten.
Nu vælger vi tilfældigt et hjørnepunkt. Det kunne være 1, 2 eller 3. Det kunne vælges med at kaste terning. Derefter finder vi det næste punkt P2, som er midtvejs mellem det første punkt og det hjørne vi valgte. Den matematiske formel for at finde de nye koordinater er at finde gennemsnittet af x og y koordinaterne
Med udgangspunkt i det fundne punkt, vælger vi et nyt hjørne tilfældigt, og finder derefter ny punkt som er midtvejs på vej mod dette hjørne. Processen gentages så længe man gider, eller om man er overbevist at der dukker op et mønster som ikke er tilfældigt.
Excel er udmærket til at arbejde med tal, men man skal lære nogle grundlæggende tinh undervejs. Vi begynder med at lave os en tabel over hjørenepunkterne og starter med at sætte ind et tilfældigt startpunkt som vist her
For det næste punkt, skal vi vælge et hjørne tilfældigt, og det kan vi gøre med excel funktionen "slumpmellem()". I cellen E2 skriver vi "=Slumpmellem(1;3)", som betyder at excel vælger et tilfældigt tal fra 1 til 3.
Nu skal vi få Excel til at vælge det rigtige hjørnekoordinat. Dette kan vi lave med Excel funktionen "Index(matrix, række, kolonne)". Matrix er listen med vores hjørnepunkter, som vi kan vælge med at farve over tællerne (vælge første punkt og "dragge" over). Rækken er styret af det tilfældige tak, som vi vælger med at klikke på det. For x koordinatet er kolonnen 1.
Vi skal passe på at det nye punkt har koordinater som er gennemsnittet af hjørnet og det gamle punkt, således at formelen bliver
=(F1+INDEKS(B1:C3;E2;1))/2
Tilsvarende for y koordinatet bliver formelen
=(G1+INDEKS(B1:C3;E2;2))/2
Nu vil vi gerne trække det tilfældige tal samt de nye koordinater til at lave nye punkter, men problemet er at så flytter det valgte område med punkterne sig også. Til at dette ikke sker, sætter vi $-tegn ind i henvisningen i formelen til tabellen. så de nu ser sådanne ud:
=(F1+INDEKS(B$1:C$3;E2;1))/2
=(G1+INDEKS(B$1:C$3;E2;2))/2
Derefter kan man vælge ekstra punkter, lige hvor mange man har lyst til
Til at lave selve Sierpinski trekanten, kan man vælge F og G kolonnerne og bede om punktplot. Til at få flere punkter kan man bare dragge ned så længe man gider. Billedet her viser diagrammet efter 1000 punkter, hvor man begynder at ane at der er gentagelser i trekanterne.
Vi vil gerne lave et program som er hurtigere end Excel hvor vi kan bedre styre have vi har lyst til at gøre og se i vores trekant. Til dette kan vi bruge programmet processing, hvor man kan lave java kodning.
Programmet kan downloades fra: https://processing.org/download. Kildekoden kan kopieres nedenfra eller downloades fra her.
// Triangle corners
PVector[] corners = new PVector[3];
// Current point for Chaos Game
PVector current;
// Zoom factor
float zoom = 1.0;
// Offset for panning
PVector offset;
// Variables for dragging
PVector dragStart;
boolean dragging = false;
void setup() {
size(800, 800);
background(255);
stroke(99);
strokeWeight(1);
textSize(16);
// Initialize triangle corners
corners[0] = new PVector(width / 2, 50);
corners[1] = new PVector(50, height - 50);
corners[2] = new PVector(width - 50, height - 50);
// Random starting point
current = new PVector(random(width), random(height));
// Initial offset
offset = new PVector(0, 0);
}
void draw() {
//background(255); // Clear canvas
// Display zoom factor
fill(0);
noStroke();
text("Zoom: " + nf(zoom, 1, 2), 10, 20);
// Apply transformations
translate(width / 2, height / 2);
scale(zoom);
translate(-width / 2 + offset.x, -height / 2 + offset.y);
// Draw points
stroke(0);
for (int i = 0; i < 10000*zoom; i++) {
int choice = int(random(3));
current = PVector.lerp(current, corners[choice], 0.5);
point(current.x, current.y);
}
}
// Zoom with mouse wheel
void mouseWheel(MouseEvent event) {
float e = event.getCount();
zoom *= (e > 0) ? 0.9 : 1.1;
strokeWeight(1/zoom);
// Clear canvas after zoom
background(255);
}
// Start dragging
void mousePressed() {
dragStart = new PVector(mouseX, mouseY);
dragging = true;
}
// Update offset while dragging
void mouseDragged() {
if (dragging) {
PVector dragEnd = new PVector(mouseX, mouseY);
PVector delta = PVector.sub(dragEnd, dragStart);
offset.add(delta.div(zoom)); // Adjust for zoom
dragStart = dragEnd;
// Clear canvas after drag
background(255);
}
}
// Stop dragging
void mouseReleased() {
dragging = false;
}