Microsoft Small Basic

Program Listing: RQX345-1
' Graph
' Copyright © 2015 Nonki Takahashi. The MIT License.
' Last update 2015-07-14
' Version 0.3
' Program ID RQX345-1
'
GraphicsWindow.Title = "Graph 0.3"
Not = "True=False;False=True;"
Form()
GraphicsWindow.PenColor = "DimGray"
dx = 0.01
Graph_Draw()
Sub Form
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
GraphicsWindow.BackgroundColor = "LightGray"
GraphicsWindow.FontName = "Arial"
param = "x=10;"
param["width"] = gw - 20
param["y"] = 30
param["height"] = gh - 40
Graph_SetGWViewPort()
GraphicsWindow.BrushColor = "White"
GraphicsWindow.FillRectangle(param["x"], param["y"], param["width"], param["height"])
x1 = -6.5
param["x"] = x1
x2 = 6.5
param["width"] = x2 - x1
param["height"] = -param["width"] / (gw - 20) * (gh - 40)
y1 = -param["height"] / 2
y2 = param["height"] / 2
param["y"] = y1
Graph_SetLogicalViewPort()
Fx_GetProperties()
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.DrawText(10, 10, "y=" + textFx)
GraphicsWindow.PenColor = "#99FFFF"
dx = 0.1
dy = 0.1
Graph_DrawGrid()
GraphicsWindow.PenColor = "#77CCCC"
GraphicsWindow.BrushColor = "#559999"
dx = 1
dy = 1
num = "True"
Graph_DrawGrid()
GraphicsWindow.PenColor = "Gray"
GraphicsWindow.DrawRectangle(10, 30, gw - 20, gh - 40)
ox = gwx1 + 300
oy = gwy1 + 300
EndSub
Sub Fx
y = Math.Remainder(x,-1.5)
EndSub
Sub Fx_GetProperties
textFx = "Math.Remainder(x,-1.5)"
minX = x1
maxX = x2
continuous = "False"
EndSub
Sub Graph_Draw
For x = minX To maxX Step dx
Fx()
Graph_DrawLine()
_x = x
_y = y
EndFor
EndSub
Sub Graph_SetGWViewPort
' param["x"]
' param["y"]
' param["width"]
' param["height"]
gwvp = param
EndSub
Sub Graph_SetLogicalViewPort
' param["x"]
' param["y"]
' param["width"]
' param["height"]
vp = param
EndSub
Sub Graph_ToGWCoordinate
' param x, y - logical co-ordinate
' return gwx, gwy - graphics window co-ordinate
gwx = gwvp["x"] + (x - vp["x"]) / vp["width"] * gwvp["width"]
gwy = gwvp["y"] + (y - vp["y"]) / vp["height"] * gwvp["height"]
EndSub
Sub Graph_DrawLine
' param x, y - logical point to endt line
' param _x, _y - logical point to start line
sign = x / Math.Abs(x)
Graph_ToGWCoordinate()
If _gwx <> "" And (continuous Or (Not[continuous] And Math.Abs(gwy - _gwy) < 30)) Then
If y2 <= _y And _y <= y1 And y2 <= y And y <= y1 Then
GraphicsWindow.DrawLine(_gwx, _gwy, gwx, gwy)
ElseIf y2 <= _y And _y <= y1 Then
Stack.PushValue("local", x)
Stack.PushValue("local", y)
Stack.PushValue("local", gwx)
Stack.PushValue("local", gwy)
If y < y2 Then
k = (_y - y2) / (_y - y)
x = (1 - k) * _x + k * x
y = y2
Else
k = (y1 - _y) / (y - _y)
x = (1 - k) * _x + k * x
y = y1
EndIf
Graph_ToGWCoordinate()
GraphicsWindow.DrawLine(_gwx, _gwy, gwx, gwy)
gwy = Stack.PopValue("local")
gwx = Stack.PopValue("local")
y = Stack.PopValue("local")
x = Stack.PopValue("local")
ElseIf y2 <= y And y <= y1 Then
Stack.PushValue("local", x)
Stack.PushValue("local", y)
Stack.PushValue("local", gwx)
Stack.PushValue("local", gwy)
Stack.PushValue("local", _gwx)
Stack.PushValue("local", _gwy)
_gwx = gwx
_gwy = gwy
If _y < y2 Then
k = (y - y2) / (y - _y)
x = (1 - k) * x + k * _x
y = y2
Else
k = (y1 - y) / (_y - y)
x = (1 - k) * x + k * _x
y = y1
EndIf
Graph_ToGWCoordinate()
GraphicsWindow.DrawLine(_gwx, _gwy, gwx, gwy)
_gwy = Stack.PopValue("local")
_gwx = Stack.PopValue("local")
gwy = Stack.PopValue("local")
gwx = Stack.PopValue("local")
y = Stack.PopValue("local")
x = Stack.PopValue("local")
EndIf
EndIf
_gwx = gwx
_gwy = gwy
EndSub
Sub Graph_DrawGrid
' param x1, y1 - logical left top of the grid
' param x2, y2 - logical right bottom of the grid
' param dx, dy - logical grid pitch
x = x1
y = y1
Graph_ToGWCoordinate()
gwx1 = gwx
gwy1 = gwy
x = x2
y = y2
Graph_ToGWCoordinate()
gwx2 = gwx
gwy2 = gwy
x = 0
For y = 0 To y2 Step -dy
Graph_ToGWCoordinate()
GraphicsWindow.DrawLine(gwx1, gwy, gwx2, gwy)
If num Then
GraphicsWindow.DrawText(gwx + 2, gwy, y)
EndIf
EndFor
For y = 0 To y1 Step dy
Graph_ToGWCoordinate()
GraphicsWindow.DrawLine(gwx1, gwy, gwx2, gwy)
If num Then
GraphicsWindow.DrawText(gwx + 2, gwy, y)
EndIf
EndFor
y = 0
For x = 0 To x2 Step dx
Graph_ToGWCoordinate()
GraphicsWindow.DrawLine(gwx, gwy1, gwx, gwy2)
If num Then
GraphicsWindow.DrawText(gwx + 2, gwy, x)
EndIf
EndFor
For x = 0 To x1 Step -dx
Graph_ToGWCoordinate()
GraphicsWindow.DrawLine(gwx, gwy1, gwx, gwy2)
If num Then
GraphicsWindow.DrawText(gwx + 2, gwy, x)
EndIf
EndFor
EndSub