CLS : KEY OFF: RANDOMIZE TIMER SCREEN 7, , 0, 1: WINDOW SCREEN (0, 0)-(319, 199) PRINT "AUTO CARROSSERIE - even geduld a.u.b." ' ' === declare array's ' DIM X(44), Y(44), Z(44) AS INTEGER ' coordinates of 44 points DIM SP(44), ZE(44) ' screen coordinates DIM K(27, 6) AS INTEGER ' 27 faces with a maximum of 6 edges DIM L(27) AS INTEGER ' ??? ' ' === read all points ' PRINT : PRINT "Reading points:" FOR I% = 1 TO 44: READ X(I%), Y(I%), Z(I%) X(I%) = X(I%) - 30: Y(I%) = Y(I%) - 130: Z(I%) = Z(I%) - 50'adjust for middle point LOCATE CSRLIN, 1: PRINT "Busy with"; I%; "of 44..."; NEXT: PRINT ' the faces PRINT : PRINT "Reading faces:" FOR I% = 1 TO 27 READ L(I%) FOR J% = 1 TO L(I%): READ K(I%, J%): NEXT LOCATE CSRLIN, 1: PRINT "Busy with"; I%; "of 27..."; NEXT: PRINT PRINT : PRINT "Busy calculating the first picture..." ' ' === starting values PI = 4 * ATN(1)' constant pi (pi) ALPHA = 0 ' rotation around the x-axis BETA = 90 ' rotation around the y-axis GAMMA = 45 ' rotation around the z-axis VX = -15 ' horizontal shift VY = -1000 ' shift in viewing direction VZ = 0 ' vertical shift K = 10 ' some factor D = 70 ' distance viewer/monitor page% = 0 410 ' === calculate drawing ' calculate coefficients WA = ALPHA * .0174533 CA = COS(WA): SA = SIN(WA) WB = BETA * .0174533 CB = COS(WB): SB = SIN(WB) WC = GAMMA * .0174533 CC = COS(WC): SC = SIN(WC) FOR I% = 1 TO 44 X = X(I%): Y = Y(I%): Z = Z(I%) GOSUB 750 ' projection of point SP(I%) = SP: ZE(I%) = ZE NEXT CLS ' === draw FOR I% = 1 TO 27 FOR J% = 1 TO L(I%) - 1 LINE (SP(K(I%, J%)), ZE(K(I%, J%)))-(SP(K(I%, J% + 1)), ZE(K(I%, J% + 1))), 7 NEXT NEXT SCREEN , , 1 - page%, page% DO: LOOP UNTIL (INP(986) AND 8) ' wait for screen sync page% = 1 - page% ' change angles ALPHA = (ALPHA + 1) MOD 360 ' rotation around the x-axis BETA = (BETA + 2) MOD 360 GAMMA = (GAMMA + 3) MOD 360 IF INKEY$ = CHR$(27) THEN SCREEN 2: SCREEN 0, , 0, 0: END ELSE GOTO 410 750 ' === subroutine 'projection of a point' ' rotation around x-axis X1 = X Y1 = CA * Y - SA * Z Z1 = SA * Y + CA * Z ' rotation around y-axis X2 = CB * X1 - SB * Z1 Y2 = Y1 Z2 = SB * X1 + CB * Z1 ' rotation around z-axis X3 = CC * X2 - SC * Y2 Y3 = SC * X2 + CC * Y2 Z3 = Z2 ' shift X4 = X3 + VX Y4 = Y3 + VY Z4 = Z3 + VZ ' projection onto viewing plane U = -X4 / Y4 * D V = -Z4 / Y4 * D ' convert to screen coordinates SP = K * U + 160 IF SP < 0 THEN SP = 0 ELSE IF SP > 319 THEN SP = 319 ZE = K * V + 100 IF ZE < 0 THEN ZE = 0 ELSE IF ZE > 199 THEN ZE = 199 RETURN ' === data ' vertices DATA 20,260,20,30,240,22,30,240,82 DATA 20,260,80,36,140,15,35,165,20 DATA 35,165,80,36,140,85,30,140,87 DATA 19,140,97,0,140,85,0,245,82 DATA 10,260,80,18,240,90,30,140,17 DATA 19,140,3,18,240,10,0,245,18 DATA 10,260,20,33,70,82,38,70,80 DATA 39,44,92,20,70,100,0,70,87 DATA 40,10,90,22,4,92,21,18,93 DATA 0,10,90,10,1,90,33,70,8 DATA 20,70,0,39,44,22,38,70,20 DATA 58,50,20,40,10,10,22,4,9 DATA 21,18,7,0,140,15,0,70,13 DATA 0,10,10,10,0,10,58,50,80 DATA 60,110,75,60,110,25 ' faces DATA 4,1,2,3,4 DATA 6,2,5,6,7,8,3 DATA 6,3,8,9,10,14,4 DATA 6,14,10,11,12,13,4 DATA 6,1,17,16,15,5,2 DATA 4,13,12,18,19 DATA 4,19,1,4,13 DATA 4,9,22,23,10 DATA 4,10,23,24,11 DATA 4,16,31,32,15 DATA 4,16,31,39,38 DATA 5,23,22,25,26,27 DATA 5,27,28,24,23,27 DATA 5,35,32,31,37,36 DATA 4,31,39,40,37 DATA 4,27,26,29,28 DATA 5,1,17,16,38,18 DATA 4,25,35,36,26 DATA 4,29,41,40,28 DATA 4,37,36,41,40 DATA 4,6,44,43,7 DATA 3,6,5,44 DATA 4,44,34,42,43 DATA 3,7,43,8 DATA 4,25,42,34,35 DATA 2,42,22 DATA 2,34,32 DATA 0