Zu meiner aktiven
Schulzeit, so Ende der 1970ger, Anfang der 1980ger
Jahre wurden wir Schüler mit den damaligen verfügbaren
Homecomputern auch mit der folgenden Aufgabe bedacht:
"Lasse einen Quader auf
dem Bildschirm drehen"
und später:
"Dieser Quader darf nicht
ruckeln und muss möglichst 'glatt' durchlaufen !"
Zunächst muss man sich
also Gedanken machen, wie ein Quader perspektivisch
aussieht. Dazu habe ich einmal folgendes Foto gemacht:
Wenn wir diesen Quader
nun auf der Tischplatte drehen lassen würden, so
ergäben sich zwei Ellipsen, auf denen die Ecken des
Quaders entlang laufen. Ich habe das einmal mit einer
Fotomontage visualisiert:
Wenn wir das Programm
entsprechend auslegen, so brauchen wir nur 8 Ecken auf
zwei Ellipsen rotieren zu lassen. Diese Eckpunkte
verbinden wir dann mit geraden Linien und fertig ist
der drehende Quader.
Mein zugrunde liegender
Quellcode ist sehr simpel:
Window
200,200-450,500
windowtitle "strippenstrolch.des
drehender Quader"
Mcls 400,500
proc drehen
declare x!, xpos%, ypos%, Zeit%
x!=0
while x!<= 2*@pi()
x! = x! + 0.01
Mcls 400,500
startpaint -1
line 200+(150 * @sin(x!)),150+(100 *
@Cos(x!)),200+(150 * @sin(x!)),250+(100
* @Cos(x!))
line 200+(150 * @sin(x!+@pi())),150+(100
* @Cos(x!+@pi())),200+(150 *
@sin(x!+@pi())),250+(100 *
@Cos(x!+@pi()))
line 200+(150 *
@sin(x!+0.5*@pi())),150+(100 *
@Cos(x!+0.5*@pi())),200+(150 *
@sin(x!+0.5*@pi())),250+(100 *
@Cos(x!+0.5*@pi()))
line 200+(150 *
@sin(x!-0.5*@pi())),150+(100 *
@Cos(x!-0.5*@pi())),200+(150 *
@sin(x!-0.5*@pi())),250+(100 *
@Cos(x!-0.5*@pi()))
line 200+(150 * @sin(x!)),150+(100 *
@Cos(x!)),200+(150 *
@sin(x!+0.5*@pi())),150+(100 *
@Cos(x!+0.5*@pi()))
line 200+(150 * @sin(x!)),150+(100 *
@Cos(x!)),200+(150 *
@sin(x!-0.5*@pi())),150+(100 *
@Cos(x!-0.5*@pi()))
line 200+(150 * @sin(x!+@pi())),150+(100
* @Cos(x!+@pi())),200+(150 *
@sin(x!-0.5*@pi())),150+(100 *
@Cos(x!-0.5*@pi()))
line 200+(150 * @sin(x!+@pi())),150+(100
* @Cos(x!+@pi())),200+(150 *
@sin(x!+0.5*@pi())),150+(100 *
@Cos(x!+0.5*@pi()))
line 200+(150 * @sin(x!)),250+(100 *
@Cos(x!)),200+(150 *
@sin(x!+0.5*@pi())),250+(100 *
@Cos(x!+0.5*@pi()))
line 200+(150 * @sin(x!)),250+(100 *
@Cos(x!)),200+(150 *
@sin(x!-0.5*@pi())),250+(100 *
@Cos(x!-0.5*@pi()))
line 200+(150 * @sin(x!+@pi())),250+(100
* @Cos(x!+@pi())),200+(150 *
@sin(x!-0.5*@pi())),250+(100 *
@Cos(x!-0.5*@pi()))
line 200+(150 * @sin(x!+@pi())),250+(100
* @Cos(x!+@pi())),200+(150 *
@sin(x!+0.5*@pi())),250+(100 *
@Cos(x!+0.5*@pi()))
endpaint
zeit%=0
while Zeit%<1000
inc Zeit%
endwhile
MCopyBmp 0,0-400,500 > 0,0,0
endwhile
endproc
Do:
drehen
goto "Do"
waitkey
end |
Der Trick, den man
benötigt, um die Ruckelfreiheit zu bekommen, ist
folgender:
Ich rendere den Quader
in jeder neuen Position auf den Memory-Screen. Zuvor
wird dieser Memory-Screen gelöscht. Nach dem Rendern
wird der Memory-Screen einfach in das Hauptfenster
kopiert. Somit sieht man nicht, wie der Quader mit den
Einzellinien aufgebaut wird.
Hier schließlich die
beiden Downloads dazu:
Ich wünsche frohes
Programmieren unter Profan,
|