/*-L*/ /*********************************************************************/ /*********************************************************************/ /*** ***/ /*** MOVIE MAKER ***/ /*** ============= ***/ /*** ***/ /*** Autor: Clemens Dietl ***/ /*** Am Baerenbach 17 ***/ /*** 8265 Neuoetting ***/ /*** ***/ /*** ------------------------------------------------------------- ***/ /*** Anleitung: ***/ /*** ***/ /*** Das Programm holt sich die benoetigen Informationen aus ***/ /*** dem Editorfile ED.PARAM . ***/ /*** ***/ /*** Dieses File muss folgendemassen aufgebaut sein: ***/ /*** ***/ /*** 1. KOORDINATEN: ***/ /*** - je 3 Zahlen pro Koordinate (X, Y und Z) ***/ /*** - Ende des Koordinatenblocks: 3 mal '1000' ***/ /*** ***/ /*** 2. VERBINDUNGSVORSCHRIFT: ***/ /*** - je 2 Zahlen (Nummern der beiden Punkte, zwischen ***/ /*** denen ein Linie gezogen werden soll (von 1 bis ..)) ***/ /*** - Ende dieses Blocks: 2 mal '-1' ***/ /*** ***/ /*** 3. BEWEGUNGSVORSCHRIFT: ***/ /*** - je 13 (dreizehn !) Zahlen ***/ /*** - die ersten 3 Zahlen geben einen beliebigen Punkt im ***/ /*** Raum an (X,Y,Z) ***/ /*** - die zweiten 3 Zahlen bestimmen je den Drehwinkel in ***/ /*** X-, Y- und Z-Richtung, bezogen auf den oben be- ***/ /*** schriebenen Punkt ***/ /*** - die naechsten 3 Werte besagen das Gleiche, jedoch ***/ /*** bezogen auf den Mittelpunkt des Koerpers ! ***/ /*** - danach kommen 3 Zahlen, die die Verschiebung des ***/ /*** Koerpers entlang den 3 Achsen festlegen ***/ /*** - die letzte Zahl bestimmt die Zahl der Bilder, in ***/ /*** der die oben beschriebene Bewegung berechnet werden ***/ /*** soll ***/ /*** - Ende des Blocks: 1 mal '1000' ***/ /*** ***/ /*** Tip: Man studiere eingehend die mitgelieferten Demo- ***/ /*** Parameterfiles und die von ihnen erzeugten Filme ! ***/ /*** ***/ /*** ***/ /*** PS.: Die einzelnen Zahlen werden mit Kommata getrennt ! ***/ /*** PPS.: Der Ursprung des Koordinatensystems liegt im ***/ /*** Bildschirmmittelpunkt, die X-Achse 'zeigt' nach ***/ /*** rechts, die Y-Achse nach oben und die Z-Achse ***/ /*** in die Bildschirmebene hinein ! ***/ /*** PPPS.:Manchmal tritt waehrend des Programmlaufes verein- ***/ /*** zelt oder gehaeuft der Fehler ***/ /*** START:INTRPT MOT SUSPENDED (CONTINUE) ***/ /*** auf ! Ich weiss nicht genau, woher dies ruert und ***/ /*** konnte es daher auch nicht abstellen, aber da ***/ /*** solches nicht uebermaessig stoert, sollte man es ***/ /*** am Besten ignorieren ! ***/ /*** ***/ /*********************************************************************/ /*********************************************************************/ /*+B*/ /*+T*/ S=22000; MODULE MOVIE; SYSTEM; A1:A1 (NE) <->; XC:XC (NE) ->; FILE:ED.PARAM<-; SYNC: EV(40000000); PROBLEM; SPC A1 DATION INOUT ALPHIC CONTROL(ALL); SPC (SCRSET,SCRCHG,CLEAR) ENTRY GLOBAL; SPC FILE DATION IN ALPHIC CONTROL(ALL); SPC SYNC INTERRUPT; DCL (W,A) FLOAT; DCL (X,Y) FLOAT; DCL XK(100) FLOAT; DCL YK(100) FLOAT; DCL ZK(100) FLOAT; DCL (A1,W1) FLOAT; DCL (XG,YG,ZG) FIXED; DCL (I,KZAHL,KZ) FIXED; DCL V(90,2) FIXED; DCL (V1,V2) FIXED; DCL (VZAHL) FIXED; DCL (PI,UR) FLOAT; DCL (XSUM,YSUM,ZSUM) FIXED; DCL (XP,YP,ZP,WX,WY,WZ,DX,DY,DZ,VX,VY,VZ,BN) FIXED; DCL (EWX,EWY,EWZ,EDX,EDY,EDZ,EVX,EVY,EVZ) FLOAT; DCL LOOP FIXED; DCL FAKT FIXED INIT(250); DCL XF(32700) FIXED; DCL YF(32700) FIXED; DCL POINT FIXED; DCL MARK FIXED; POLKART:PROC ((WW,AA) FLOAT); X=AA*COS(WW); Y=AA*SIN(WW); END; KARTPOL:PROC ((XX,YY) FLOAT); A=SQRT((XX*XX)+(YY*YY)); IF XX == 0 THEN IF YY > 0.0 THEN W=PI/2; ELSE W=PI*1.5; FIN; ELSE W=ATAN(YY/XX); IF XX<0.0 THEN W=W+PI; ELSE IF W<0.0 THEN W=W+(2*PI); FIN; FIN; FIN; END; SHOW:PROC; DCL (XX,YY) FIXED; DCL (X1,Y1,X2,Y2) FIXED; DCL (ZF1,ZF2) FLOAT; FOR AA FROM 1 TO VZAHL REPEAT XX=V(AA,1); YY=V(AA,2); ZF1=ZK(XX)/FAKT+1.0000001; ZF2=ZK(YY)/FAKT+1.0000001; X1=ROUND(XK(XX)/ZF1)+320; Y1=200-ROUND(YK(XX)/ZF1); X2=ROUND(XK(YY)/ZF2)+320; Y2=200-ROUND(YK(YY)/ZF2); CALL LINE(X1,Y1,X2,Y2,1); XF(POINT)=X1; YF(POINT)=Y1; POINT=POINT+1; XF(POINT)=X2; YF(POINT)=Y2; POINT=POINT+1; END; END; MOVE:PROC; IF EWX==0 THEN GOTO MO1; FIN; FOR BB FROM 1 TO KZ REPEAT CALL KARTPOL(ZK(BB)-ZP,YK(BB)-YP); CALL POLKART(W+EWX,A); ZK(BB)=X+ZP; YK(BB)=Y+YP; END; MO1: IF EWY==0 THEN GOTO MO2; FIN; FOR BB FROM 1 TO KZ REPEAT CALL KARTPOL(XK(BB)-XP,ZK(BB)-ZP); CALL POLKART(W+EWY,A); XK(BB)=X+XP; ZK(BB)=Y+ZP; END; MO2: IF EWZ==0 THEN GOTO MO3; FIN; FOR BB FROM 1 TO KZ REPEAT CALL KARTPOL(XK(BB)-XP,YK(BB)-YP); CALL POLKART(W+EWZ,A); XK(BB)=X+XP; YK(BB)=Y+YP; END; MO3: IF EDX==0 THEN GOTO MO4; FIN; FOR BB FROM 1 TO KZAHL REPEAT CALL KARTPOL(ZK(BB)-ZK(KZ),YK(BB)-YK(KZ)); CALL POLKART(W+EDX,A); ZK(BB)=X+ZK(KZ); YK(BB)=Y+YK(KZ); END; MO4: IF EDY==0 THEN GOTO MO5; FIN; FOR BB FROM 1 TO KZAHL REPEAT CALL KARTPOL(XK(BB)-XK(KZ),ZK(BB)-ZK(KZ)); CALL POLKART(W+EDY,A); XK(BB)=X+XK(KZ); ZK(BB)=Y+ZK(KZ); END; MO5: IF EDZ==0 THEN GOTO MO6; FIN; FOR BB FROM 1 TO KZAHL REPEAT CALL KARTPOL(XK(BB)-XK(KZ),YK(BB)-YK(KZ)); CALL POLKART(W+EDZ,A); XK(BB)=X+XK(KZ); YK(BB)=Y+YK(KZ); END; MO6: IF (EVX==0) AND (EVY==0) AND (EVZ==0) THEN GOTO MO7; FIN; FOR BB FROM 1 TO KZ REPEAT XK(BB)=XK(BB)+EVX; YK(BB)=YK(BB)+EVY; ZK(BB)=ZK(BB)+EVZ; END; MO7: END; FILM:PROC; FOR AA FROM 1 TO VZAHL REPEAT; CALL LINE(XF(LOOP),YF(LOOP),XF(LOOP+1),YF(LOOP+1),1); LOOP=LOOP+2; END; END; /******************************************************/ START:TASK PRIO 10; PI = 3.141592653; UR = PI/180; POINT=1; CALL REWIND(FILE); XSUM=0; YSUM=0; ZSUM=0; /***** KOORDINATEN LESEN */ I=0; REPEAT GET XG,YG,ZG FROM FILE BY (3)LIST; IF (XG==1000) OR (YG==1000) OR (ZG==1000) THEN GOTO L1; FIN; XSUM=XSUM+XG; YSUM=YSUM+YG; ZSUM=ZSUM+ZG; I=I+1; XK(I)=TOFLOAT(XG); YK(I)=TOFLOAT(YG); ZK(I)=TOFLOAT(ZG); END; L1: KZAHL=I; KZ=I+1; XK(I+1)=XSUM/I; YK(I+1)=YSUM/I; ZK(I+1)=ZSUM/I; /***** VERBINDUNGSVORSCHRIFT LESEN */ I=0; REPEAT GET V1,V2 FROM FILE BY (2)F(8); IF (V1==-1) OR (V2==-1) THEN GOTO L2; FIN; I=I+1; V(I,1)=V1;V(I,2)=V2; END; L2: VZAHL=I; CALL SCRSET('PIC2'); CALL CLEAR;CALL SHOW;CALL SCRCHG('PIC2'); CALL SCRSET('PIC1'); CALL CLEAR; FOR Q FROM -32000 TO 32000 REPEAT END; CALL SCRCHG('PIC2'); NEXT: GET XP FROM FILE BY F(8); IF XP==1000 THEN GOTO ENDE; FIN; GET YP,ZP,WX,WY,WZ,DX,DY,DZ,VX,VY,VZ,BN FROM FILE BY (12)F(8); EWX=UR*WX/BN; EWY=UR*WY/BN; EWZ=UR*WZ/BN; EDX=UR*DX/BN; EDY=UR*DY/BN; EDZ=UR*DZ/BN; EVX=VX/BN; EVY=VY/BN; EVZ=VZ/BN; LOOP=0; LABEL1:ENABLE SYNC;WHEN SYNC RESUME;DISABLE SYNC; CALL SCRSET('PIC1'); CALL CLEAR;CALL MOVE; CALL SHOW; CALL SCRCHG('PIC1'); LOOP=LOOP+1; IF LOOP==BN THEN GOTO NEXT; FIN; ENABLE SYNC;WHEN SYNC RESUME;DISABLE SYNC; CALL SCRSET('PIC2');CALL MOVE;CALL CLEAR; CALL SHOW; CALL SCRCHG('PIC2'); LOOP=LOOP+1; IF LOOP==BN THEN GOTO NEXT; FIN; GOTO LABEL1; ENDE: MARK=POINT; PUT POINT TO A1 BY F(8),SKIP; LABEL3:LOOP=1; LABEL2:ENABLE SYNC;WHEN SYNC RESUME;DISABLE SYNC; CALL SCRSET('PIC1');CALL CLEAR; CALL FILM; CALL SCRCHG('PIC1'); IF LOOP==MARK THEN GOTO LABEL3; FIN; ENABLE SYNC;WHEN SYNC RESUME;DISABLE SYNC; CALL SCRSET('PIC2');CALL CLEAR; CALL FILM; CALL SCRCHG('PIC2'); IF LOOP==MARK THEN GOTO LABEL3; FIN; GOTO LABEL2; END; MODEND;