C 64
Listing des Monats

Trickfilm mit dem C 64

In die vierte Dimension, die bewegte dreidimensionale Grafik, dringen Sie mit diesem Programm vor.
Sie können so mit einfachsten Mitteln Trickfilme mit verblüffenden Eigenschaften erstellen.

Das Bild kann »gekippt« werden
Auch dreidimensionale Körper können dargestellt werden
Vier Phasen der Bewegung

Die Idee zu diesem Programm kam uns, als wir zum zweiten Mal die Sendung »Das Bild, das aus dem Rechner kam« sahen.

Die erste noch in Comal geschriebene Version berechnete jeweils ein Bild und zeichnete es sofort. Das Ergebnis: nur alle 7 Sekunden ein Bild! Auch als erst alle Linien berechnet und dann gezeichnet wurden, konnte von einem flüssigen Bewegungsablauf keine Rede sein. Bei der jetztigen Version wird der Teil des Zeichnens von einer Maschinencode-Routine übernommen, die eine Geschwindigkeit von 3 bis 10 Bilder/s erlaubt. Die Unterschiede gegenüber anderen Trickfilmgeneratoren:

(Dirk und Armin Biernaczyk/rg)

In die vierte Dimension, die bewegte dreidimensionale Grafik, dringen Sie mit unserem Listing des Monats vor.

Der »3D-Movie Maker« muß in zwei Teilen eingegeben werden: zuerst das Maschinenprogramm, dann der Basic-Teil. Wenn das Maschinenprogramm eingegeben und gestartet wurde, so speichert es sich, falls kein Prüfsummenfehler auftrat, selbst als »TRICK.OBJ« ab. Man braucht sich nun nicht mehr darum zu kümmern. Bei dem Basic-Teil, der nun eingegeben werden kann, dürfen alle REM-Zeilen ersatzlos wegfallen. Beim Start des Basic-Teils wird automatisch der Maschinenteil, der sich auf Diskette befinden sollte, nachgeladen.

Bedienung - Eingabe des Körpers

Vor der Benutzung des Programmes, müssen die Punkte Verbindungs- und Bewegungsvorschrift des Körpers in den DATA-Zeilen ab 8000 festgelegt werden. Dies ist notwendig, damit bei Änderungen oder einem erneuten Start nicht alles wieder neu eingegeben werden muß. Die DATA-Zeilen, die das Listing momentan enthält, erzeugen den auf dem Bildschirm herumfliegenden Schriftzug »64’er«. Die Punkte werden mit X, Y und Z-Koordinaten eingegeben. Als Endmarke dient hier dreimal die 1000. Bei der Verbindungsvorschrift wird jeweils der Anfangs- und Endpunkt angegeben zum Beispiel: Von Punkt 1 nach Punkt2 = DATA 1,2. Hier dient zweimal die 1000 als Endmarkierung.

Beispiel: Man will ein Kreuz erzeugen.

Punkte:DATA0,10,0,10,0,0,-10,0
DATA —10, 0,0, 1000,1000,1000
Verbindungsvorschrift:DATA 1,3,2,4,1000,1000

Bei der Bewegungsvorschrift ist es allerdings etwas komplizierter. Hier müssen zweimal drei Verschiebungsarten, drei Drehungsarten und die Dauer des Vorgangs angegeben werden. Zuerst kommt die erste Verschiebung in X-, Y- und Z-Richtung, dann die Drehung um die drei Achsen, nun die zweite Verschiebung und zum Schluß die Dauer des Ganzen. Diese Reihenfolge hat folgenden Sinn:

Wird zuerstverschoben und dann gedreht, dreht sich die Figur um den Bildschirmmittelpunkt. Bei umgekehrter Reihenfolge dreht sich die Figur an beliebiger Stelle um ihren eigenen Mittelpunkt. Hier ein Beispiel einer DATA-Zeile: DATA 0,0,0,5,0,0, 0,5,0, 10

Die Figur bewegt sich 10 Bilder lang um jeweils 5 Stellen nach oben und dreht sich dabei um jeweils fünf Grad um die X-Achse. Einen Zoomeffekt erreicht man durch Verschieben in der Z-Achse, so kann man zum Beispiel mit DATA 0,0,0,0,0,0,0,0,1,50 eine Figur langsam vergrößern. Hier bildet einmal die 1000 die Schlußmarkierung. Um die vielen verschiedenen Möglichkeiten der Bewegung zu entdecken, lohnt es sich, die verschiedenen Kombinationen auszuprobieren (und dabei mit einfachen Bewegungen anzufangen).

Bedienung — Ablauf des Programms

Der »3D-Movie-Maker« stellt vier Menüpunkte zur Wahl:

Der Algorithmus

Das eigentliche Kernstück des Programms ist ein Algorithmus, der die Punkte um einen Winkel dreht, die X-, Y- und Z-Koordinaten in Bildschirmkoordinaten umrechnet und dann die außerhalb liegenden Teile der Linien wegstreicht. Beim Drehen (hier um die Z-Achse) werden erst X- und Y-Koordinaten in Radius und Winkel (im Bogenmaß) umgerechnet; bezogen auf den Koordinatenursprung (siehe Bild 1). Nun wird der Winkel, um den gedreht werden soll, addiert und die neuen Koordinaten werden aus dem neuen Winkel und dem Radius errechnet (siehe Bild 2).

Bild 1. Angabe der Winkel in Bogenmaß
Bild 2. Berechnung der neuen Koordinaten

