📄 nxgraph.cpp
字号:
#include "nxGraph.h"
#ifdef NXGRAPH_USE_V20090205
nxGraph::nxGraph()
{
Left = 0;
Top = 100;
Width = 290;
Height = 130;
XMin = 0.0;
YMin = 0.0;
XScale = 300.0; //5 min
YScale = 100.0;
XStep = 60.0; //1 min
Marker1 = 0.0;
Marker2 = 0.0;
Marker3 = 0.0;
YStep = 20.0;
Period = -1;
ClearLines();
}
void nxGraph::ClearLines(void)
{
for (unsigned char i = 0; i < NXGRAPH_MAX_LINES; ++i)
{
PrevX[i] = 0;
PrevY[i] = 0;
}
}
inline float min(float a, float b)
{
if (a < b)
return a;
return b;
}
inline float max(float a, float b)
{
if (a > b)
return a;
return b;
}
void nxGraph::AddXY(unsigned char Line, float x, float y, bool visible)
{
int py = (Top + Height - BOTTOM_SHIFT) - (y * ((Height - BOTTOM_SHIFT) / YScale));
int px = Left + (int(x) % int(XScale)) * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT;
if ((y < YMin + YScale) && (y > YMin) && visible)
{
if (PrevX[Line])
{
if (py == PrevY[Line])
GUI_DrawHLine(py, PrevX[Line], px);
else
{
GUI_DrawVLine(PrevX[Line], min(py, PrevY[Line]), max(py, PrevY[Line]));
GUI_DrawHLine(py, PrevX[Line], px);
}
}
}
if (x >= XScale * (Period + 1))
Redraw(NXGRAPH_REDRAW_ALL);
else
PrevX[Line] = px;
PrevY[Line] = py;
}
void nxGraph::Redraw(unsigned char Mode)
{
switch (Mode)
{
case NXGRAPH_REDRAW_ALL:
{
ClearLines();
Period++;
GUI_ClearRect(Left, Top - 5, Left + Width + 8, Top + Height); //5 ???
//draw axis
GUI_DrawVLine(Left + LEFT_SHIFT, Top, Top + Height - BOTTOM_SHIFT);
GUI_DrawVLine(Left + LEFT_SHIFT + 1, Top, Top + Height - BOTTOM_SHIFT);
GUI_DrawHLine(Top + Height - BOTTOM_SHIFT, Left + LEFT_SHIFT, Left + Width);
GUI_DrawHLine(Top + Height - BOTTOM_SHIFT - 1, Left + LEFT_SHIFT, Left + Width);
//draw frame
GUI_DrawVLine(Left + Width, Top, Top + Height - BOTTOM_SHIFT);
GUI_DrawHLine(Top, Left + LEFT_SHIFT, Left + Width);
GUI_SetFont(&GUI_Font6x8);
GUI_SetLineStyle(GUI_LS_DOT);
//draw vertical separators and labels on X-axis
for (float i = 0.0; i <= XScale; i += XStep)
{
//GUI_DrawVLine(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top, Top + Height - BOTTOM_SHIFT);
GUI_DrawLine(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top, Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top + Height - BOTTOM_SHIFT);
GUI_GotoXY(int(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT - 8), int((Top + Height - BOTTOM_SHIFT) + 5));
GUI_DispDecSpace(int(i + (XScale *Period)), 3);
}
//draw horizontal separators and labels on Y-axis
for (float i = 0.0; i <= YScale; i+= YStep)
{
//GUI_DrawHLine((Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)), Left + LEFT_SHIFT, Left + Width);
GUI_DrawLine(Left + LEFT_SHIFT, (Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)), Left + Width, (Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)));
GUI_GotoXY(int(Left), int((Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)) - 5));
GUI_DispDecSpace(int(i), 5);
}
GUI_SetLineStyle(GUI_LS_SOLID);
break;
}
}
}
nxGraph::~nxGraph()
{
}
#endif
#ifdef NXGRAPH_USE_V20090301
const GUI_POINT MarkerPoints[] = {{0, 0}, {4, -3}, {4, 3}};
nxGraph::nxGraph()
{
Left = 0;
Top = 100;
Width = 290;
Height = 130;
Mode = GRAPH_LINES;
XMin = 0.0;
YMin = 0.0;
Marker1 = 25.0;
Marker2 = 70.0;
XScale = 300.0; //5 min
YScale = 100.0;
XStep = 60.0; //1 min
YStep = 20.0;
Period = -1;
ClearLines();
}
void nxGraph::ClearLines(void)
{
for (unsigned char i = 0; i < NXGRAPH_MAX_LINES; ++i)
{
PrevX[i] = 0;
PrevY[i] = 0;
}
}
inline float min(float a, float b)
{
if (a < b)
return a;
return b;
}
inline float max(float a, float b)
{
if (a > b)
return a;
return b;
}
void nxGraph::AddXY(unsigned char Line, float x, float y, bool visible)
{
int py = (Top + Height - BOTTOM_SHIFT) - (y * ((Height - BOTTOM_SHIFT) / YScale));
int px = Left + (int(x) % int(XScale)) * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT;
if ((y < YMin + YScale) && (y >= YMin) && visible)
{
if (Mode == GRAPH_LINES)
{
if (PrevX[Line])
{
if (py == PrevY[Line])
GUI_DrawHLine(py, min(PrevX[Line], px), max(PrevX[Line], px));
else
{
if (px == PrevX[Line])
GUI_DrawVLine(PrevX[Line], min(py, PrevY[Line]), max(py, PrevY[Line]));
else
GUI_DrawVLine(PrevX[Line], min(py, PrevY[Line]), max(py, PrevY[Line]));
GUI_DrawHLine(py, min(PrevX[Line], px), max(PrevX[Line], px));
}
}
}
else
if (Mode == GRAPH_POINTS)
{
GUI_DrawPixel(px, py);
}
}
if (x >= XScale * (Period + 1))
Redraw(NXGRAPH_REDRAW_ALL);
else
PrevX[Line] = px;
PrevY[Line] = py;
}
void nxGraph::Redraw(unsigned char Mode)
{
switch (Mode)
{
case NXGRAPH_REDRAW_ALL:
{
ClearLines();
Period++;
GUI_ClearRect(Left, Top - 5, Left + Width + 8, Top + Height); //5 ???
//draw axis
GUI_DrawVLine(Left + LEFT_SHIFT, Top, Top + Height - BOTTOM_SHIFT);
GUI_DrawVLine(Left + LEFT_SHIFT + 1, Top, Top + Height - BOTTOM_SHIFT);
GUI_DrawHLine(Top + Height - BOTTOM_SHIFT, Left + LEFT_SHIFT, Left + Width);
GUI_DrawHLine(Top + Height - BOTTOM_SHIFT - 1, Left + LEFT_SHIFT, Left + Width);
//draw frame
GUI_DrawVLine(Left + Width, Top, Top + Height - BOTTOM_SHIFT);
GUI_DrawHLine(Top, Left + LEFT_SHIFT, Left + Width);
GUI_SetFont(&GUI_Font6x8);
GUI_SetLineStyle(GUI_LS_DOT);
//draw vertical separators and labels on X-axis
for (float i = 0.0; i <= XScale; i += XStep)
{
//GUI_DrawVLine(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top, Top + Height - BOTTOM_SHIFT);
GUI_DrawLine(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top, Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT, Top + Height - BOTTOM_SHIFT);
GUI_GotoXY(int(Left + i * ((Width - LEFT_SHIFT) / XScale) + LEFT_SHIFT - 8), int((Top + Height - BOTTOM_SHIFT) + 5));
GUI_DispDecSpace(int(i + (XScale *Period)), 3);
}
//draw horizontal separators and labels on Y-axis
for (float i = 0.0; i <= YScale; i+= YStep)
{
//GUI_DrawHLine((Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)), Left + LEFT_SHIFT, Left + Width);
GUI_DrawLine(Left + LEFT_SHIFT, (Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)), Left + Width, (Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)));
GUI_GotoXY(int(Left), int((Top + Height - BOTTOM_SHIFT) - (i * ((Height - BOTTOM_SHIFT) / YScale)) - 5));
if (YScale > 1.0)
GUI_DispDecSpace(int(i), 5); //for large-scale graphs
else
GUI_DispFloatMin(i, 3); //for small-scale graphs
}
//draw markers
GUI_FillPolygon(MarkerPoints, 3, Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker1 * ((Height - BOTTOM_SHIFT) / YScale)));
GUI_FillPolygon(MarkerPoints, 3, Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker2 * ((Height - BOTTOM_SHIFT) / YScale)));
GUI_FillPolygon(MarkerPoints, 3, Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker3 * ((Height - BOTTOM_SHIFT) / YScale)));
GUI_SetLineStyle(GUI_LS_DASH);
GUI_DrawLine(Left + LEFT_SHIFT, (Top + Height - BOTTOM_SHIFT) - (Marker1 * ((Height - BOTTOM_SHIFT) / YScale)), Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker1 * ((Height - BOTTOM_SHIFT) / YScale)));
GUI_DrawLine(Left + LEFT_SHIFT, (Top + Height - BOTTOM_SHIFT) - (Marker2 * ((Height - BOTTOM_SHIFT) / YScale)), Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker2 * ((Height - BOTTOM_SHIFT) / YScale)));
GUI_DrawLine(Left + LEFT_SHIFT, (Top + Height - BOTTOM_SHIFT) - (Marker3 * ((Height - BOTTOM_SHIFT) / YScale)), Left + Width, (Top + Height - BOTTOM_SHIFT) - (Marker3 * ((Height - BOTTOM_SHIFT) / YScale)));
GUI_SetLineStyle(GUI_LS_SOLID);
break;
}
}
}
nxGraph::~nxGraph()
{
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -