'===========================================================================
' Subject: FUNCTION GRAPHING PROGRAM          Date: 08-29-00 (21:15)       
'  Author: Tomer Filiba                       Code: QB, QBasic, PDS        
'  Origin: flexibal@n2.com                  Packet: MISC.ABC
'===========================================================================
'
'    GRAPHITE's  GùRùAùPùHùiùt
'===---===---===---===---===---===
'
'  -Product:     Graphite's GraphùIt
'  -Category:    Math, Graphing
'  -Version:     0.3 B
'  -Produced by: Graphite Technologies (http://www.graphite-tech.com)
'  -Programmer:  Tomer Filiba (flexibal@n2.com)
'  -Contact:     contact@graphite-tech.com
'  -Platform:    DOS 5.0 & later, All QB versions
'
'
'============================================================================
DECLARE SUB DrawGrid (X%, Y%)

'$DYNAMIC
DEFINT A-Z

CONST True = -1, False = -1
CONST Pi = 3.1416

TYPE GraphType
  XSize      AS INTEGER
  YSize      AS INTEGER
  XJump      AS SINGLE
  YJump      AS SINGLE
  Steps      AS SINGLE
  ScreenX    AS INTEGER
  ScreenY    AS INTEGER
  XOff       AS INTEGER
  YOff       AS INTEGER
  GridColor  AS INTEGER
  GraphColor AS INTEGER
  GraphWidth AS INTEGER
  AxisColor  AS INTEGER
  AxisWidth  AS INTEGER
  BackColor  AS INTEGER
END TYPE
COMMON SHARED Graph AS GraphType

ON ERROR GOTO IfError
SCREEN 12

Graph.Steps = .01
Graph.GraphColor = 14
Graph.GraphWidth = 2
Graph.AxisColor = 3
Graph.AxisWidth = 1
Graph.GridColor = 9
Graph.BackColor = 1
Graph.ScreenX = 640
Graph.ScreenY = 480
Graph.XOff = 0
Graph.YOff = 0


PAINT (0, 0), 15
DrawGrid 20, 15

FOR X! = -Graph.XSize TO Graph.XSize STEP Graph.Steps
  oopX = pX
  oopY = pY
 
  Y! = COS(-X!) '<===== Function  f(x)

  pX = (Graph.ScreenX / 2) + (X! * Graph.XJump)
  pY = (Graph.ScreenY / 2) + (-Y! * Graph.YJump)
  IF X! = -Graph.XSize THEN opX = pX: opY = pY
  IF pX >= 0 AND pY >= 0 AND pX <= Graph.ScreenX - 1 AND pY <= Graph.ScreenY - 1 THEN
    opX = oopX
    opY = oopY
    FOR n = 0 TO Graph.GraphWidth - 1
      LINE (Graph.XOff + opX, Graph.YOff + opY + n)-(Graph.XOff + pX + n, Graph.YOff + pY + n), Graph.GraphColor
    NEXT n
  END IF
  IF INKEY$ <> "" THEN EXIT FOR
NEXT X!

SLEEP
                 
                 
END
IfError:
 RESUME NEXT

REM $STATIC
SUB DrawGrid (X, Y)
 Graph.XSize = X
 Graph.YSize = Y

 XJ = (Graph.ScreenX / 2) / X
 YJ = (Graph.ScreenY / 2) / Y
 IF XJ < 2 THEN XJ = 2: Graph.XSize = (Graph.ScreenX / 2) * XJ
 IF YJ < 2 THEN YJ = 2: Graph.YSize = (Graph.ScreenY / 2) * YJ

 Graph.XJump = ((Graph.ScreenX / 2) / Graph.XSize)
 Graph.YJump = ((Graph.ScreenY / 2) / Graph.YSize)

 gc = Graph.GridColor
 ac = Graph.AxisColor
 aw = Graph.AxisWidth
 LINE (Graph.XOff, Graph.YOff)-(Graph.XOff + Graph.ScreenX, Graph.YOff + Graph.ScreenY), Graph.BackColor, BF

 FOR i = -(Graph.ScreenX / 2) TO (Graph.ScreenX / 2) STEP XJ
   LINE (Graph.XOff + (Graph.ScreenX / 2) + i, Graph.YOff)-(Graph.XOff + (Graph.ScreenX / 2) + i, Graph.YOff + Graph.ScreenY - 1), gc
 NEXT i
 FOR i = -(Graph.ScreenY / 2) TO (Graph.ScreenY / 2) STEP YJ
   LINE (Graph.XOff, Graph.YOff + (Graph.ScreenY / 2) + i)-(Graph.XOff + Graph.ScreenX - 1, Graph.YOff + (Graph.ScreenY / 2) + i), gc
 NEXT i
 
 LINE (Graph.XOff, Graph.YOff + (Graph.ScreenY / 2) - aw)-(Graph.XOff + Graph.ScreenX, Graph.YOff + (Graph.ScreenY / 2) + aw), ac, BF
 LINE (Graph.XOff + (Graph.ScreenX / 2) - aw, Graph.YOff)-(Graph.XOff + (Graph.ScreenX / 2) + aw, Graph.YOff + Graph.ScreenY), ac, BF
END SUB
