home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / pcmag / vol7n11.zip / LN711.ZIP / PIE.BAS < prev   
BASIC Source File  |  1988-05-02  |  4KB  |  113 lines

  1. '----- PIE.BAS by Brian Giedt
  2.  
  3. DEFINT A-Z
  4.  
  5. SCREEN 9
  6.  
  7. N = 6                                   'number of data items (pie slices)
  8. REDIM GraphData!(N), Radians#(N)        '6 pieces in this pie
  9.  
  10. Angle = 70                              'angle of pie
  11. Angle2# = 0
  12. Piesize = 164                           'radius of circle in pixels
  13. Removed = 188                           'radius of pie piece removed from pie
  14. Cx = 300                                'center for X position
  15. Cy = 180                                'center for Y position
  16. Pi# = 3.1415926#
  17. Turn# = COS(Angle * Pi# / 180)
  18. Height = Piesize \ 5
  19.  
  20. FOR X = 1 TO N                          'read the pie chart data
  21.     READ GraphData!(X)
  22. NEXT
  23. DATA 92, 78, 45, 30, 19, 11
  24.  
  25. Sum! = 0
  26. FOR I = 1 TO N                          'proportionalize pie to the
  27.     Sum! = Sum! + GraphData!(I)         '  sum of its parts
  28. NEXT
  29.  
  30. FOR I = 1 TO N
  31.     Radians#(I) = GraphData!(I) / Sum!
  32. NEXT
  33.  
  34. '**** MAIN LOOP ****
  35.  
  36. FOR C = 1 TO N
  37.     Angle1# = Angle2#                           'retain last angle
  38.     Angle2# = Angle2# + Radians#(C) * 2 * Pi#   'calculate radians
  39.     AvgAngle# = (Angle1# + Angle2#) / 2
  40.  
  41.     IF C = N THEN       'this is the final slice, pull it away from the rest
  42.        OldCx = Cx
  43.        Cx = Cx + COS(AvgAngle#) * (Removed - Piesize)
  44.        OldCy = Cy
  45.        Cy = Cy - SIN(AvgAngle#) * (Removed - Piesize) * Turn#
  46.     END IF
  47.  
  48.     CIRCLE (Cx, Cy), Piesize, , -Angle1# - .001#, -Angle2#, Turn#
  49.     PAngle1# = Angle1# + .001#
  50.     Pangle2# = Angle2#
  51.  
  52.     IF PAngle1# < Pi# THEN
  53.        IF Pangle2# > Pi# THEN
  54.           PAngle1# = Pi#
  55.        ELSE
  56.           Pangle2# = -1
  57.        END IF
  58.     END IF
  59.  
  60.     IF Pangle2# > 0# THEN               'working with the front pie pieces
  61.                                         'first draw the circle
  62.        CIRCLE (Cx, Cy + Height), Piesize, , PAngle1#, Pangle2#, Turn#
  63.        P1C# = COS(ABS(PAngle1#))
  64.        P2C# = COS(ABS(Pangle2#))
  65.        P1S# = SIN(ABS(PAngle1#))
  66.        P2S# = SIN(ABS(Pangle2#))
  67.  
  68.                                         'now draw the connecting lines
  69.        LINE (Cx + P1C# * Piesize, Cy - P1S# * Piesize * Turn#)- _
  70.             (Cx + P1C# * Piesize, Cy - P1S# * Piesize * Turn# + Height)
  71.        LINE (Cx + P2C# * Piesize, Cy - P2S# * Piesize * Turn#)- _
  72.             (Cx + P2C# * Piesize, Cy - P2S# * Piesize * Turn# + Height)
  73.  
  74.        IF C = N THEN             'this is the piece to pull away from the pie
  75.           IF PAngle1# > Pi# * 3 / 2 THEN
  76.              CALL DoLine(CDBL(Cx + P1C# * Piesize), _
  77.                   CDBL(Cy - P1S# * Piesize * Turn# + Height), _
  78.                   CDBL(Cx), CDBL(Cy + Height))
  79.              CALL DoLine(CDBL(Cx), CDBL(Cy), CDBL(Cx), CDBL(Cy + Height))
  80.  
  81.              PAINT (Cx + P1C# * Piesize - 1, _
  82.                     Cy - P1S# * Piesize * Turn# + Height \ 2), C, 15
  83.           END IF
  84.        END IF
  85.  
  86.        PAvgAngle# = (PAngle1# + Pangle2#) / 2
  87.        PAINT (Cx + COS(PAvgAngle#) * Piesize, _
  88.               Cy - SIN(PAvgAngle#) * Piesize * Turn# + Height \ 2), C, 15
  89.  
  90.     END IF
  91.  
  92.     PAINT (Cx + COS(AvgAngle#) * .8 * Piesize, _
  93.            Cy - SIN(AvgAngle#) * .8 * Piesize * Turn#), C, 15
  94.  
  95.     IF COS(AvgAngle#) > 0 THEN
  96.        Lx = Cx + COS(AvgAngle#) * Piesize + 8
  97.     ELSE
  98.        Lx = Cx + COS(AvgAngle#) * Piesize
  99.     END IF
  100.  
  101.     Ly = Cy - SIN(AvgAngle#) * (Piesize) * Turn#
  102.  
  103.     IF AvgAngle# > Pi# THEN
  104.        Ly = Ly + Removed \ 3
  105.     ELSE
  106.        Ly = Ly - Piesize \ 7
  107.     END IF
  108.  
  109. NEXT
  110. END
  111.  
  112. '$INCLUDE: 'DoLine.Bas'
  113.