Beim Umrechnen in Bildschirmkoordinaten wird einfach die Z-Koordinate auf die X und Y-Koordinate so aufgerechnet, daß Punkte, die weiter vorne liegen, vom Mittelpunkt wegrücken. Außerdem wird der Koordinatenursprung in die Bildschirmmitte verlegt. Durch dieses Verfahren wird die Figur mit einem Fluchtpunkt in der Mitte des Bildschirms dargestellt Das nun folgende Wegstreichen der außerhalb liegenden Linien und Linienstücke geschieht mit Hilfe einer Gradengleichung. Falls nur Teile der Geraden außerhalb des Bildschirms liegen, wird der äußerste Wert für X beziehungsweise Y angenommen und die fehlende Koordinate errechnet (siehe Bild 3).

Beschreibung der Maschinenroutine

Die Zeichenroutine des »3D-Movie-Makers« übernimmt die Verwaltung der Grafik und ist, zum Erreichen eines Trickfilmeffekts, ganz auf Geschwindigkeit ausgelegt Aus diesem Grund erhielt sie die folgenden Merkmale:

Das wichtigste Mittel zur Erzeugung eines flüssigen Bilderablaufs und die Grundidee der Routine ist jedoch das »verdeckte Zeichnen«. Dafür werden zwei Bitmaps benötigt (bei unserem Programm ab $A000 und $E000). Während nun eine der beiden zu sehen ist, wird auf der anderen gezeichnet. Nun wird das neue Bild sichtbar gemacht und das alte, welches nicht mehr zu sehen ist, wird gelöscht. Dieser Vorgang wiederholt sich, bis alle Bilder abgearbeitet sind. Hier noch eine Anmerkung: die Lineroutine haben wir mit einigen Änderungen dem Artikel »Ein schneller Drawline-Algorithmus« aus dem 64’er, 4/84 entnommen. Die Funktion läßt sich am besten dort nachvollziehen.

(Armin und Dirk Biernaczyk/rg)

Felder:

X(I), Y(I), Z(I) Originalkoordinaten der Figur aus den DATA-Zeilen
X1(I), Y1(I), Z(I) Koordinaten beim Rechnen und für das POKEN
P1(I), P2(I) Verbindungsvorschriften aus den DATA-Zeilen

Normale Variablen:

