92 lines
2.5 KiB
Plaintext
92 lines
2.5 KiB
Plaintext
Structure PlotData
|
|
x.i
|
|
y.f
|
|
EndStructure
|
|
|
|
Global i, x, y.f, max_x, max_y, min_x = #MAXLONG, min_y = Infinity()
|
|
Define count = (?serie_y - ?serie_x) / SizeOf(Integer) - 1
|
|
Global Dim MyData.PlotData(count)
|
|
|
|
Restore serie_x
|
|
For i = 0 To count
|
|
Read.i x
|
|
MyData(i)\x = x
|
|
If x > max_x: max_x = x: EndIf
|
|
If x < min_x: min_x = x: EndIf
|
|
Next
|
|
Restore serie_y
|
|
For i = 0 To count
|
|
Read.f y
|
|
MyData(i)\y = y
|
|
If y > max_y: max_y = y: EndIf
|
|
If y < min_y: min_y = y: EndIf
|
|
Next
|
|
|
|
Procedure UpdatePlot(Win, w, h)
|
|
Static gblm = 20, gtrm = 5 ;graph's bottom-left and top-right margin
|
|
|
|
Protected count = ArraySize(MyData())
|
|
If w > gblm And h > gblm And count > 0
|
|
SetWindowTitle(Win, "PureBasic Plot " + Str(w) + "x" + Str(h))
|
|
Protected gw = w - gblm, gh = h - gblm ;graph's width and height
|
|
Protected i, yf.f, xf.f
|
|
yf = (gh - gtrm) / max_y
|
|
xf = (gw - gtrm) / max_x
|
|
|
|
CreateImage(0, w, h)
|
|
Protected OutputID = ImageOutput(0)
|
|
StartDrawing(OutputID)
|
|
DrawingMode(#PB_2DDrawing_Transparent)
|
|
;- Draw grid
|
|
For i = 0 To count
|
|
y = gh - max_y * i / count * yf
|
|
LineXY(gblm, y, w - gtrm, y, $467E3E)
|
|
; Y-scale
|
|
DrawText(1, y - 5, RSet(StrD(i / count * max_y, 1), 5))
|
|
x = gblm + max_x * i / count * xf
|
|
y = gh
|
|
; X-Scale
|
|
LineXY(x, y, x, gtrm, $467E3E)
|
|
If i: DrawText(x - 5, y + 2, Str(i)): EndIf
|
|
Next
|
|
|
|
;- Draw curve
|
|
Protected ox = gblm, oy = gh, x, y
|
|
For i = 0 To count
|
|
x = gblm + MyData(i)\x * xf
|
|
y = gh - MyData(i)\y * yf
|
|
LineXY(ox, oy, x, y, $0133EE)
|
|
ox = x: oy = y
|
|
Next
|
|
StopDrawing()
|
|
ImageGadget(0, 0, 0, w, h, ImageID(0))
|
|
EndIf
|
|
EndProcedure
|
|
|
|
Define Win = OpenWindow(#PB_Any, 0, 0, 600, 400,"", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
|
|
If Win
|
|
SmartWindowRefresh(Win, 1)
|
|
UpdatePlot(Win, WindowWidth(Win), WindowHeight(Win))
|
|
Repeat
|
|
Define event = WaitWindowEvent()
|
|
Select event
|
|
Case #PB_Event_SizeWindow
|
|
UpdatePlot(Win, WindowWidth(Win), WindowHeight(Win))
|
|
EndSelect
|
|
Until event = #PB_Event_CloseWindow
|
|
|
|
; Save the plot if the user wants to
|
|
If MessageRequester("Question", "Save it?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
|
|
Define File$=SaveFileRequester("Save as", "PB.png", "PNG (*.png)|*.png", 0)
|
|
UsePNGImageEncoder()
|
|
SaveImage(0, File$, #PB_ImagePlugin_PNG)
|
|
EndIf
|
|
EndIf
|
|
|
|
DataSection
|
|
serie_x:
|
|
Data.i 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
|
|
serie_y:
|
|
Data.f 2.7, 2.8, 31.4, 38.1, 58.0, 76.2, 100.5, 130.0, 149.3, 180.0
|
|
EndDataSection
|