Nico Madysa | Letzten samstag abend (Ich hatte mich entschieden, Asterix doch nicht zu gucken ) habe ich ein wenig mit binärem OR und AND beschäftigt. Ich ging vom einfachen Fall aus, dass ich die Zahlen von 0 bis 10 in allen möglichen Kombinationen miteinander verknüpfe. KompilierenMarkierenSeparieren Ich wollte zuerst deren Unterschiede zum gewöhnlichen Addieren feststellen. Als ich mir die Differenzen als Zahlen ausgeben ließ, war mir das zu unklar. Also gab ich mir das in einem kleinen Diagramm aus. KompilierenMarkierenSeparieren Das war schon anschaulicher, aber bei weitem genauso unnütz wie die Zahlen (Genau genommen war das ganze Experiment unnütz ). Jedenfalls fuhr ich fort, in dem ich den Zahlenbereich auf 0-100 ausweiterte. Und plötzlich kamen mir die Figuren, die AND und OR hervorbrachten recht bekannt vor... Nach etwas Herumprobieren wählte ich den Zahlenbereich 0-127 und endlich hatte es bei mir Klick gemacht. Es handelte sich um ein [...] ! Diese Figur wird normalerweise nur durch Rekursion erreicht (erst letztes Jahr bin ich am Zeichnen dieser Figur mittels Rekursion kläglich gescheitert). Umso mehr war ich überrascht, dass sich diese Figur über binäre Verknüpfungs-Funktionen erreichen lassen. Nach einiger Arbeit bekam ich folgenden bildschönen Code heraus: KompilierenMarkierenSeparieren
proc DrawSierpinskiAND
parameters ord% , farbe% , x% , y%
declare i%
ord% = 2 ^ ord%
whileloop 0 , ord%-1
i% = &loop
whileloop 0 , i%
SetPixel x%+i% , y%+And(i%,&loop) , Farbe%
EndWhile
EndWhile
endproc
proc DrawSierpinskiOR
parameters ord% , farbe% , x% , y%
declare i%
ord% = 2 ^ ord%
whileloop 0 , ord%-1
i% = &loop
whileloop 0 , ord%-1-i%
SetPixel x%+i% , y%+Or(i%,&loop) , Farbe%
EndWhile
EndWhile
endproc
declare time&
cls
TextColor RGB(255,255,255) , (-1)
UseBrush 1 , RGB(000,000,000)
Fill 10 , 10 , 0
UseBrush 1 , RGB(255,255,255)
Rectangle 99 , 99 - 101+256 , 101+256
time& = &GetTickCount
DrawSierpinskiAND 8 , RGB(255,000,000) , 100+000 , 100+000
DrawText 10 , 10 , str$(int((&GetTickCount-time&)1000))
waitinput
Rectangle 99 , 99 - 101+256 , 101+256
time& = &GetTickCount
DrawSierpinskiAND 7 , RGB(255,000,000) , 100+000 , 100+000
DrawSierpinskiAND 7 , RGB(255,000,000) , 100+128 , 100+000
DrawSierpinskiAND 7 , RGB(255,000,000) , 100+128 , 100+128
DrawText 10 , 30 , str$(int((&GetTickCount-time&)1000))
waitinput
Rectangle 99 , 99 - 101+256 , 101+256
time& = &GetTickCount
DrawSierpinskiAND 6 , RGB(255,000,000) , 100+000 , 100+000
DrawSierpinskiAND 6 , RGB(255,000,000) , 100+064 , 100+000
DrawSierpinskiAND 6 , RGB(255,000,000) , 100+064 , 100+064
DrawSierpinskiAND 6 , RGB(255,000,000) , 100+128 , 100+000
DrawSierpinskiAND 6 , RGB(255,000,000) , 100+192 , 100+000
DrawSierpinskiAND 6 , RGB(255,000,000) , 100+192 , 100+064
DrawSierpinskiAND 6 , RGB(255,000,000) , 100+128 , 100+128
DrawSierpinskiAND 6 , RGB(255,000,000) , 100+192 , 100+128
DrawSierpinskiAND 6 , RGB(255,000,000) , 100+192 , 100+192
DrawText 10 , 50 , str$(int((&GetTickCount-time&)1000))
waitinput
end
Parameter: ord% = Ordung des Dreiecks (je höher, umso größer wird es) farbe% = Farbe des Dreieckes als RGB-Wert x% , y% = X- und Y-Position des Dreieckes Mit diesem Code lässt sich schnell herausfinden, dass sich solch ein Dreieck schneller zeichnen lässt, wenn man es in kleinere Teildreiecke zerlegt.
Hoffe, das hat jemanden interessiert. |
|