home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 21 / AACD 21.iso / AACD / Programming / amigatalk / user / Graph.st < prev    next >
Encoding:
Text File  |  2000-05-17  |  6.9 KB  |  222 lines

  1. " ------------------------------------------------------------- "
  2. " Graph.st - Implementation of graph paper class for drawing    "
  3. "            functions in a window.                             "
  4. " ============================================================= "
  5. " scr    = Screen object.                                       "
  6. " win    = Window object.                                       "
  7. " ts     = Screen title (String object).                        "
  8. " tw     = Window title (String object).                        "
  9. " x      = Left edge of Window.                                 "
  10. " y      = Top  edge of Window.                                 "
  11. " w      = Width  of Window.                                    "
  12. " h      = Height of Window.                                    "
  13. " xscale = multiplier for x-coordinates (derived).              "
  14. " yscale = multiplier for y-coordinates (derived).              "
  15. " xinc   = increment size for x-coordinates.                    "
  16. " yinc   = increment size for y-coordinates.                    "
  17. " range  = Interval for x-coordinates (Xmin to Xmax).           "
  18. " domain = Interval for y-coordinates (Ymin to Ymax).           "
  19. " ------------------------------------------------------------- "
  20. " Killed a bug by adding '.' to scr open in open:from:to:       "
  21. " ------------------------------------------------------------- "
  22.  
  23. Class Graph :Painter
  24. ! scr win ts tw x y w h xscale yscale xinc yinc range domain !
  25. [
  26.   initialize: scrTitle winTitle: title  "First method to use:"
  27.     ts     <- scrTitle.
  28.     tw     <- title.
  29.  
  30.     super new: tw.     "Necessary since we use super Methods."
  31.  
  32.     range  <- Interval new.
  33.     domain <- Interval new.
  34.  
  35.     xinc   <- 0.0.
  36.     yinc   <- 0.0.
  37.  
  38.     xscale <- 1.0.
  39.     yscale <- 1.0
  40. |
  41.   setSizeFrom: orPoint to: brtPoint     "Helper method for open:from:to:"
  42.     scr setOrigin:     orPoint.
  43.     scr setScreenSize: brtPoint.
  44.  
  45.     win setWindowOrigin: orPoint.
  46.     win setWindowSize:   brtPoint.
  47.  
  48.     x <- (orPoint  x).
  49.     y <- (orPoint  y).
  50.     w <- (brtPoint x).
  51.     h <- (brtPoint y).
  52. |
  53.   open: screenMode from: oPoint to: brPoint   "Second method to use:"
  54.     scr <- Screen new: ts.
  55.     win <- Window new: tw.
  56.  
  57.     scr setScreenModeID: screenMode.
  58.     
  59.     self setSizeFrom: oPoint to: brPoint.
  60.     scr  setDepth: 4.
  61.     scr  open.
  62.  
  63.     win setFlags:     16r11800.  "RMBTRAP | ACTIVATE | BORDERLESS"
  64.     win openOnScreen: ts
  65. |
  66.   refreshGraphPaper
  67.     win refreshWindowFrame
  68. |
  69.   setPen: pen
  70.     super setAPen: pen   "<primitive 200 0 tw pen>"
  71. |
  72.   setXAxisFrom: xmin to: xmax by: deltax
  73.     range from: xmin to: xmax by: deltax.
  74.  
  75.     xinc   <- deltax.
  76.     xscale <- ((w - x) / (xmax - xmin)).
  77. |
  78.   setYAxisFrom: ymin to: ymax by: deltay
  79.     domain from: ymin to: ymax by: deltay.
  80.  
  81.     yinc   <- deltay.
  82.     yscale <- ((h - y) / (ymin - ymax))
  83. |
  84.   plotPoint: xpt y: ypt ! p !
  85.     p  <- Point new.
  86.  
  87.     p x: ((w + (xscale * (xpt - (range  last )))) rounded).
  88.     p y: ((h + (yscale * (ypt - (domain first)))) rounded).
  89.  
  90.     super drawPixelAt: p "<primitive 200 11 tw (p x) (p y)>"
  91. |
  92.   drawLine: x1 y1: y1 x2: x2 y2: y2 ! p1 p2 !
  93.     
  94.     p1 <- Point new.
  95.     p2 <- Point new.
  96.  
  97.     p1 x: ((w + (xscale * (x1 - (range  last )))) rounded).
  98.     p1 y: ((h + (yscale * (y1 - (domain first)))) rounded).
  99.     p2 x: ((w + (xscale * (x2 - (range  last )))) rounded).
  100.     p2 y: ((h + (yscale * (y2 - (domain first)))) rounded).
  101.     
  102.     "<primitive 200 6 tw (p1 x) (p1 y) (p2 x) (p2 y)>"
  103.     super drawLineFrom: p1 to: p2.
  104.  
  105.     win refreshWindowFrame
  106. |
  107.   drawXTick: xp y: yp ! p1 p2 ! "Internal method only."
  108.     p1 <- Point new.
  109.     p2 <- Point new.
  110.  
  111.     p1 x: ((w +     (xscale * (xp - (range  last )))) rounded).
  112.     p1 y: ((h + 3 + (yscale * (yp - (domain first)))) rounded).
  113.     p2 x: ((w +     (xscale * (xp - (range  last )))) rounded).
  114.     p2 y: ((h - 3 + (yscale * (yp - (domain first)))) rounded).
  115.  
  116.     "<primitive 200 6 tw (p1 x) (p1 y) (p2 x) (p2 y)>"
  117.     super drawLineFrom: p1 to: p2.
  118.  
  119.     win refreshWindowFrame
  120. |
  121.   drawYTick: xp y: yp ! p1 p2 ! "Internal method only."
  122.     p1 <- Point new.
  123.     p2 <- Point new.
  124.  
  125.     p1 x: ((w + 3 + (xscale * (xp - (range  last )))) rounded).
  126.     p1 y: ((h +     (yscale * (yp - (domain first)))) rounded).
  127.     p2 x: ((w - 3 + (xscale * (xp - (range  last )))) rounded).
  128.     p2 y: ((h +     (yscale * (yp - (domain first)))) rounded).
  129.  
  130.     "<primitive 200 6 tw (p1 x) (p1 y) (p2 x) (p2 y)>"
  131.     super drawLineFrom: p1 to: p2. 
  132.  
  133.     win refreshWindowFrame
  134. |
  135.   drawGrid: xticks y: yticks color: pen ! tsize t !
  136.     self setPen: pen.
  137.     tsize <- (range last - range first) / xticks.
  138.      
  139.     (1 to: xticks by: 1)
  140.       do: [:ix | t <- ((ix * tsize) + (range first)). "Draw vert' lines:"
  141.             self drawLine: t y1: domain last x2: t y2: domain first 
  142.           ].
  143.  
  144.     tsize <- (domain last - domain first) / yticks.
  145.     (1 to: yticks by: 1)
  146.       do: [:iy | t <- ((iy * tsize) + (domain first)).
  147.             self drawLine: range first y1: t x2: range last y2: t
  148.           ].
  149.  
  150.     win refreshWindowFrame
  151. |
  152.   drawXAxis: y0 numTicks: nticks color: pen ! tsize xt !
  153.     (domain inRange: y0)
  154.       ifTrue:  [self setPen: pen.
  155.                 self drawLine: (range first) y1: y0 
  156.                            x2: (range last)  y2: y0.
  157.  
  158.                 (nticks > 0)
  159.                   ifTrue: [tsize <- (range last - range first) / nticks.
  160.                            (1 to: nticks by: 1) 
  161.                             do: [:i | xt <- ((i * tsize) + (range first)).
  162.                                   self drawXTick: xt y: y0
  163.                                 ].
  164.                           ]
  165.                ]
  166.       ifFalse: ['X-Axis outside domain!' print].
  167.  
  168.     win refreshWindowFrame
  169. |
  170.   drawYAxis: x0 numTicks: nticks color: pen ! tsize yt !
  171.     (range inRange: x0)
  172.       ifTrue:  [self setPen: pen.
  173.                 self drawLine: x0 y1: (domain first)
  174.                            x2: x0 y2: (domain last).
  175.  
  176.                 (nticks > 0)
  177.                   ifTrue: [tsize <- (domain last - domain first) / nticks.
  178.                            (1 to: nticks by: 1) 
  179.                             do: [:i | yt <- ((i * tsize) + (domain first)).
  180.                                   self drawYTick: x0 y: yt
  181.                                 ].
  182.                           ]
  183.                ]
  184.       ifFalse: ['Y-Axis outside range!' print].
  185.  
  186.     win refreshWindowFrame
  187. |
  188.   drawLabel: labelstr at: aPoint
  189.     "<primitive 200 19 tw labelstr (aPoint x ) (aPoint y)>"
  190.     super drawText: labelstr at: aPoint.
  191.  
  192.     win refreshWindowFrame
  193. |
  194.   tellScales
  195.     ( 'Scales are:  xscale = ', xscale, ', yscale = ', -1 * yscale ) print
  196. |
  197.   tellRange
  198.     ('Range  is ', (range first asString), '<->',
  199.                    (range last  asString)) print
  200. |
  201.   tellDomain
  202.     ('Domain is ', (domain first asString), '<->',
  203.                    (domain last  asString)) print
  204. |
  205.   xScale
  206.     ^ xscale
  207. |
  208.   yScale
  209.     ^ -1 * yscale
  210. |
  211.   range
  212.     ^ ((range first asString), '<->', (range last asString))
  213. |
  214.   domain
  215.     ^ ((domain first asString), '<->', (domain last asString))
  216. |
  217.   close
  218.     win close.
  219.     scr close.
  220.     ^ nil
  221. ]
  222.