Guest User

dra3dx4z.bas

a guest
Jun 24th, 2013
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
QBasic 15.36 KB | None | 0 0
  1. DIM poly(1000, 10)
  2. DIM poly2(1000, 11)
  3. DIM temppoly(10, 11)
  4. DIM po(2, 3)
  5. DIM partial.Z.buffer(10, 300, 1)
  6. DIM v(3, 3)
  7. DECLARE SUB initializer (coord(), po())
  8. DECLARE SUB Z.Buffer (poly2(), d, temppoly(), hide, filler, partial.Z.buffer(), v())
  9. 'Main------------------------------------------------------------------------
  10. CLS
  11. initializer poly(), po()
  12. SCREEN 9: COLOR 3, 0
  13. VIEW (100, 50)-(400, 250), 0, 9
  14. WINDOW (-1, 1)-(1, -1)
  15. pi = 3.141592654#
  16. mag = 1
  17. quit = 0
  18. hide = 1
  19. filler = 1
  20. LOCATE 1, 1: PRINT "Enter command."
  21. DO
  22.     drawing = 0
  23.     SELECT CASE INKEY$
  24.         CASE "x"
  25.             po(1, 1) = po(1, 1) - .5
  26.             drawing = 1
  27.         CASE "X"
  28.             po(1, 1) = po(1, 1) + .5
  29.             drawing = 1
  30.         CASE "y"
  31.             po(1, 2) = po(1, 2) - .5
  32.             drawing = 1
  33.         CASE "Y"
  34.             po(1, 2) = po(1, 2) + .5
  35.             drawing = 1
  36.         CASE "z"
  37.             po(1, 3) = po(1, 3) - .5
  38.             drawing = 1
  39.         CASE "Z"
  40.             po(1, 3) = po(1, 3) + .5
  41.             drawing = 1
  42.         '*************Angles
  43.         CASE "1"
  44.             po(2, 1) = po(2, 1) - .05 * pi
  45.             drawing = 1
  46.         CASE "!"
  47.             po(2, 1) = po(2, 1) + .05 * pi
  48.             drawing = 1
  49.         CASE "2"
  50.             po(2, 2) = po(2, 2) - .05 * pi
  51.             drawing = 1
  52.         CASE "@"
  53.             po(2, 2) = po(2, 2) + .05 * pi
  54.             drawing = 1
  55.         CASE "3"
  56.             po(2, 3) = po(2, 3) - .05 * pi
  57.             drawing = 1
  58.         CASE "#"
  59.             po(2, 3) = po(2, 3) + .05 * pi
  60.             drawing = 1
  61.         CASE "R", "r"
  62.             initializer poly(), po()
  63.             drawing = 1
  64.         CASE "D", "d"
  65.             drawing = 1
  66.         CASE "E", "e"
  67.             LOCATE 1, 1: PRINT SPACE$(25)
  68.             LOCATE 20, 1: INPUT "Viewing coordinates (X,Y,Z):  ", po(1, 1), po(1, 2), po(1, 3)
  69.             LOCATE 21, 1: INPUT "Viewing direction vector(é1/pi,é2/pi,é3/pi):  ", po(2, 1), po(2, 2), po(2, 3)
  70.             FOR p = 1 TO 3: po(2, p) = po(2, p) * pi: NEXT p
  71.             LOCATE 20, 1: PRINT SPACE$(80)
  72.             LOCATE 21, 1: PRINT SPACE$(80)
  73.             drawing = 1
  74.         CASE "q", "Q"
  75.             quit = 1
  76.         CASE ELSE
  77.             drawing = 0
  78.     END SELECT
  79.     IF drawing THEN
  80.     LOCATE 3, 1: PRINT SPACE$(80)
  81.     FOR lnum = 9 TO 14
  82.         LOCATE lnum, 52: PRINT SPACE$(28)
  83.     NEXT lnum
  84.     LOCATE 3, 1: PRINT "Please wait, busy crunching data..."
  85.     FOR ang = 1 TO 3
  86.         IF po(2, ang) >= 2 * pi THEN po(2, ang) = po(2, ang) - 2 * pi
  87.         IF po(2, ang) < 0 THEN po(2, ang) = po(2, ang) + 2 * pi
  88.     NEXT ang
  89.     LOCATE 1, 70: PRINT "ÛÝ"
  90.     LOCATE 1, 1: PRINT SPACE$(40)
  91.     LOCATE 1, 1: PRINT "("; po(1, 1); ","; po(1, 2); ","; po(1, 3); ")"
  92.     LOCATE 2, 1: PRINT SPACE$(40)
  93.     a1 = po(2, 1) / pi: a2 = po(2, 2) / pi: a3 = po(2, 3) / pi
  94.     LOCATE 2, 1: PRINT "["; a1; ","; a2; ","; a3; "]"
  95.     time1 = TIMER
  96.     polynum = 0
  97.     poly2(0, 0) = polynum
  98.     FOR n = 1 TO poly(0, 0)
  99.         x = poly(n, 1) - po(1, 1): y = poly(n, 2) - po(1, 2): z = poly(n, 3) - po(1, 3)
  100.         X1 = poly(n, 4) - po(1, 1): Y1 = poly(n, 5) - po(1, 2): Z1 = poly(n, 6) - po(1, 3)
  101.         X2 = poly(n, 7) - po(1, 1): Y2 = poly(n, 8) - po(1, 2): Z2 = poly(n, 9) - po(1, 3)
  102.         color1 = poly(n, 10)
  103.         '************X-Y rotation
  104.         IF po(2, 1) <> 0 THEN
  105.             cp = COS(po(2, 1))
  106.             sp = SIN(po(2, 1))
  107.             xt = x * cp - y * sp
  108.             y = x * sp + y * cp
  109.             xt1 = X1 * cp - Y1 * sp
  110.             Y1 = X1 * sp + Y1 * cp
  111.             xt2 = X2 * cp - Y2 * sp
  112.             Y2 = X2 * sp + Y2 * cp
  113.             x = xt: X1 = xt1: X2 = xt2
  114.         END IF
  115.        '**************X-Z rotation
  116.         IF po(2, 2) <> 0 THEN
  117.             cp = COS(po(2, 2))
  118.             sp = SIN(po(2, 2))
  119.             xt = x * cp - z * sp
  120.             z = x * sp + z * cp
  121.             xt1 = X1 * cp - Z1 * sp
  122.             Z1 = X1 * sp + Z1 * cp
  123.             xt2 = X2 * cp - Z2 * sp
  124.             Z2 = X2 * sp + Z2 * cp
  125.             x = xt: X1 = xt1: X2 = xt2
  126.         END IF
  127.        '**************Y-Z rotation
  128.         IF po(2, 3) <> 0 THEN
  129.             cp = COS(po(2, 3))
  130.             sp = SIN(po(2, 3))
  131.             yt = y * cp - z * sp
  132.             z = y * sp + z * cp
  133.             yt1 = Y1 * cp - Z1 * sp
  134.             Z1 = Y1 * sp + Z1 * cp
  135.             yt2 = Y2 * cp - Z2 * sp
  136.             Z2 = Y2 * sp + Z2 * cp
  137.             y = yt: Y1 = yt1: Y2 = yt2
  138.         END IF
  139.         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
  140.             polynum = polynum + 1
  141.             poly2(polynum, 1) = x: poly2(polynum, 2) = y / x: poly2(polynum, 3) = z / x
  142.             poly2(polynum, 4) = X1: poly2(polynum, 5) = Y1 / X1: poly2(polynum, 6) = Z1 / X1
  143.             poly2(polynum, 7) = X2: poly2(polynum, 8) = Y2 / X2: poly2(polynum, 9) = Z2 / X2
  144.             poly2(polynum, 10) = color1
  145.             d1 = (y ^ 2 + z ^ 2 + x ^ 2) ^ .5
  146.             d2 = (Y1 ^ 2 + Z1 ^ 2 + X1 ^ 2) ^ .5
  147.             d3 = (Y2 ^ 2 + Z2 ^ 2 + X2 ^ 2) ^ .5
  148.             poly2(polynum, 11) = (d1 + d2 + d3) / 3
  149.             poly2(0, 0) = polynum
  150.         END IF
  151.         LOCATE 3, 50: PRINT INT((n / (poly(0, 0))) * 100 + .5); "%"
  152.     NEXT n
  153.     time2 = TIMER
  154.     LOCATE 1, 70: PRINT "ßÝ"
  155.     CLS
  156.     LINE (-1, -1)-(1, 1), 8, BF
  157.  
  158.     Z.Buffer poly2(), d, temppoly(), hide, filler, partial.Z.buffer(), v()
  159.  
  160.     LOCATE 1, 70: PRINT "  "
  161.     time3 = TIMER
  162.     LOCATE 3, 50: PRINT SPACE$(7)
  163.    
  164.     LOCATE 9, 52: PRINT "Elapsed times..."
  165.     LOCATE 10, 54: PRINT "View transforms: "; INT(100 * (time2 - time1) + .5) / 100; "s"
  166.     LOCATE 11, 54: PRINT "Drawing: "; INT(100 * (time3 - time2) + .5) / 100; "s"
  167.     LOCATE 12, 54: PRINT "Total: "; INT(100 * (time3 - time1) + .5) / 100; "s"
  168.     LOCATE 13, 54: PRINT "Average time per poly:"
  169.     LOCATE 14, 56: PRINT INT(((time3 - time1) / poly2(0, 0)) * 100000 + .5) / 100000; "s"
  170.     END IF
  171. LOOP UNTIL quit
  172. END
  173.  
  174. SUB initializer (poly(), po())
  175.     po(1, 1) = 0
  176.     po(1, 2) = 0
  177.     po(1, 3) = 0
  178.     po(2, 1) = 0
  179.     po(2, 2) = 0
  180.     po(2, 3) = 0
  181.     '----Number of triangles
  182.     poly(0, 0) = 3
  183.     '*************Coordinates & Colors for triangles
  184.  
  185.     'OPEN "c:\dos\basic\cylinder.d3d" FOR INPUT AS #1
  186.     'INPUT #1, poly(0, 0)
  187.     'FOR n = 1 TO poly(0, 0)
  188.     '    INPUT #1, poly(n, 1), poly(n, 2), poly(n, 3)
  189.     '    INPUT #1, poly(n, 4), poly(n, 5), poly(n, 6)
  190.     '    INPUT #1, poly(n, 7), poly(n, 8), poly(n, 9)
  191.     '    INPUT #1, poly(n, 10)
  192.     'NEXT n
  193.     'CLOSE #1
  194.  
  195.     LOCATE 1, 1: PRINT "Please wait, loading data..."
  196.     n = 1
  197.     OPEN "e:\chris\programs\basic\project.d3d" FOR INPUT AS #1
  198.     DO
  199.         INPUT #1, filename$
  200.         IF filename$ = "Û" THEN EXIT DO
  201.         OPEN filename$ FOR INPUT AS #2
  202.         DO
  203.             INPUT #2, poly(n, 1), poly(n, 2), poly(n, 3)    'First coord
  204.             INPUT #2, poly(n, 4), poly(n, 5), poly(n, 6)    'Second coord
  205.             INPUT #2, poly(n, 7), poly(n, 8), poly(n, 9)    'Third coord
  206.             INPUT #2, poly(n, 10)                           'color of triangle
  207.             IF poly(n, 10) = -1 THEN
  208.                 EXIT DO
  209.             END IF
  210.             n = n + 1
  211.         LOOP
  212.         CLOSE #2
  213.     LOOP
  214.     poly(0, 0) = n - 1
  215.     CLOSE #1
  216.     LOCATE 1, 1: PRINT SPACE$(30)
  217.  
  218. END SUB
  219.  
  220. SUB Z.Buffer (poly2(), d, temppoly(), hide, filler, partial.Z.buffer(), v())
  221.     'VIEW (100, 50)-(400, 250), 0, 9
  222.     'WINDOW (-1, 1)-(1, -1)
  223.     'partial.Z.buffer(15, 150, 1)
  224.     c21 = 1: c23 = 2: c13 = 3
  225.     x = 1: y = 2: z = 3
  226.     FOR subsection = -1 TO (1 - 2 / 15) STEP 20 / 200
  227.         subsectiontop = subsection + 1 / 10
  228.         FOR line0 = 0 TO 10
  229.             FOR z.zero = 0 TO 150
  230.                 partial.Z.buffer(line0, z.zero, 1) = -1
  231.             NEXT z.zero
  232.         NEXT line0
  233.         FOR polygon = 1 TO poly2(0, 0)
  234.             LOCATE 3, 50: PRINT SPACE$(9)
  235.             LOCATE 3, 50: PRINT INT((100 * polygon / poly2(0, 0)) + .5); "%"
  236.             Y1 = poly2(polygon, 2): Y2 = poly2(polygon, 5): Y3 = poly2(polygon, 8)
  237.             Z1 = poly2(polygon, 3): Z2 = poly2(polygon, 6): Z3 = poly2(polygon, 9)
  238.             X1 = poly2(polygon, 1): X2 = poly2(polygon, 4): X3 = poly2(polygon, 7)
  239.             co = poly2(polygon, 10)
  240.             IF Z1 < Z2 THEN SWAP Z1, Z2: SWAP X1, X2: SWAP Y1, Y2
  241.             IF Z1 < Z3 THEN SWAP Z1, Z3: SWAP X1, X3: SWAP Y1, Y3
  242.             IF Z2 < Z3 THEN SWAP Z2, Z3: SWAP X2, X3: SWAP Y2, Y3
  243.             IF Z1 > subsection AND Z1 < subsectiontop THEN c1 = 1 ELSE c1 = 0
  244.             IF Z2 > subsection AND Z2 < subsectiontop THEN c2 = 1 ELSE c2 = 0
  245.             IF Z3 > subsection AND Z3 < subsectiontop THEN c3 = 1 ELSE c3 = 0
  246.             v(c21, x) = X2 - X1: v(c21, y) = Y2 - Y1: v(c21, z) = Z2 - Z1
  247.             dis21 = (v(c21, x) ^ 2 + v(c21, y) ^ 2 + v(c21, z) ^ 2) ^ .5
  248.             IF dis21 > 0 THEN
  249.                 FOR vec = x TO z
  250.                     v(c21, vec) = v(c21, vec) / dis21
  251.                 NEXT vec
  252.                 ns21 = 1
  253.             ELSEIF dis21 = 0 THEN
  254.                 ns21 = 0
  255.             END IF
  256.             v(c23, x) = X2 - X3: v(c23, y) = Y2 - Y3: v(c23, z) = Z2 - Z3
  257.             dis23 = (v(c23, x) ^ 2 + v(c23, y) ^ 2 + v(c23, z) ^ 2) ^ .5
  258.             IF dis23 > 0 THEN
  259.                 FOR vec = x TO z
  260.                     v(c23, vec) = v(c23, vec) / dis23
  261.                 NEXT vec
  262.                 ns23 = 1
  263.             ELSEIF dis23 = 0 THEN
  264.                 ns23 = 0
  265.             END IF
  266.             v(c13, x) = X1 - X3: v(c13, y) = Y1 - Y3: v(c13, z) = Z1 - Z3
  267.             dis13 = (v(c13, x) ^ 2 + v(c13, y) ^ 2 + v(c13, z) ^ 2) ^ .5
  268.             IF dis23 > 0 THEN
  269.                 FOR vec = x TO z
  270.                     v(c13, vec) = v(c13, vec) / dis23
  271.                 NEXT vec
  272.                 ns13 = 1
  273.             ELSEIF dis23 = 0 THEN
  274.                 ns13 = 0
  275.             END IF
  276.             IF ns21 AND ns13 AND ns23 THEN
  277.                 IF c1 AND c2 AND c3 THEN
  278.                     FOR scanl = Y3 TO Y2 STEP 2 / 150
  279.                         'LOCATE 3, 50: PRINT SPACE$(9)
  280.                         'LOCATE 3, 50: PRINT scanl
  281.                         IF v(c23, z) <> 0 AND v(c13, z) <> 0 THEN
  282.                         v2 = (Z2 - scanline) / v(c23, z)
  283.                         v3 = (Z1 - scanline) / v(c13, z)
  284.                         ys1 = Y2 + v(c23, y) * v2
  285.                         ys2 = Y1 + v(c13, y) * v3
  286.                         xs1 = X2 + v(c23, x) * v2
  287.                         xs2 = X1 + v(c13, x) * v3
  288.                         IF ys1 > ys2 THEN SWAP ys1, ys2: SWAP xs1, xs2: SWAP v2, v3
  289.                         vsx = xs1 - xs2
  290.                         vsy = ys1 - ys2
  291.                         vd = (vsx ^ 2 + vsy ^ 2) ^ .5
  292.                         IF vd > 0 THEN vsx = vsx / vd: vsy = vsy / vd
  293.                         FOR col = ys1 TO ys2 STEP 2 / 300
  294.                             LOCATE 20, 1: PRINT col
  295.                             xcor = vsx * ((col - ys1) / vsy)
  296.                             IF (scanl >= -1 AND scanl <= 1) AND (col >= -1 AND col <= 1) THEN
  297.                             IF partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) > xcor THEN
  298.                                 partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) = xcor
  299.                                 partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = co
  300.                                 SOUND 442, .2
  301.                             ELSEIF partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = -1 THEN
  302.                                 partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) = xcor
  303.                                 partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = co
  304.                                 SOUND 442, .2
  305.                             END IF
  306.                             END IF
  307.                         NEXT col
  308.                         END IF
  309.                     NEXT scanl
  310.                     FOR scanl = Y2 TO Y1 STEP 2 / 150
  311.                         IF v(c12, z) <> 0 AND v(c13, z) <> 0 THEN
  312.                         v2 = (Z2 - scanline) / v(c12, z)
  313.                         v3 = (Z1 - scanline) / v(c13, z)
  314.                         ys1 = Y2 + v(c12, y) * v2
  315.                         ys2 = Y1 + v(c13, y) * v3
  316.                         xs1 = X2 + v(c12, x) * v2
  317.                         xs2 = X1 + v(c13, x) * v3
  318.                         IF ys1 < ys2 THEN SWAP ys1, ys2: SWAP xs1, xs2: SWAP v2, v3
  319.                         vsx = xs1 - xs2
  320.                         vsy = ys1 - ys2
  321.                         vd = (vsx ^ 2 + vsy ^ 2) ^ .5
  322.                         IF vd > 0 THEN vsx = vsx / vd: vsy = vsy / vd
  323.                         FOR col = ys1 TO ys2 STEP 2 / 300
  324.                             xcor = vsx * ((col - ys1) / vsy)
  325.                             IF (scanl >= -1 AND scanl <= 1) AND (col >= -1 AND col <= 1) THEN
  326.                             IF partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) > xcor THEN
  327.                                 partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) = xcor
  328.                                 partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = co
  329.                                 SOUND 442, .2
  330.                             ELSEIF partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = -1 THEN
  331.                                 partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 0) = xcor
  332.                                 partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = co
  333.                                 SOUND 442, .2
  334.                             END IF
  335.                             END IF
  336.                         NEXT col
  337.                         END IF
  338.                     NEXT scanl
  339.                 'ELSEIF c1 AND c2 AND c3 THEN
  340.                 '
  341.                 END IF
  342.             'ELSE
  343.             END IF
  344.         NEXT polygon
  345.         FOR scanl = subsection TO subsectiontop STEP 1 / 100
  346.             LOCATE 3, 50: PRINT SPACE$(9)
  347.             LOCATE 3, 50: PRINT (INT((scanl + 1) * 100 + .5)) MOD 11
  348.             FOR col = -1 TO 1 STEP 2 / 300
  349.                 IF partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1) = -1 THEN
  350.                     PSET (col, scanl), 0
  351.                 ELSE
  352.                     PSET (col, scanl), partial.Z.buffer(INT(((scanl) + 1) * 100 + .5) MOD 11, INT((col + 1) * 150 + .5), 1)
  353.                 END IF
  354.             NEXT col
  355.         NEXT scanl
  356.     NEXT subsection
  357.  
  358.             'IF poly2(polygon, 10) < 20 THEN
  359.             '    LINE (Y1, Z1)-(Y2, Z2), co
  360.             '    LINE (Y2, Z2)-(Y3, Z3), co
  361.             '    LINE (Y1, Z1)-(Y3, Z3), co
  362.             'ELSEIF co >= 100 AND co < 2000 THEN
  363.             '    LINE (Y1, Z1)-(Y2, Z2), INT(co / 100)
  364.             '    LINE (Y2, Z2)-(Y3, Z3), INT(co / 100)
  365.             '    LINE (Y1, Z1)-(Y3, Z3), INT(co / 100)
  366.             'ELSEIF co = 2000 THEN
  367.             '    LINE (Y1, Z1)-(Y2, Z2), 0
  368.             '    LINE (Y2, Z2)-(Y3, Z3), 0
  369.             '    LINE (Y1, Z1)-(Y3, Z3), 0
  370.             'END IF
  371. END SUB
Advertisement
Add Comment
Please, Sign In to add comment