Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DIM poly(1000, 10)
- DIM poly2(1000, 11)
- DIM temppoly(10, 11)
- DIM po(2, 3)
- DIM partial.Z.buffer(10, 300, 1)
- DIM v(3, 3)
- DECLARE SUB initializer (coord(), po())
- DECLARE SUB Z.Buffer (poly2(), d, temppoly(), hide, filler, partial.Z.buffer(), v())
- 'Main------------------------------------------------------------------------
- CLS
- initializer poly(), po()
- SCREEN 9: COLOR 3, 0
- VIEW (100, 50)-(400, 250), 0, 9
- WINDOW (-1, 1)-(1, -1)
- pi = 3.141592654#
- mag = 1
- quit = 0
- hide = 1
- filler = 1
- LOCATE 1, 1: PRINT "Enter command."
- DO
- drawing = 0
- SELECT CASE INKEY$
- CASE "x"
- po(1, 1) = po(1, 1) - .5
- drawing = 1
- CASE "X"
- po(1, 1) = po(1, 1) + .5
- drawing = 1
- CASE "y"
- po(1, 2) = po(1, 2) - .5
- drawing = 1
- CASE "Y"
- po(1, 2) = po(1, 2) + .5
- drawing = 1
- CASE "z"
- po(1, 3) = po(1, 3) - .5
- drawing = 1
- CASE "Z"
- po(1, 3) = po(1, 3) + .5
- drawing = 1
- '*************Angles
- CASE "1"
- po(2, 1) = po(2, 1) - .05 * pi
- drawing = 1
- CASE "!"
- po(2, 1) = po(2, 1) + .05 * pi
- drawing = 1
- CASE "2"
- po(2, 2) = po(2, 2) - .05 * pi
- drawing = 1
- CASE "@"
- po(2, 2) = po(2, 2) + .05 * pi
- drawing = 1
- CASE "3"
- po(2, 3) = po(2, 3) - .05 * pi
- drawing = 1
- CASE "#"
- po(2, 3) = po(2, 3) + .05 * pi
- drawing = 1
- CASE "R", "r"
- initializer poly(), po()
- drawing = 1
- CASE "D", "d"
- drawing = 1
- CASE "E", "e"
- LOCATE 1, 1: PRINT SPACE$(25)
- LOCATE 20, 1: INPUT "Viewing coordinates (X,Y,Z): ", po(1, 1), po(1, 2), po(1, 3)
- LOCATE 21, 1: INPUT "Viewing direction vector(é1/pi,é2/pi,é3/pi): ", po(2, 1), po(2, 2), po(2, 3)
- FOR p = 1 TO 3: po(2, p) = po(2, p) * pi: NEXT p
- LOCATE 20, 1: PRINT SPACE$(80)
- LOCATE 21, 1: PRINT SPACE$(80)
- drawing = 1
- CASE "q", "Q"
- quit = 1
- CASE ELSE
- drawing = 0
- END SELECT
- IF drawing THEN
- LOCATE 3, 1: PRINT SPACE$(80)
- FOR lnum = 9 TO 14
- LOCATE lnum, 52: PRINT SPACE$(28)
- NEXT lnum
- LOCATE 3, 1: PRINT "Please wait, busy crunching data..."
- FOR ang = 1 TO 3
- IF po(2, ang) >= 2 * pi THEN po(2, ang) = po(2, ang) - 2 * pi
- IF po(2, ang) < 0 THEN po(2, ang) = po(2, ang) + 2 * pi
- NEXT ang
- LOCATE 1, 70: PRINT "ÛÝ"
- LOCATE 1, 1: PRINT SPACE$(40)
- LOCATE 1, 1: PRINT "("; po(1, 1); ","; po(1, 2); ","; po(1, 3); ")"
- LOCATE 2, 1: PRINT SPACE$(40)
- a1 = po(2, 1) / pi: a2 = po(2, 2) / pi: a3 = po(2, 3) / pi
- LOCATE 2, 1: PRINT "["; a1; ","; a2; ","; a3; "]"
- time1 = TIMER
- polynum = 0
- poly2(0, 0) = polynum
- FOR n = 1 TO poly(0, 0)
- x = poly(n, 1) - po(1, 1): y = poly(n, 2) - po(1, 2): z = poly(n, 3) - po(1, 3)
- X1 = poly(n, 4) - po(1, 1): Y1 = poly(n, 5) - po(1, 2): Z1 = poly(n, 6) - po(1, 3)
- X2 = poly(n, 7) - po(1, 1): Y2 = poly(n, 8) - po(1, 2): Z2 = poly(n, 9) - po(1, 3)
- color1 = poly(n, 10)
- '************X-Y rotation
- IF po(2, 1) <> 0 THEN
- cp = COS(po(2, 1))
- sp = SIN(po(2, 1))
- xt = x * cp - y * sp
- y = x * sp + y * cp
- xt1 = X1 * cp - Y1 * sp
- Y1 = X1 * sp + Y1 * cp
- xt2 = X2 * cp - Y2 * sp
- Y2 = X2 * sp + Y2 * cp
- x = xt: X1 = xt1: X2 = xt2
- END IF
- '**************X-Z rotation
- IF po(2, 2) <> 0 THEN
- cp = COS(po(2, 2))
- sp = SIN(po(2, 2))
- xt = x * cp - z * sp
- z = x * sp + z * cp
- xt1 = X1 * cp - Z1 * sp
- Z1 = X1 * sp + Z1 * cp
- xt2 = X2 * cp - Z2 * sp
- Z2 = X2 * sp + Z2 * cp
- x = xt: X1 = xt1: X2 = xt2
- END IF
- '**************Y-Z rotation
- IF po(2, 3) <> 0 THEN
- cp = COS(po(2, 3))
- sp = SIN(po(2, 3))
- yt = y * cp - z * sp
- z = y * sp + z * cp
- yt1 = Y1 * cp - Z1 * sp
- Z1 = Y1 * sp + Z1 * cp
- yt2 = Y2 * cp - Z2 * sp
- Z2 = Y2 * sp + Z2 * cp
- y = yt: Y1 = yt1: Y2 = yt2
- END IF
- IF ((ABS(y) < (3 * x)) AND (ABS(z) < (3 * x)) AND x >= .25 AND (ABS(Y1) < (3 * X1)) AND (ABS(Z1) < (3 * X1)) AND X1 >= .25 AND (ABS(Y2) < (3 * X2)) AND (ABS(Z2) < (3 * X2)) AND X2 >= .25) THEN
- polynum = polynum + 1
- poly2(polynum, 1) = x: poly2(polynum, 2) = y / x: poly2(polynum, 3) = z / x
- poly2(polynum, 4) = X1: poly2(polynum, 5) = Y1 / X1: poly2(polynum, 6) = Z1 / X1
- poly2(polynum, 7) = X2: poly2(polynum, 8) = Y2 / X2: poly2(polynum, 9) = Z2 / X2
- poly2(polynum, 10) = color1
- d1 = (y ^ 2 + z ^ 2 + x ^ 2) ^ .5
- d2 = (Y1 ^ 2 + Z1 ^ 2 + X1 ^ 2) ^ .5
- d3 = (Y2 ^ 2 + Z2 ^ 2 + X2 ^ 2) ^ .5
- poly2(polynum, 11) = (d1 + d2 + d3) / 3
- poly2(0, 0) = polynum
- END IF
- LOCATE 3, 50: PRINT INT((n / (poly(0, 0))) * 100 + .5); "%"
- NEXT n
- time2 = TIMER
- LOCATE 1, 70: PRINT "ßÝ"
- CLS
- LINE (-1, -1)-(1, 1), 8, BF
- Z.Buffer poly2(), d, temppoly(), hide, filler, partial.Z.buffer(), v()
- LOCATE 1, 70: PRINT " "
- time3 = TIMER
- LOCATE 3, 50: PRINT SPACE$(7)
- LOCATE 9, 52: PRINT "Elapsed times..."
- LOCATE 10, 54: PRINT "View transforms: "; INT(100 * (time2 - time1) + .5) / 100; "s"
- LOCATE 11, 54: PRINT "Drawing: "; INT(100 * (time3 - time2) + .5) / 100; "s"
- LOCATE 12, 54: PRINT "Total: "; INT(100 * (time3 - time1) + .5) / 100; "s"
- LOCATE 13, 54: PRINT "Average time per poly:"
- LOCATE 14, 56: PRINT INT(((time3 - time1) / poly2(0, 0)) * 100000 + .5) / 100000; "s"
- END IF
- LOOP UNTIL quit
- END
- SUB initializer (poly(), po())
- po(1, 1) = 0
- po(1, 2) = 0
- po(1, 3) = 0
- po(2, 1) = 0
- po(2, 2) = 0
- po(2, 3) = 0
- '----Number of triangles
- poly(0, 0) = 3
- '*************Coordinates & Colors for triangles
- 'OPEN "c:\dos\basic\cylinder.d3d" FOR INPUT AS #1
- 'INPUT #1, poly(0, 0)
- 'FOR n = 1 TO poly(0, 0)
- ' INPUT #1, poly(n, 1), poly(n, 2), poly(n, 3)
- ' INPUT #1, poly(n, 4), poly(n, 5), poly(n, 6)
- ' INPUT #1, poly(n, 7), poly(n, 8), poly(n, 9)
- ' INPUT #1, poly(n, 10)
- 'NEXT n
- 'CLOSE #1
- LOCATE 1, 1: PRINT "Please wait, loading data..."
- n = 1
- OPEN "e:\chris\programs\basic\project.d3d" FOR INPUT AS #1
- DO
- INPUT #1, filename$
- IF filename$ = "Û" THEN EXIT DO
- OPEN filename$ FOR INPUT AS #2
- DO
- INPUT #2, poly(n, 1), poly(n, 2), poly(n, 3) 'First coord
- INPUT #2, poly(n, 4), poly(n, 5), poly(n, 6) 'Second coord
- INPUT #2, poly(n, 7), poly(n, 8), poly(n, 9) 'Third coord
- INPUT #2, poly(n, 10) 'color of triangle
- IF poly(n, 10) = -1 THEN
- EXIT DO
- END IF
- n = n + 1
- LOOP
- CLOSE #2
- LOOP
- poly(0, 0) = n - 1
- CLOSE #1
- LOCATE 1, 1: PRINT SPACE$(30)
- END SUB
- SUB Z.Buffer (poly2(), d, temppoly(), hide, filler, partial.Z.buffer(), v())
- 'VIEW (100, 50)-(400, 250), 0, 9
- 'WINDOW (-1, 1)-(1, -1)
- 'partial.Z.buffer(15, 150, 1)
- c21 = 1: c23 = 2: c13 = 3
- x = 1: y = 2: z = 3
- FOR subsection = -1 TO (1 - 2 / 15) STEP 20 / 200
- subsectiontop = subsection + 1 / 10
- FOR line0 = 0 TO 10
- FOR z.zero = 0 TO 150
- partial.Z.buffer(line0, z.zero, 1) = -1
- NEXT z.zero
- NEXT line0
- FOR polygon = 1 TO poly2(0, 0)
- LOCATE 3, 50: PRINT SPACE$(9)
- LOCATE 3, 50: PRINT INT((100 * polygon / poly2(0, 0)) + .5); "%"
- Y1 = poly2(polygon, 2): Y2 = poly2(polygon, 5): Y3 = poly2(polygon, 8)
- Z1 = poly2(polygon, 3): Z2 = poly2(polygon, 6): Z3 = poly2(polygon, 9)
- X1 = poly2(polygon, 1): X2 = poly2(polygon, 4): X3 = poly2(polygon, 7)
- co = poly2(polygon, 10)
- IF Z1 < Z2 THEN SWAP Z1, Z2: SWAP X1, X2: SWAP Y1, Y2
- IF Z1 < Z3 THEN SWAP Z1, Z3: SWAP X1, X3: SWAP Y1, Y3
- IF Z2 < Z3 THEN SWAP Z2, Z3: SWAP X2, X3: SWAP Y2, Y3
- IF Z1 > subsection AND Z1 < subsectiontop THEN c1 = 1 ELSE c1 = 0
- IF Z2 > subsection AND Z2 < subsectiontop THEN c2 = 1 ELSE c2 = 0
- IF Z3 > subsection AND Z3 < subsectiontop THEN c3 = 1 ELSE c3 = 0
- v(c21, x) = X2 - X1: v(c21, y) = Y2 - Y1: v(c21, z) = Z2 - Z1
- dis21 = (v(c21, x) ^ 2 + v(c21, y) ^ 2 + v(c21, z) ^ 2) ^ .5
- IF dis21 > 0 THEN
- FOR vec = x TO z
- v(c21, vec) = v(c21, vec) / dis21
- NEXT vec
- ns21 = 1
- ELSEIF dis21 = 0 THEN
- ns21 = 0
- END IF
- v(c23, x) = X2 - X3: v(c23, y) = Y2 - Y3: v(c23, z) = Z2 - Z3
- dis23 = (v(c23, x) ^ 2 + v(c23, y) ^ 2 + v(c23, z) ^ 2) ^ .5
- IF dis23 > 0 THEN
- FOR vec = x TO z
- v(c23, vec) = v(c23, vec) / dis23
- NEXT vec
- ns23 = 1
- ELSEIF dis23 = 0 THEN
- ns23 = 0
- END IF
- v(c13, x) = X1 - X3: v(c13, y) = Y1 - Y3: v(c13, z) = Z1 - Z3
- dis13 = (v(c13, x) ^ 2 + v(c13, y) ^ 2 + v(c13, z) ^ 2) ^ .5
- IF dis23 > 0 THEN
- FOR vec = x TO z
- v(c13, vec) = v(c13, vec) / dis23
- NEXT vec
- ns13 = 1
- ELSEIF dis23 = 0 THEN
- ns13 = 0
- END IF
- IF ns21 AND ns13 AND ns23 THEN
- IF c1 AND c2 AND c3 THEN
- FOR scanl = Y3 TO Y2 STEP 2 / 150
- 'LOCATE 3, 50: PRINT SPACE$(9)
- 'LOCATE 3, 50: PRINT scanl
- IF v(c23, z) <> 0 AND v(c13, z) <> 0 THEN
- v2 = (Z2 - scanline) / v(c23, z)
- v3 = (Z1 - scanline) / v(c13, z)
- ys1 = Y2 + v(c23, y) * v2
- ys2 = Y1 + v(c13, y) * v3
- xs1 = X2 + v(c23, x) * v2
- xs2 = X1 + v(c13, x) * v3
- IF ys1 > ys2 THEN SWAP ys1, ys2: SWAP xs1, xs2: SWAP v2, v3
- vsx = xs1 - xs2
- vsy = ys1 - ys2
- vd = (vsx ^ 2 + vsy ^ 2) ^ .5
- IF vd > 0 THEN vsx = vsx / vd: vsy = vsy / vd
- FOR col = ys1 TO ys2 STEP 2 / 300
- LOCATE 20, 1: PRINT col
- xcor = vsx * ((col - ys1) / vsy)
- IF (scanl >= -1 AND scanl <= 1) AND (col >= -1 AND col <= 1) THEN
- IF partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) > xcor THEN
- partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) = xcor
- partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = co
- SOUND 442, .2
- ELSEIF partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = -1 THEN
- partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) = xcor
- partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = co
- SOUND 442, .2
- END IF
- END IF
- NEXT col
- END IF
- NEXT scanl
- FOR scanl = Y2 TO Y1 STEP 2 / 150
- IF v(c12, z) <> 0 AND v(c13, z) <> 0 THEN
- v2 = (Z2 - scanline) / v(c12, z)
- v3 = (Z1 - scanline) / v(c13, z)
- ys1 = Y2 + v(c12, y) * v2
- ys2 = Y1 + v(c13, y) * v3
- xs1 = X2 + v(c12, x) * v2
- xs2 = X1 + v(c13, x) * v3
- IF ys1 < ys2 THEN SWAP ys1, ys2: SWAP xs1, xs2: SWAP v2, v3
- vsx = xs1 - xs2
- vsy = ys1 - ys2
- vd = (vsx ^ 2 + vsy ^ 2) ^ .5
- IF vd > 0 THEN vsx = vsx / vd: vsy = vsy / vd
- FOR col = ys1 TO ys2 STEP 2 / 300
- xcor = vsx * ((col - ys1) / vsy)
- IF (scanl >= -1 AND scanl <= 1) AND (col >= -1 AND col <= 1) THEN
- IF partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) > xcor THEN
- partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) = xcor
- partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = co
- SOUND 442, .2
- ELSEIF partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = -1 THEN
- partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) = xcor
- partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = co
- SOUND 442, .2
- END IF
- END IF
- NEXT col
- END IF
- NEXT scanl
- 'ELSEIF c1 AND c2 AND c3 THEN
- '
- END IF
- 'ELSE
- END IF
- NEXT polygon
- FOR scanl = subsection TO subsectiontop STEP 1 / 100
- LOCATE 3, 50: PRINT SPACE$(9)
- LOCATE 3, 50: PRINT (INT((scanl + 1) * 100 + .5)) MOD 11
- FOR col = -1 TO 1 STEP 2 / 300
- IF partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = -1 THEN
- PSET (col, scanl), 0
- ELSE
- PSET (col, scanl), partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1)
- END IF
- NEXT col
- NEXT scanl
- NEXT subsection
- 'IF poly2(polygon, 10) < 20 THEN
- ' LINE (Y1, Z1)-(Y2, Z2), co
- ' LINE (Y2, Z2)-(Y3, Z3), co
- ' LINE (Y1, Z1)-(Y3, Z3), co
- 'ELSEIF co >= 100 AND co < 2000 THEN
- ' LINE (Y1, Z1)-(Y2, Z2), INT(co / 100)
- ' LINE (Y2, Z2)-(Y3, Z3), INT(co / 100)
- ' LINE (Y1, Z1)-(Y3, Z3), INT(co / 100)
- 'ELSEIF co = 2000 THEN
- ' LINE (Y1, Z1)-(Y2, Z2), 0
- ' LINE (Y2, Z2)-(Y3, Z3), 0
- ' LINE (Y1, Z1)-(Y3, Z3), 0
- 'END IF
- END SUB
Advertisement
Add Comment
Please, Sign In to add comment