|
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 "Strippenstrolchs 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,
|