If you want a quick tool to display graphics, i've done something for this some time ago (
Code: Select all
DeclareModule Graph
Structure Graph_pt_point_d
x.d
y.d
EndStructure
Structure Graph_pt
*graph.Graph
color.l
line.b
List pt.d()
EndStructure
Structure Graph
pos.Graph_pt_point_d
dimension.POINT
nb_point.l
List list_des_pt.Graph_pt()
maxi.d
mini.d
ratio_w.d
ratio_h.d
Nom.s
EndStructure
Declare.i Graph_Init(x, y, width, height, nb_point, Nom.s = "")
Declare.i Graph_AddSerie(*graph.Graph, color.l, Line.b = #False)
Declare.i Graph_FreeSerie(*graph.Graph, *adresse_serie)
Declare Graph_AddPoint(*adresse_serie.Graph_pt, value.d)
Declare Graph_Draw(*graph.Graph)
EndDeclareModule
Module Graph
Procedure.d Maxi_delta(value.d, delta.d)
If delta = 0
ProcedureReturn Round(value, #PB_Round_Up) + 0.5
Else
p10.d = Pow(10, Round(Log10(Abs(delta)), #PB_Round_Down))
ProcedureReturn Round(value / p10, #PB_Round_Up) * p10
EndIf
EndProcedure
Procedure.d Mini_delta(value.d, delta.d)
If delta = 0
ProcedureReturn Round(value, #PB_Round_Down) - 0.5
Else
p10.d = Pow(10, Round(Log10(Abs(delta)), #PB_Round_Down))
ProcedureReturn Round(value / p10, #PB_Round_Down) * p10
EndIf
EndProcedure
Procedure.i Graph_Init(x, y, width, height, nb_point, Nom.s = "")
*graph.Graph = AllocateMemory(SizeOf(Graph))
InitializeStructure(*graph, Graph)
*graph\pos\x = x
*graph\pos\y = y
*graph\dimension\x = width
*graph\dimension\y = height
*graph\nb_point = nb_point
*graph\ratio_w = *graph\dimension\x / *graph\nb_point
*graph\Nom = Nom
ProcedureReturn *graph
EndProcedure
Procedure.i Graph_AddSerie(*graph.Graph, color.l, Line.b = #False) ; retourne l'adresse de la série. A conserver pour ajouter des points
*new_serie = AddElement(*graph\list_des_pt())
InitializeStructure(*new_serie, Graph_pt)
*graph\list_des_pt()\color = color
*graph\list_des_pt()\graph = *graph
*graph\list_des_pt()\line = Line
ProcedureReturn *new_serie
EndProcedure
Procedure.i Graph_FreeSerie(*graph.Graph, *adresse_serie) ; retourne l'adresse de la série. A conserver pour ajouter des points
ChangeCurrentElement(*graph\list_des_pt(), *adresse_serie)
FreeList(*graph\list_des_pt()\pt())
DeleteElement(*graph\list_des_pt())
EndProcedure
Procedure Graph_AddPoint(*adresse_serie.Graph_pt, value.d)
LastElement(*adresse_serie\pt())
AddElement(*adresse_serie\pt())
*adresse_serie\pt() = value
If ListSize(*adresse_serie\pt()) > *adresse_serie\graph\nb_point
FirstElement(*adresse_serie\pt())
DeleteElement(*adresse_serie\pt())
EndIf
EndProcedure
Procedure Graph_Draw(*graph.Graph)
Line(*graph\pos\x - 1, *graph\pos\y - 1, *graph\dimension\x + 2, 1, #Green)
Line(*graph\pos\x - 1, *graph\pos\y - 1, 1, *graph\dimension\y + 2, #Green)
Line(*graph\pos\x - 1, *graph\pos\y - 1 + *graph\dimension\y + 2, *graph\dimension\x + 2, 1, #Green)
Line(*graph\pos\x - 1 + *graph\dimension\x + 2, *graph\pos\y - 1, 1, *graph\dimension\y + 2, #Green)
If *graph\Nom
Protected titre$ = " " + *graph\Nom + " "
Protected w = TextWidth(titre$), h = TextHeight(titre$)
Protected x.d = *graph\pos\x + *graph\dimension\x / 2 - w / 2, y.d = *graph\pos\y - h / 2
DrawText(x ,y , titre$, #Green)
Line(x - 1, y - 1, w + 1, 1, #Green)
Line(x - 1, y - 1, 1, h + 1, #Green)
Line(x - 1, y - 1 + h + 1, w + 2, 1, #Green)
Line(x - 1 + w + 1, y - 1, 1, h + 2, #Green)
EndIf
DrawText(*graph\pos\x + *graph\dimension\x + 2, *graph\pos\y - 1, StrD(*graph\maxi), #Green)
DrawText(*graph\pos\x + *graph\dimension\x + 2, *graph\pos\y - 1 + *graph\dimension\y + 2 - TextHeight(" "), StrD(*graph\mini), #Green)
*graph\ratio_h = *graph\dimension\y / (*graph\maxi - *graph\mini)
mini.d = *graph\mini
If Sign(*graph\maxi) <> Sign(*graph\mini)
Line(*graph\pos\x, *graph\pos\y + *graph\dimension\y + mini * *graph\ratio_h, *graph\dimension\x, 1, #Green)
DrawText(*graph\pos\x + *graph\dimension\x + 2, *graph\pos\y + *graph\dimension\y + mini * *graph\ratio_h - TextHeight(" ") / 2, "0", #Green)
EndIf
*graph\maxi = -Infinity()
*graph\mini = Infinity()
ForEach *graph\list_des_pt()
index = 0
If *graph\list_des_pt()\line = #False
ForEach *graph\list_des_pt()\pt()
If *graph\list_des_pt()\pt() > *graph\maxi : *graph\maxi = *graph\list_des_pt()\pt() : EndIf
If *graph\list_des_pt()\pt() < *graph\mini : *graph\mini = *graph\list_des_pt()\pt() : EndIf
Line(*graph\pos\x + index * *graph\ratio_w, *graph\pos\y + *graph\dimension\y - (*graph\list_des_pt()\pt() - mini) * *graph\ratio_h, 1, 1, *graph\list_des_pt()\color)
index + 1
Next
Else
*adr.Double = FirstElement(*graph\list_des_pt()\pt())
old_x.d = *graph\pos\x + index * *graph\ratio_w
old_y.d = *graph\pos\y + *graph\dimension\y - (*graph\list_des_pt()\pt() - mini) * *graph\ratio_h
ForEach *graph\list_des_pt()\pt()
If *graph\list_des_pt()\pt() > *graph\maxi : *graph\maxi = *graph\list_des_pt()\pt() : EndIf
If *graph\list_des_pt()\pt() < *graph\mini : *graph\mini = *graph\list_des_pt()\pt() : EndIf
x.d = *graph\pos\x + index * *graph\ratio_w
y.d = *graph\pos\y + *graph\dimension\y - (*graph\list_des_pt()\pt() - mini) * *graph\ratio_h
LineXY(x, y, old_x, old_y, *graph\list_des_pt()\color)
old_x = x
old_y = y
index + 1
Next
EndIf
If LastElement(*graph\list_des_pt()\pt())
DrawText(*graph\pos\x + *graph\dimension\x + 2, *graph\pos\y + *graph\dimension\y - (*graph\list_des_pt()\pt() - mini) * *graph\ratio_h - TextHeight(" ") / 2, StrD(*graph\list_des_pt()\pt()), *graph\list_des_pt()\color)
EndIf
Next
delta.d = *graph\maxi - *graph\mini
*graph\maxi = Maxi_delta(*graph\maxi, delta)
*graph\mini = Mini_delta(*graph\mini, delta)
If delta = 0 : delta = 1 : EndIf
EndProcedure
EndModule
CompilerIf #PB_Compiler_IsMainFile = #True
OpenWindow(0, 0, 0, 800, 600, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
CanvasGadget(0, 10, 10, 780, 580)
AddKeyboardShortcut(0, #PB_Shortcut_Escape, 0)
AddKeyboardShortcut(0, #PB_Shortcut_Up, 1)
AddKeyboardShortcut(0, #PB_Shortcut_Down, 2)
UseModule Graph
;{ init graphics
*graph.Graph = Graph_Init(10, 10, 700, 200, 300, "Sinus, Cosinus")
*ad_sinus = Graph_AddSerie(*graph, #Blue, #True)
*ad_cosinus = Graph_AddSerie(*graph, RGB(200, 200, 255))
*graph_fps.Graph = Graph_Init(10, 230, 700, 200, 1000, "fps, _dt_lim")
*ad_fps = Graph_AddSerie(*graph_fps, #Blue)
*ad__dt_lim = Graph_AddSerie(*graph_fps, RGB(200, 200, 255))
;}
_dt_lim = 20
time = ElapsedMilliseconds()
sinus = 0
cosinus = 1
Repeat
;{ event
Repeat
event = WindowEvent()
Select event
Case #PB_Event_Menu
Select EventMenu()
Case 0
event = #PB_Event_CloseWindow
Case 1
_dt_lim + 1
If _dt_lim > 50 : _dt_lim = 50 : EndIf
Case 2
_dt_lim - 1
If _dt_lim < 1 : _dt_lim = 1 : EndIf
EndSelect
EndSelect
If event = #PB_Event_CloseWindow
End
EndIf
Until event = 0
;}
;{ ajustement du fps
dt = ElapsedMilliseconds() - time
If dt < _dt_lim
Delay(_dt_lim - dt)
EndIf
dt = ElapsedMilliseconds() - time
time = ElapsedMilliseconds()
;}
Graph_AddPoint(*ad_sinus, 5*Cos(time/10000)*Sin(time/1000))
Graph_AddPoint(*ad_cosinus, 2*Cos(time/1000))
Graph_AddPoint(*ad_fps, 1000/dt)
Graph_AddPoint(*ad__dt_lim, _dt_lim)
;{ dessin
StartDrawing(CanvasOutput(0))
Box(0, 0, OutputWidth(), OutputHeight(), 0)
Graph_Draw(*graph)
Graph_Draw(*graph_fps)
DrawText(10, 500, "[UP], [DOWN] : Modify the FPS limiter", $FFFFFF, 0)
StopDrawing()
;}
ForEver
CompilerEndIf