PO Speicherpointer für fertige Daten
Q-1 Zähler für fertige Bilder
A2 Anzahl der Linien pro Bild
A1 Anzahl der Punkte pro Bild
AN Anzahl der Bilder
P1, P2, P3, P4, PB, PA Variablen zur Berechnung des zu löschenden Bildschirmbereichs
WX, WY, WZ, XA, YA, ZA, XB, YB, ZB Variablen für die Drehbewegungen und Verschieben (werden bei jedem Bild auf W1, ... aufaddiert)
W1, W2, W3, X1, Y1, Z1, X2, Y2, Z2 Momentane Lage des Körpers
Variablenliste
PROGRAMM : TRICK.OBJ      C000 C2A4
-----------------------------------
C000 : 20 36 C0 20 A4 C0 20 98   71
C008 : C0 20 E6 C0 C6 4F D0 F3   BC
C010 : 20 7F C0 C6 52 D0 EC A9   AB
C018 : 37 85 01 58 A9 00 85 C6   9B
C020 : A5 C6 F0 FC C6 C6 A9 1B   83
C028 : 8D 11 D0 A9 15 8D 18 D0   67
C030 : A9 03 8D 00 DD 60 20 FD   1C
C038 : AE 20 9E B7 86 4E 20 FD   EC
C040 : AE 20 9E B7 86 50 20 FD   04
C048 : AE 20 9E B7 86 52 A9 3B   BD
C050 : 8D 11 D0 A9 38 8D 18 D0   C1
C058 : A9 00 8D 00 DD 20 C2 C0   D0
C060 : 78 A9 35 85 01 A2 0B BD   78
C068 : 8C C0 95 A0 CA 10 F8 A2   24
C070 : 20 A9 00 A8 20 A0 00 A9   D4
C078 : A0 85 FC A9 00 85 53 A9   1C
C080 : 8B 85 8E A9 FA 85 8D A5   04
C088 : 4E 85 4F 60 99 00 E0 C8   27
C090 : D0 FA E6 A2 CA D0 F5 60   B7
C098 : A5 50 85 51 20 70 C1 C6   0B
C0A0 : 51 D0 F9 60 A0 05 B1 8D   F8
C0A8 : AA 88 B1 8D 05 FC 85 A2   48
C0B0 : 38 A5 8D E9 02 85 8D B0   3F
C0B8 : 02 C6 8E A9 00 A8 20 A0   FD
C0C0 : 00 60 A9 10 A0 CC 84 8C   F8
C0C8 : A0 00 84 8B 20 D9 C0 A0   10
C0D0 : 8C 84 8C A0 00 20 D9 C0   BF
C0D8 : 60 A2 04 91 8B C8 D0 FB   F7
C0E0 : E6 8C CA D0 F6 60 A5 53   89
C0E8 : D0 0C E6 53 A9 E0 85 FC   94
C0F0 : A5 53 8D 00 DD 60 C6 53   45
C0F8 : A9 A0 4C EE C0 8A 4A 4A   00
C100 : 29 FE A8 B9 36 C1 85 FD   8D
C108 : B9 37 C1 85 FE 8A 29 07   75
C110 : 18 65 FD 85 FD A5 14 29   BA
C118 : F8 65 FD 85 FD A5 FE 65   C7
C120 : FC 65 15 85 FE A5 14 29   85
C128 : 07 49 07 AA BD 68 C1 A0   52
C130 : 00 11 FD 91 FD 60 00 00   4D
C138 : 40 01 80 02 C0 03 00 05   87
C140 : 40 06 80 07 C0 08 00 0A   E5
C148 : 40 0B 80 0C C0 0D 00 0F   42
C150 : 40 10 80 11 C0 12 00 14   9F
C158 : 40 15 80 16 C0 17 00 19   FD
C160 : 40 1A 80 1B C0 1C 00 1E   5A
C168 : 01 02 04 08 10 20 40 80   71
C170 : 20 71 C2 A0 01 84 62 84   D4
C178 : 5F 84 5D 88 84 5E 84 61   92
C180 : 84 60 88 A5 59 C5 15 90   44
C188 : 08 D0 18 A5 58 C5 14 B0   18
C190 : 12 38 A5 14 E5 58 85 5B   98
C198 : A5 15 E5 59 85 5C 84 62   7E
C1A0 : 4C B0 C1 38 A5 58 E5 14   99
C1A8 : 85 5B A5 59 E5 15 85 5C   45
C1B0 : A5 FF C5 57 B0 0C 38 A5   49
C1B8 : 57 E5 FF 85 5A 84 5F 4C   92
C1C0 : C6 C1 E5 57 85 5A A5 5C   46
C1C8 : D0 19 A5 5B C5 5A B0 13   12
C1D0 : A6 5A 85 5A 86 5B A5 62   EF
C1D8 : 85 60 A5 5F 85 61 C8 84   72
C1E0 : 62 84 5F A5 5C 4A 85 59   F2
C1E8 : A5 5B 6A 85 58 4C 5C C2   65
C1F0 : A5 62 30 0B 18 65 14 85   3C
C1F8 : 14 90 0D E6 15 D0 09 18   A1
C200 : 65 14 85 14 B0 02 C6 15   B4
C208 : 18 A5 57 65 61 85 57 18   45
C210 : A5 58 65 5A 85 58 A5 59   EA
C218 : 69 00 85 59 E6 5D D0 02   AE
C220 : E6 5E A5 59 C5 5C 90 34   B4
C228 : D0 06 A5 5B C5 58 B0 2C   0A
C230 : 38 A5 58 E5 5B 85 58 A5   9C
C238 : 59 E5 5C 85 59 A5 60 30   F0
C240 : 0B 18 65 14 85 14 90 0D   89
C248 : E6 15 D0 09 18 65 14 85   16
C250 : 14 B0 02 C6 15 18 A5 57   6D
C258 : 65 5F 85 57 A6 57 20 FD   5B
C260 : C0 A5 5E C5 5C 90 07 A5   F5
C268 : 5B C5 5D B0 01 60 4C F0   39
C270 : C1 A0 05 B1 8D 85 14 88   5F
C278 : B1 8D 10 05 68 68 4C 97   BF
C280 : C2 85 15 88 B1 8D 85 57   A7
C288 : 88 B1 8D 85 58 88 B1 8D   A8
C290 : 85 59 88 B1 8D 85 FF 38   90
C298 : A5 8D E9 06 85 8D B0 02   CA
C2A0 : C6 8E 60 20               AD
Listing »TRICK.OBJ«. Verwenden Sie bitte zur Eingabe den MSE
|
100 rem -----------------------------
105 rem -- 3d-movie-maker          --
110 rem -- ein programm von:       --
115 rem -- dirk & armin biernaczyk --
120 rem -- an der papenburg 41     --
125 rem -- 4630 bochum 6           --
130 rem -- tel.: //////            --
135 rem -----------------------------
140 rem (c) 1985 by armin & dirk
145 rem             biernaczyk
150 :
160 rem ------------------
170 rem --- hauptmenue ---
180 rem ------------------
190 :
191 ifa=0thena=1:load"trick.obj",8,1
192 :
195 poke56,50:clr:rem speicher herab.
200 printchr$(147)
210 printspc(10)"** 3d-movie-maker **"
220 print:print:print:print
230 printspc(9)"1 - grafik erstellen"
235 print
240 printspc(9)"2 - grafik abspielen"
245 print
250 printspc(9)"3 - grafik laden"
255 print
260 printspc(9)"4 - grafik abspeichern"
262 print
264 printspc(9)"5 - ende"
265 :
270 getw$:ifw$<"1"orw$>"5"then270
280 w=val(w$)
285 ifw=5thenend
290 onwgosub1040,5040,6040,7040
300 goto200
310 :
315 :
320 :
1000 rem -----------------
1010 rem --- erstellen ---
1020 rem -----------------
1030 :
1040 gosub4540   :rem variablen
1050 gosub4040   :rem einlesen
1060 printchr$(147)"fertige bilder: "
1061 ifan*(a2*6+2)<23000then1080
1062 print"zu wenig speicherplatz"
1063 poke198,0:wait198,1:return
1070 :
1080 forq=1toan  :rem anzahl der bilder
1085 gosub3040   :rem bewegen
1090 gosub2040   :rem berechnen
1095 getta$:ifta$=" "thenifq>1thensys49152,q-1,a2,1
1100 next
1110 q=q-1
1120 return
1130 :
1135 :
2000 rem -----------------
2010 rem --- berechnen ---
2020 rem -----------------
2030 :
2040 rem --- verschieben1 ---
2050 :
2060 fori=1toa1
2070 x1(i)=x(i)+x1:y1(i)=y(i)+y1
2080 z1(i)=z(i)+z1
2090 next
2100 :
2110 rem --- drehen ---
2120 :
2130 ifw1=0then2250
2140 fori=1toa1
2150 xd=x1(i):yd=y1(i)
2160 ifxd=0thenxd=1e-20
2165 ifyd=0thenyd=1e-20
2170 r=sqr(xd*xd+yd*yd)
2180 w=atn(yd/xd)
2190 ifxd>0andyd<0thenw=w+~*2:goto2210
2200 ifxd<0thenw=w+~
2210 w=w+w1
2220 y1(i)=sin(w)*r:x1(i)=cos(w)*r
2230 next
2240 :
2250 ifw2=0then2370
2260 fori=1toa1
2270 zd=z1(i):yd=y1(i)
2280 ifzd=0thenzd=1e-20
2285 ifyd=0thenyd=1e-20
2290 r=sqr(zd*zd+yd*yd)
2300 w=atn(yd/zd)
2310 ifzd>0andyd<0thenw=w+~*2:goto2330
2320 ifzd<0thenw=w+~
2330 w=w+w2
2340 y1(i)=sin(w)*r:z1(i)=cos(w)*r
2350 next
2360 :
2370 ifw3=0then2510
2380 fori=1toa1
2390 zd=z1(i):xd=x1(i)
2400 ifzd=0thenzd=1e-20
2405 ifxd=0thenxd=1e-20
2410 r=sqr(zd*zd+xd*xd)
2420 w=atn(xd/zd)
2430 ifzd>0andxd<0thenw=w+~*2:goto2450
2440 ifzd<0thenw=w+~
2450 w=w+w3
2460 x1(i)=sin(w)*r:z1(i)=cos(w)*r
2470 next
2480 :
2490 rem --- umrechnen ---
2500 :
2510 fori=1toa1
2530 x1(i)=(x1(i)+x2)*1.01^(z1(i)+z2)
2540 y1(i)=(y1(i)+y2)*1.01^(z1(i)+z2)
2560 next
2565 rem 1.01 kann leicht geaendert
2567 rem werden
2580 :
2590 pa=0:pb=199
2600 po=po-2
2601 rem -----------------------------
2602 rem --- ubergetretene linien  ---
2603 rem --- berechnen und poken   ---
2604 rem -----------------------------
2610 fori=1toa2
2620 x0%=x1(p1(i)):y1%=y1(p1(i))
2630 x2%=x1(p2(i)):y2%=y1(p2(i))
2640 x1%=0:x3%=0:me=0
2641 ifx0%> 159andx2%> 159then2760
2642 ifx0%<-159andx2%<-159then2760
2643 ify1%<- 99andy2%<- 99then2760
2644 ify1%>  99andy2%>  99then2760
2650 ify1%=y2%then2711
2655 ifx2%=x0%then2690
2660 m=(y2%-y1%)/(x2%-x0%)
2670 b=-m*x0%+y1%
2680 goto2720
2690 ify1%>99ory1%<-99theny1%=99*sgn(y1%)
2700 ify2%>99ory2%<-99theny2%=99*sgn(y2%)
2710 goto 2760
2711 ifx0%>159orx0%<-159thenx0%=159*sgn(x0%)
2712 ifx2%>159orx2%<-159thenx2%=159*sgn(x2%)
2713 goto 2760
2720 ifx0%>159orx0%<-159thenx0%=159*sgn(x0%):y1%=m*x0%+b
2730 ifx2%>159orx2%<-159thenx2%=159*sgn(x2%):y2%=m*x2%+b
2740 ify1%>99ory1%<-99theny1%=99*sgn(y1%):x0%=(y1%-b)/m
2750 ify2%>99ory2%<-99theny2%=99*sgn(y2%):x2%=(y2%-b)/m
2760 ify1%>99ory1%<-99thenx1%=255:x0%=0:y1%=0:y2%=0:x2%=0:goto2810
2770 ifx0%>159orx0%<-159thenx1%=255:x0%=0:y1%=0:y2%=0:x2%=0:goto2810
2780 :
2790 x0%=x0%+160:x2%=x2%+160
2791 y1%=y1%+100:y2%=y2%+100
2793 ify1%>pathenpa=y1%
2794 ify2%>pathenpa=y2%
2795 ify1%<pbthenpb=y1%
2796 ify2%<pbthenpb=y2%
2799 ifx0%>255thenx0%=x0%-256:x1%=1
2800 ifx2%>255thenx2%=x2%-256:x3%=1
2805 :
2810 pokepo,x0%:pokepo-1,x1%
2820 pokepo-2,y1%:pokepo-3,x2%
2830 pokepo-4,x3%:pokepo-5,y2%
2840 po=po-6
2850 next
2860 :
2862 ifpa<pbthenpa=199:pb=0
2863 pa=40*((paor7)+1)/256+1
2864 pb=40*(pband248)/256
2866 poke po+6*a2+2,int(p1)-int(p3)
2868 poke po+6*a2+1,p3
2870 p1=p2:p2=pa:p3=p4:p4=pb
2872 printchr$(19)spc(16)q
2880 return
2890 :
2900 :
3000 rem ---------------
3010 rem --- bewegen ---
3020 rem ---------------
3030 :
3040 ife=0then3100
3050 w1=w1+wz:w2=w2+wx:w3=w3+wy
3060 x1=x1+xa:y1=y1+ya:z1=z1+za
3070 x2=x2+xb:y2=y2+yb:z2=z2+zb
3080 e=e-1:return
3090 :
3100 read xa,ya,za,wx,wy,wz,xb,yb,zb,e
3110 wx=wx*~/180:wy=wy*~/180
3120 wz=wz*~/180:ya=-ya:yb=-yb
3130 goto3050
3140 :
3150 :
4000 rem ----------------
4010 rem --- einlesen ---
4020 rem ----------------
4030 :
4040 i=0
4050 i=i+1
4060 read x(i),y(i),z(i)
4070 y(i)=-y(i)
4080 ifx(i)<1000then4050
4090 a1=i-1
4100 i=0
4110 i=i+1
4120 read p1(i),p2(i)
4130 ifp1(i)<1000then4110
4140 a2=i-1
4150 :
4155 an=0
4157 reada:ifa=1000then4180
4160 fori=1to9:reada:next
4170 an=an+a:goto4157
4180 restore
4190 reada,a,a
4200 ifa<1000then4190
4210 reada,a
4220 ifa<1000then4210
4230 :
4240 printchr$(147)"bilderzahl  "an
4250 printchr$(19)spc(11);:input i
4260 ifi>255ori>anthen4240
4270 an=i
4280 return
4290 :
4300 :
4500 rem -----------------
4510 rem --- variablen ---
4520 rem -----------------
4530 :
4533 rem nach bedarf dimensionieren
4536 :
4540 dim x(50),y(50),z(50)
4560 dim x1(50),y1(50),z1(50)
4570 dim p1(50),p2(50)
4580 po=35839:p1=32:p2=32:p3=0:p4=0
4590 return
4600 :
4605 :
5000 rem -----------------
5010 rem --- abspielen ---
5020 rem -----------------
5030 :
5040 ifq>0anda2>0then5090
5050 printchr$(147):print:print:print
5060 printspc(5)"es gibt keine grafik"
5070 poke198,0:wait198,1:poke198,0
5080 return
5090 input"{clr}wievile durchlauefe";du
5091 ifdu>255ordu<1then5090
5092 print"{home}{down}{down}wieviele bilder     "q
5093 print"{up}"spc(19);:inputi
5094 ifi>qori<1then5092
5100 :
5105 sys49152,i,a2,du:return
5110 :
6000 rem -------------
6010 rem --- laden ---
6020 rem -------------
6030 :
6040 printchr$(147):print:print:print:print
6050 input"   filename: ";na$
6055 ifna$="m"thenreturn
6060 open2,8,2,na$+".gra,s,r"
6070 open1,8,15:input#1,fe$
6080 iffe$="00"then6090
6082 close1:close2:goto6040
6090 get#2,q$,a2$
6100 q=asc(q$):a2=asc(a2$)
6110 ad=35839-q*(a2*6+2)
6140 close2:close1
6150 ah=int(ad/256):al=ad-ah*256
6160 a$=na$+".gra,s"
6170 fori=51000to51000+len(a$)-1
6180 pokei,asc(mid$(a$,i-50999,1))
6190 next
6200 poke183,len(a$)
6210 poke187,56:poke188,199
6220 poke185,0:poke186,8:poke147,0
6570 poke195,al:poke196,ah
6580 sys62648
6590 return
6600 :
6610 :
6620 :
7000 rem -------------------
7010 rem --- abspeichern ---
7020 rem -------------------
7030 :
7040 ifq>0anda2>0then7090
7050 printchr$(147):print:print:print
7060 printspc(5)"es gibt keine grafik"
7070 poke198,0:wait198,1:poke198,0
7080 return
7090 printchr$(147):print:print:print
7100 input"    filename: ";na$
7105 ifna$="m"thenreturn
7110 open2,8,2,na$+".gra,s,w"
7120 open1,8,15:input#1,fe$
7130 iffe$="00"then7140
7135 close1:close2:goto7090
7140 print#2,chr$(q);chr$(a2);
7150 fori=35839-q*(a2*6+2)to35839
7160 print#2,chr$(peek(i));:next
7170 close2:close1:return
7175 :
7180 :
7185 :
8000 rem -------------------------
8010 rem --- datas fuer punkte ---
8020 rem -------------------------
8030 :
8040 data -20, 10,0
8050 data -30, 10,0
8060 data -30,-10,0
8070 data -20,-10,0
8080 data -20,  0,0
8090 data -30,  0,0
8100 data -15, 10,0
8110 data -15,  0,0
8120 data - 5, 10,0
8130 data - 5,  0,0
8140 data - 5,-10,0
8150 data  10, 10,0
8160 data   5,  5,0
8170 data  15,-10,0
8180 data   5,-10,0
8190 data   5,  0,0
8200 data  15,  0,0
8210 data  15, -5,0
8220 data   5, -5,0
8230 data  20,-10,0
8240 data  20,  0,0
8250 data  20, -5,0
8260 data  30,  0,0
8900 data 1000,1000,1000
8910 :
9000 rem ----------------------------
9010 rem --- verbindungsvoschrift ---
9020 rem ----------------------------
9030 :
9040 data  1, 2,  2, 3,  3, 4,  4, 5
9050 data  5, 6,  7, 8,  8,10,  9,11
9060 data 12,13, 14,15, 15,16, 16,17
9070 data 17,18, 18,19, 20,21, 22,23
9450 data 1000,1000
9460 :
9500 rem --------------------------
9510 rem --- bewegungsvoschrift ---
9520 rem --------------------------
9530 :
9531 rem xa,ya,za,wx,wy,wz,xb,yb,zb,e
9550 data 0,0,  1 ,0,0,0 ,0,0,  0 ,30
9560 data 0,0,  0 ,0,5,0 ,0,0,  0 ,108
9570 data 0,0,-30 ,0,0,0 ,0,0,-30 ,1
9580 data 0,0,  0 ,5,0,5 ,0,0,.81 ,36
9620 data 1000
 100 REM ----------------------------- 
 105 REM -- 3D-MOVIE-MAKER          -- 
 110 REM -- EIN PROGRAMM VON:       -- 
 115 REM -- DIRK & ARMIN BIERNACZYK -- 
 120 REM -- AN DER PAPENBURG 41     -- 
 125 REM -- 4630 BOCHUM 6           -- 
 130 REM -- TEL.: //////            -- 
 135 REM ----------------------------- 
 140 REM (C) 1985 BY ARMIN & DIRK 
 145 REM             BIERNACZYK 
 150 : 
 160 REM ------------------ 
 170 REM --- HAUPTMENUE --- 
 180 REM ------------------ 
 190 : 
 191 IF A=0 THENA=1:LOAD "TRICK.OBJ",8,1 
 192 : 
 195 POKE 56,50:CLR :REM SPEICHER HERAB. 
 200 PRINTCHR$ (147) 
 210 PRINTSPC( 10)"** 3D-MOVIE-MAKER **" 
 220 PRINT:PRINT:PRINT:PRINT 
 230 PRINTSPC( 9)"1 - GRAFIK ERSTELLEN" 
 235 PRINT 
 240 PRINTSPC( 9)"2 - GRAFIK ABSPIELEN" 
 245 PRINT 
 250 PRINTSPC( 9)"3 - GRAFIK LADEN" 
 255 PRINT 
 260 PRINTSPC( 9)"4 - GRAFIK ABSPEICHERN" 
 262 PRINT 
 264 PRINTSPC( 9)"5 - ENDE" 
 265 : 
 270 GET W$:IF W$<"1"OR W$>"5" THEN270 
 280 W=VAL (W$) 
 285 IF W=5 THENEND 
 290 ON WGOSUB 1040,5040,6040,7040 
 300 GOTO 200 
 310 : 
 315 : 
 320 : 
 1000 REM ----------------- 
 1010 REM --- ERSTELLEN --- 
 1020 REM ----------------- 
 1030 : 
 1040 GOSUB 4540   :REM VARIABLEN 
 1050 GOSUB 4040   :REM EINLESEN 
 1060 PRINTCHR$ (147)"FERTIGE BILDER: " 
 1061 IF AN*(A2*6+2)<23000 THEN1080 
 1062 PRINT"ZU WENIG SPEICHERPLATZ" 
 1063 POKE 198,0:WAIT 198,1:RETURN 
 1070 : 
 1080 FOR Q=1 TOAN  :REM ANZAHL DER BILDER 
 1085 GOSUB 3040   :REM BEWEGEN 
 1090 GOSUB 2040   :REM BERECHNEN 
 1095 GET TA$:IF TA$=" " THENIF Q>1 THENSYS 49152,Q-1,A2,1 
 1100 NEXT 
 1110 Q=Q-1 
 1120 RETURN 
 1130 : 
 1135 : 
 2000 REM ----------------- 
 2010 REM --- BERECHNEN --- 
 2020 REM ----------------- 
 2030 : 
 2040 REM --- VERSCHIEBEN1 --- 
 2050 : 
 2060 FOR I=1 TOA1 
 2070 X1(I)=X(I)+X1:Y1(I)=Y(I)+Y1 
 2080 Z1(I)=Z(I)+Z1 
 2090 NEXT 
 2100 : 
 2110 REM --- DREHEN --- 
 2120 : 
 2130 IF W1=0 THEN2250 
 2140 FOR I=1 TOA1 
 2150 XD=X1(I):YD=Y1(I) 
 2160 IF XD=0 THENXD=1E-20 
 2165 IF YD=0 THENYD=1E-20 
 2170 R=SQR (XD*XD+YD*YD) 
 2180 W=ATN (YD/XD) 
 2190 IF XD>0AND YD<0 THENW=W+π*2:GOTO 2210 
 2200 IF XD<0 THENW=W+π 
 2210 W=W+W1 
 2220 Y1(I)=SIN (W)*R:X1(I)=COS (W)*R 
 2230 NEXT 
 2240 : 
 2250 IF W2=0 THEN2370 
 2260 FOR I=1 TOA1 
 2270 ZD=Z1(I):YD=Y1(I) 
 2280 IF ZD=0 THENZD=1E-20 
 2285 IF YD=0 THENYD=1E-20 
 2290 R=SQR (ZD*ZD+YD*YD) 
 2300 W=ATN (YD/ZD) 
 2310 IF ZD>0AND YD<0 THENW=W+π*2:GOTO 2330 
 2320 IF ZD<0 THENW=W+π 
 2330 W=W+W2 
 2340 Y1(I)=SIN (W)*R:Z1(I)=COS (W)*R 
 2350 NEXT 
 2360 : 
 2370 IF W3=0 THEN2510 
 2380 FOR I=1 TOA1 
 2390 ZD=Z1(I):XD=X1(I) 
 2400 IF ZD=0 THENZD=1E-20 
 2405 IF XD=0 THENXD=1E-20 
 2410 R=SQR (ZD*ZD+XD*XD) 
 2420 W=ATN (XD/ZD) 
 2430 IF ZD>0AND XD<0 THENW=W+π*2:GOTO 2450 
 2440 IF ZD<0 THENW=W+π 
 2450 W=W+W3 
 2460 X1(I)=SIN (W)*R:Z1(I)=COS (W)*R 
 2470 NEXT 
 2480 : 
 2490 REM --- UMRECHNEN --- 
 2500 : 
 2510 FOR I=1 TOA1 
 2530 X1(I)=(X1(I)+X2)*1.01^(Z1(I)+Z2) 
 2540 Y1(I)=(Y1(I)+Y2)*1.01^(Z1(I)+Z2) 
 2560 NEXT 
 2565 REM 1.01 KANN LEICHT GEAENDERT 
 2567 REM WERDEN 
 2580 : 
 2590 PA=0:PB=199 
 2600 PO=PO-2 
 2601 REM ----------------------------- 
 2602 REM --- UBERGETRETENE LINIEN  --- 
 2603 REM --- BERECHNEN UND POKEN   --- 
 2604 REM ----------------------------- 
 2610 FOR I=1 TOA2 
 2620 X0%=X1(P1(I)):Y1%=Y1(P1(I)) 
 2630 X2%=X1(P2(I)):Y2%=Y1(P2(I)) 
 2640 X1%=0:X3%=0:ME=0 
 2641 IF X0%> 159AND X2%> 159 THEN2760 
 2642 IF X0%<-159AND X2%<-159 THEN2760 
 2643 IF Y1%<- 99AND Y2%<- 99 THEN2760 
 2644 IF Y1%>  99AND Y2%>  99 THEN2760 
 2650 IF Y1%=Y2% THEN2711 
 2655 IF X2%=X0% THEN2690 
 2660 M=(Y2%-Y1%)/(X2%-X0%) 
 2670 B=-M*X0%+Y1% 
 2680 GOTO 2720 
 2690 IF Y1%>99OR Y1%<-99 THENY1%=99*SGN (Y1%) 
 2700 IF Y2%>99OR Y2%<-99 THENY2%=99*SGN (Y2%) 
 2710 GOTO 2760 
 2711 IF X0%>159OR X0%<-159 THENX0%=159*SGN (X0%) 
 2712 IF X2%>159OR X2%<-159 THENX2%=159*SGN (X2%) 
 2713 GOTO 2760 
 2720 IF X0%>159OR X0%<-159 THENX0%=159*SGN (X0%):Y1%=M*X0%+B 
 2730 IF X2%>159OR X2%<-159 THENX2%=159*SGN (X2%):Y2%=M*X2%+B 
 2740 IF Y1%>99OR Y1%<-99 THENY1%=99*SGN (Y1%):X0%=(Y1%-B)/M 
 2750 IF Y2%>99OR Y2%<-99 THENY2%=99*SGN (Y2%):X2%=(Y2%-B)/M 
 2760 IF Y1%>99OR Y1%<-99 THENX1%=255:X0%=0:Y1%=0:Y2%=0:X2%=0:GOTO 2810 
 2770 IF X0%>159OR X0%<-159 THENX1%=255:X0%=0:Y1%=0:Y2%=0:X2%=0:GOTO 2810 
 2780 : 
 2790 X0%=X0%+160:X2%=X2%+160 
 2791 Y1%=Y1%+100:Y2%=Y2%+100 
 2793 IF Y1%>PA THENPA=Y1% 
 2794 IF Y2%>PA THENPA=Y2% 
 2795 IF Y1%<PB THENPB=Y1% 
 2796 IF Y2%<PB THENPB=Y2% 
 2799 IF X0%>255 THENX0%=X0%-256:X1%=1 
 2800 IF X2%>255 THENX2%=X2%-256:X3%=1 
 2805 : 
 2810 POKE PO,X0%:POKE PO-1,X1% 
 2820 POKE PO-2,Y1%:POKE PO-3,X2% 
 2830 POKE PO-4,X3%:POKE PO-5,Y2% 
 2840 PO=PO-6 
 2850 NEXT 
 2860 : 
 2862 IF PA<PB THENPA=199:PB=0 
 2863 PA=40*((PAOR 7)+1)/256+1 
 2864 PB=40*(PBAND 248)/256 
 2866 POKE PO+6*A2+2,INT (P1)-INT (P3) 
 2868 POKE PO+6*A2+1,P3 
 2870 P1=P2:P2=PA:P3=P4:P4=PB 
 2872 PRINTCHR$ (19)SPC( 16)Q 
 2880 RETURN 
 2890 : 
 2900 : 
 3000 REM --------------- 
 3010 REM --- BEWEGEN --- 
 3020 REM --------------- 
 3030 : 
 3040 IF E=0 THEN3100 
 3050 W1=W1+WZ:W2=W2+WX:W3=W3+WY 
 3060 X1=X1+XA:Y1=Y1+YA:Z1=Z1+ZA 
 3070 X2=X2+XB:Y2=Y2+YB:Z2=Z2+ZB 
 3080 E=E-1:RETURN 
 3090 : 
 3100 READ XA,YA,ZA,WX,WY,WZ,XB,YB,ZB,E 
 3110 WX=WX*π/180:WY=WY*π/180 
 3120 WZ=WZ*π/180:YA=-YA:YB=-YB 
 3130 GOTO 3050 
 3140 : 
 3150 : 
 4000 REM ---------------- 
 4010 REM --- EINLESEN --- 
 4020 REM ---------------- 
 4030 : 
 4040 I=0 
 4050 I=I+1 
 4060 READ X(I),Y(I),Z(I) 
 4070 Y(I)=-Y(I) 
 4080 IF X(I)<1000 THEN4050 
 4090 A1=I-1 
 4100 I=0 
 4110 I=I+1 
 4120 READ P1(I),P2(I) 
 4130 IF P1(I)<1000 THEN4110 
 4140 A2=I-1 
 4150 : 
 4155 AN=0 
 4157 READ A:IF A=1000 THEN4180 
 4160 FOR I=1 TO9:READ A:NEXT 
 4170 AN=AN+A:GOTO 4157 
 4180 RESTORE 
 4190 READ A,A,A 
 4200 IF A<1000 THEN4190 
 4210 READ A,A 
 4220 IF A<1000 THEN4210 
 4230 : 
 4240 PRINTCHR$ (147)"BILDERZAHL{2SPACE}"AN 
 4250 PRINTCHR$ (19)SPC( 11);:INPUT I 
 4260 IF I>255OR I>AN THEN4240 
 4270 AN=I 
 4280 RETURN 
 4290 : 
 4300 : 
 4500 REM ----------------- 
 4510 REM --- VARIABLEN --- 
 4520 REM ----------------- 
 4530 : 
 4533 REM NACH BEDARF DIMENSIONIEREN 
 4536 : 
 4540 DIM X(50),Y(50),Z(50) 
 4560 DIM X1(50),Y1(50),Z1(50) 
 4570 DIM P1(50),P2(50) 
 4580 PO=35839:P1=32:P2=32:P3=0:P4=0 
 4590 RETURN 
 4600 : 
 4605 : 
 5000 REM ----------------- 
 5010 REM --- ABSPIELEN --- 
 5020 REM ----------------- 
 5030 : 
 5040 IF Q>0AND A2>0 THEN5090 
 5050 PRINTCHR$ (147):PRINT:PRINT:PRINT 
 5060 PRINTSPC( 5)"ES GIBT KEINE GRAFIK" 
 5070 POKE 198,0:WAIT 198,1:POKE 198,0 
 5080 RETURN 
 5090 INPUT"{CLR}WIEVILE DURCHLAUEFE";DU 
 5091 IF DU>255OR DU<1 THEN5090 
 5092 PRINT"{HOME,2DOWN}WIEVIELE BILDER{5SPACE}"Q 
 5093 PRINT"{UP}"SPC( 19);:INPUTI 
 5094 IF I>QOR I<1 THEN5092 
 5100 : 
 5105 SYS 49152,I,A2,DU:RETURN 
 5110 : 
 6000 REM ------------- 
 6010 REM --- LADEN --- 
 6020 REM ------------- 
 6030 : 
 6040 PRINTCHR$ (147):PRINT:PRINT:PRINT:PRINT 
 6050 INPUT"{3SPACE}FILENAME: ";NA$ 
 6055 IF NA$="M" THENRETURN 
 6060 OPEN 2,8,2,NA$+".GRA,S,R" 
 6070 OPEN 1,8,15:INPUT#1,FE$ 
 6080 IF FE$="00" THEN6090 
 6082 CLOSE 1:CLOSE 2:GOTO 6040 
 6090 GET #2,Q$,A2$ 
 6100 Q=ASC (Q$):A2=ASC (A2$) 
 6110 AD=35839-Q*(A2*6+2) 
 6140 CLOSE 2:CLOSE 1 
 6150 AH=INT (AD/256):AL=AD-AH*256 
 6160 A$=NA$+".GRA,S" 
 6170 FOR I=51000 TO51000+LEN (A$)-1 
 6180 POKE I,ASC (MID$ (A$,I-50999,1)) 
 6190 NEXT 
 6200 POKE 183,LEN (A$) 
 6210 POKE 187,56:POKE 188,199 
 6220 POKE 185,0:POKE 186,8:POKE 147,0 
 6570 POKE 195,AL:POKE 196,AH 
 6580 SYS 62648 
 6590 RETURN 
 6600 : 
 6610 : 
 6620 : 
 7000 REM ------------------- 
 7010 REM --- ABSPEICHERN --- 
 7020 REM ------------------- 
 7030 : 
 7040 IF Q>0AND A2>0 THEN7090 
 7050 PRINTCHR$ (147):PRINT:PRINT:PRINT 
 7060 PRINTSPC( 5)"ES GIBT KEINE GRAFIK" 
 7070 POKE 198,0:WAIT 198,1:POKE 198,0 
 7080 RETURN 
 7090 PRINTCHR$ (147):PRINT:PRINT:PRINT 
 7100 INPUT"{4SPACE}FILENAME: ";NA$ 
 7105 IF NA$="M" THENRETURN 
 7110 OPEN 2,8,2,NA$+".GRA,S,W" 
 7120 OPEN 1,8,15:INPUT#1,FE$ 
 7130 IF FE$="00" THEN7140 
 7135 CLOSE 1:CLOSE 2:GOTO 7090 
 7140 PRINT#2,CHR$ (Q);CHR$ (A2); 
 7150 FOR I=35839-Q*(A2*6+2) TO35839 
 7160 PRINT#2,CHR$ (PEEK (I));:NEXT 
 7170 CLOSE 2:CLOSE 1:RETURN 
 7175 : 
 7180 : 
 7185 : 
 8000 REM ------------------------- 
 8010 REM --- DATAS FUER PUNKTE --- 
 8020 REM ------------------------- 
 8030 : 
 8040 DATA -20, 10,0 
 8050 DATA -30, 10,0 
 8060 DATA -30,-10,0 
 8070 DATA -20,-10,0 
 8080 DATA -20,  0,0 
 8090 DATA -30,  0,0 
 8100 DATA -15, 10,0 
 8110 DATA -15,  0,0 
 8120 DATA - 5, 10,0 
 8130 DATA - 5,  0,0 
 8140 DATA - 5,-10,0 
 8150 DATA  10, 10,0 
 8160 DATA   5,  5,0 
 8170 DATA  15,-10,0 
 8180 DATA   5,-10,0 
 8190 DATA   5,  0,0 
 8200 DATA  15,  0,0 
 8210 DATA  15, -5,0 
 8220 DATA   5, -5,0 
 8230 DATA  20,-10,0 
 8240 DATA  20,  0,0 
 8250 DATA  20, -5,0 
 8260 DATA  30,  0,0 
 8900 DATA 1000,1000,1000 
 8910 : 
 9000 REM ---------------------------- 
 9010 REM --- VERBINDUNGSVOSCHRIFT --- 
 9020 REM ---------------------------- 
 9030 : 
 9040 DATA  1, 2,  2, 3,  3, 4,  4, 5 
 9050 DATA  5, 6,  7, 8,  8,10,  9,11 
 9060 DATA 12,13, 14,15, 15,16, 16,17 
 9070 DATA 17,18, 18,19, 20,21, 22,23 
 9450 DATA 1000,1000 
 9460 : 
 9500 REM -------------------------- 
 9510 REM --- BEWEGUNGSVOSCHRIFT --- 
 9520 REM -------------------------- 
 9530 : 
 9531 REM XA,YA,ZA,WX,WY,WZ,XB,YB,ZB,E 
 9550 DATA 0,0,  1 ,0,0,0 ,0,0,  0 ,30 
 9560 DATA 0,0,  0 ,0,5,0 ,0,0,  0 ,108 
 9570 DATA 0,0,-30 ,0,0,0 ,0,0,-30 ,1 
 9580 DATA 0,0,  0 ,5,0,5 ,0,0,.81 ,36 
 9620 DATA 1000 
Listing »3D-Movie-Maker«. Beachten Sie bitte bei der Eingabe den Checksummer 64.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →