Menu
Ferdinand Lehr's Weblog
  • Startseite
  • Kunstgalerie
  • Fotografie
  • Kontakt
  • Datenschutzerklärung
  • Impressum
Ferdinand Lehr's Weblog
Effektgrafik 2D-Zellularautomat

Auf der Suche nach Diamanten

5. Mai 20203. April 2021 von Ferdinand Lehr

Ich bin steinreich. Wer wissen will wie ich das geschafft habe, möge weiterlesen. Normalerweise entstehen Diamanten ja durch Kohlenstoffverbindungen, die durch geologische Verformungen unter der Erde unter hohem Druck, jahrtausendelang verdichtet worden sind. Industriell kann man Diamanten auch künstlich herstellen, z.B. für besonders harte Sägeblätter. Aber es gibt noch eine andere Stelle, an der die wertvollen Edelsteine auftreten: nämlich zu Hause am Computer.

Die abgebildete Grafik zeigt den Zustand einer algorithmischen Berechnungsvorschrift nach etwa einer halben Million Durchläufen. Ein einzelner Durchlauf benötigt hier ca. 0.8 Millisekunden. Das zugrundeliegende Prinzip ist ein einfacher 2D-Zellularautomat. Bei jedem Rechenschritt wird die letzte (die unterste) Zeile berechnet, und zwar immer aus der vorletzten Zeile. Danach wird das gesamte Bild nach oben verschoben, so dass die letzte Zeile frei wird, und der Vorgang beginnt von Neuem. Zu Beginn wird die unterste Zeile mit Zufallswerten gefüllt:

Startzeile = {0,0,1,1,1,1,0,1,1,1,1,1,0,1,0,0,0,0,1,1,
              1,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,0,
              0,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,
              0,1,0,1,1,1,1,0,1,0,1,1,0,0,0,1,1,0,1,0,
              0,0,1,0,0,0,0,1,1,0,1,0,1,1,1,1,1,1,0,1,
              1,0,0,1,0,1,1,1,0,1,1,0,1,1,1,0,0,1,1,0,
              1,1,0,0,1,0,1,1,1,0,1,1,1,1,0,0,1,0,1,1,
              0,0,1,1,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,0}

Die Folgezeilen-Berechnung ergibt sich dann aus zwei einfachen Regeln:

Für jeden neuen Bildpunkt in der letzten Zeile wird in der vorletzten Zeile nachgeguckt, wie die Bildpunkte dort gesetzt sind. Steht oben links und oben rechts eine Eins (weiß), dann ist der neue Bildpunkt ebenfalls weiß. Steht oben links und oben rechts eine Null (schwarz) und außerdem direkt darüber ebenfalls eine Null, dann wird der neue Bildpunkt schwarz. In allen anderen Fällen wird eine Null in die Folgezeile geschrieben. Bildpunkte, die außerhalb des sichtbaren Bildschirms liegen, werden außerdem als Null gewertet.

Jetzt kann die Suche losgehen. Das Bild läuft flüssig und schnell von unten nach oben und bereits jetzt sind sehr viele kleine Diamanten erkennbar. Ein Unterprogramm prüft bei jedem Durchgang, wie groß diese sind und stoppt ab einer gegebenen Mindestgröße den Programmablauf. Wie man in der Tabelle sehen kann, sind einige ziemlich große Klunker dabei herausgekommen.

Ob es bei der gegebenen Bildbreite von 160 Bildpunkten noch größere Diamanten gibt, ist unklar. Eine mehr als zehnminütige Suche blieb ohne Ergebnis.

Quellcode (FreeBASIC):

'---------------------------------------------'
'     DIAMOND-SEARCHING TOOL                  '
'     (c) 2020 F. Lehr                        '
'     written for FreeBASIC Compiler 1.05.0   '
'---------------------------------------------'

dim shared mx as integer = 320
dim shared my as integer = 200

dim shared amx as integer = 320/2
dim shared amy as integer = 200/2

dim shared a(mx,my) as Byte

function R1() as byte
    dim r as single = rnd()
    if r<0.5 then
        return 0
    else
        return 1
    end if
end function

sub drawArray()
    dim as integer x,y
    for y=1 to amy
        for x=1 to amx
            Line ( (x-1)*2, (y-1)*2 )-( (x-1)*2+1, (y-1)*2+1 ), 15*a(x,y), B
        next x
    next y
end sub

sub initArray()
    dim as integer x,y
    for y=1 to amy
        for x=1 to amx
            a(x,y) = 0
        next x
    next y
end sub

sub fillFirstLine()
	'fill bottom line with random values (1 and 0)
    dim as integer x
    for x=1 to amx
        a(x,amy) = R1()
    next x
end sub

sub scrollUP()
    dim as integer x,y
    for y=1 to amy-1
        for x=1 to amx
            a(x,y) = a(x,y+1)
        next x
    next y
end sub

function getAbove(x as integer) as byte
    if (x<1) or (x>amx) then 
        return 0
    else 
        return a(x,amy-1)
    end if
end function


sub calcNextLine()
    'Calculate the bottom line.    
    
    dim as integer x
    for x=1 to amx
        if getAbove(x-1)=1 and getAbove(x+1)=1 then
            a(x,amy) = 1
        elseif getAbove(x-1)=0 and getAbove(x+1)=0 and getAbove(x)=0 then
            a(x,amy) = 1
        else
            a(x,amy) = 0
        end if
        
    next x
end sub

function checkForBigTriangle(leng as integer) as integer
    dim c as integer = 0
    dim x as integer
    for x=1 to amx
        if (a(x,30)=1) then
            c=c+1
            if c>=leng then
                'obtain real length
                while x<=amx-1 and a(x+1,30)=1
                    x=x+1
                    c=c+1
                wend
                return c
            end if
        else
            c=0
        end if
    next x
    return 0
end function

'--------------------- MAIN-PROGRAM STARTS HERE ----------------------'

initArray()
fillFirstLine() 'Comment this line out, to start with zeros.

screenres mx, my

dim ctr as integer = 0
dim start as double
start = timer

dim k as string
do
    k = Inkey$
    
    screenlock()
    'cls
    drawArray()
    screenunlock()
    sleep 10
    
    scrollUP()
    calcNextLine()
    ctr = ctr + 1
    
    dim c as integer = checkForBigTriangle(35)
    if c>0 then
        print "" & Int(timer-start) & " sec [" & c & "]  ctr=" & ctr
        exit do
    end if
    
    'Save images
    'if ctr>=210 and ctr<(210+200) then
        'dim str1 as string = "Dia" & ctr & ".bmp"
        'bsave str1, 0
    'end if
    
    If k = Chr$(27) Then
        exit do
    end if
loop

sleep
'--------- END OF PROGRAM ----------'

Neueste Beiträge

  • Sternenschanze Lienzingen/Ötisheim

    Sternenschanze Lienzingen/Ötisheim

  • Neue Fotogalerie

    Neue Fotogalerie

  • "Hanussen II" (Willi Gerstel)

    "Hanussen II" (Willi Gerstel)

NEU IN DER GALERIE

Art-Graphic "Pioneers of the Impossible Staircases" (2024) (c) F. Lehr
"Pioneers of the Impossible Staircases" (February 2024)

Archiv

  • Mai 2023
  • April 2023
  • März 2023
  • November 2022
  • Oktober 2022
  • April 2021
  • März 2021
  • Februar 2021
  • Dezember 2020
  • Juni 2020
  • Mai 2020
  • April 2020
  • April 2016
© 2021 Ferdinand Lehr. Alle Rechte vorbehalten.