implement AQDG_GRAPH_TYPE_STEPLINE

This commit is contained in:
Martin Preuss
2025-10-02 23:07:15 +02:00
parent bf0be75ba1
commit 625162bb3c

View File

@@ -34,12 +34,6 @@ static void _drawCurves(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc);
static void _drawCurve(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, static void _drawCurve(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY, double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen); int pen);
static void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen);
static void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen);
static void _drawVerticalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc); static void _drawVerticalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc);
static void _drawHorizontalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc); static void _drawHorizontalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc);
static int _screenDistBetweenLevelTicksX(const AQDG_GRAPH_TICK_LIST *tickList, int lvl, static int _screenDistBetweenLevelTicksX(const AQDG_GRAPH_TICK_LIST *tickList, int lvl,
@@ -47,6 +41,16 @@ static int _screenDistBetweenLevelTicksX(const AQDG_GRAPH_TICK_LIST *tickList, i
static int _screenDistBetweenLevelTicksY(const AQDG_GRAPH_TICK_LIST *tickList, int lvl, static int _screenDistBetweenLevelTicksY(const AQDG_GRAPH_TICK_LIST *tickList, int lvl,
int contentSize, double minValue, double maxValue); int contentSize, double minValue, double maxValue);
static void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen);
static void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen);
static void _drawCurveStepLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen);
/* ------------------------------------------------------------------------------------------------ /* ------------------------------------------------------------------------------------------------
@@ -185,6 +189,9 @@ void _drawCurve(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *c
case AQDG_GRAPH_TYPE_POINTS: case AQDG_GRAPH_TYPE_POINTS:
_drawCurvePoints(o, dc, curve, minValueX, maxValueX, minValueY, maxValueY, pen); _drawCurvePoints(o, dc, curve, minValueX, maxValueX, minValueY, maxValueY, pen);
break; break;
case AQDG_GRAPH_TYPE_STEPLINE:
_drawCurveStepLines(o, dc, curve, minValueX, maxValueX, minValueY, maxValueY, pen);
break;
case AQDG_GRAPH_TYPE_BARS: case AQDG_GRAPH_TYPE_BARS:
default: default:
break; break;
@@ -193,87 +200,6 @@ void _drawCurve(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *c
void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen)
{
int width;
int height;
const AQDG_GRAPH_DATAPAIR_LIST *dpList;
const AQDG_GRAPH_DATAPAIR *dp;
int absX;
int absY;
int lastX=-1;
int lastY=-1;
absX=AQDG_Object_GetAbsoluteX(o);
absY=AQDG_Object_GetAbsoluteY(o);
width=AQDG_Object_GetWidth(o);
height=AQDG_Object_GetHeight(o);
dpList=AQDG_Graph_Curve_GetDataPairs(curve);
dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL;
while(dp) {
int xPos;
int yPos;
double xValue;
double yValue;
xValue=AQDG_Graph_DataPair_GetValueX(dp);
yValue=AQDG_Graph_DataPair_GetValueY(dp);
xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX);
yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY);
if (lastX>=0 && lastY>=0)
AQDG_Draw_Context_DrawLine(dc, pen, absX+lastX, absY+lastY, absX+xPos, absY+yPos);
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos-2, absX+xPos+2, absY+yPos+2);
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos+2, absX+xPos+2, absY+yPos-2);
lastX=xPos;
lastY=yPos;
dp=AQDG_Graph_DataPair_List_Next(dp);
}
}
void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen)
{
int width;
int height;
const AQDG_GRAPH_DATAPAIR_LIST *dpList;
const AQDG_GRAPH_DATAPAIR *dp;
int absX;
int absY;
absX=AQDG_Object_GetAbsoluteX(o);
absY=AQDG_Object_GetAbsoluteY(o);
width=AQDG_Object_GetWidth(o);
height=AQDG_Object_GetHeight(o);
dpList=AQDG_Graph_Curve_GetDataPairs(curve);
dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL;
while(dp) {
int xPos;
int yPos;
double xValue;
double yValue;
xValue=AQDG_Graph_DataPair_GetValueX(dp);
yValue=AQDG_Graph_DataPair_GetValueY(dp);
xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX);
yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY);
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-4, absY+yPos-4, absX+xPos+4, absY+yPos+4);
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-4, absY+yPos+4, absX+xPos+4, absY+yPos-4);
dp=AQDG_Graph_DataPair_List_Next(dp);
}
}
void _drawVerticalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc) void _drawVerticalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc)
{ {
AQDG_WIDGET_VIEWPORT *xo; AQDG_WIDGET_VIEWPORT *xo;
@@ -418,3 +344,138 @@ int _screenDistBetweenLevelTicksY(const AQDG_GRAPH_TICK_LIST *tickList, int lvl,
/* ------------------------------------------------------------------------------------------------
* graph drawing
* ------------------------------------------------------------------------------------------------
*/
void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen)
{
int width;
int height;
const AQDG_GRAPH_DATAPAIR_LIST *dpList;
const AQDG_GRAPH_DATAPAIR *dp;
int absX;
int absY;
int lastX=-1;
int lastY=-1;
absX=AQDG_Object_GetAbsoluteX(o);
absY=AQDG_Object_GetAbsoluteY(o);
width=AQDG_Object_GetWidth(o);
height=AQDG_Object_GetHeight(o);
dpList=AQDG_Graph_Curve_GetDataPairs(curve);
dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL;
while(dp) {
int xPos;
int yPos;
double xValue;
double yValue;
xValue=AQDG_Graph_DataPair_GetValueX(dp);
yValue=AQDG_Graph_DataPair_GetValueY(dp);
xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX);
yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY);
if (lastX>=0 && lastY>=0)
AQDG_Draw_Context_DrawLine(dc, pen, absX+lastX, absY+lastY, absX+xPos, absY+yPos);
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos-2, absX+xPos+2, absY+yPos+2);
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos+2, absX+xPos+2, absY+yPos-2);
lastX=xPos;
lastY=yPos;
dp=AQDG_Graph_DataPair_List_Next(dp);
}
}
void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen)
{
int width;
int height;
const AQDG_GRAPH_DATAPAIR_LIST *dpList;
const AQDG_GRAPH_DATAPAIR *dp;
int absX;
int absY;
absX=AQDG_Object_GetAbsoluteX(o);
absY=AQDG_Object_GetAbsoluteY(o);
width=AQDG_Object_GetWidth(o);
height=AQDG_Object_GetHeight(o);
dpList=AQDG_Graph_Curve_GetDataPairs(curve);
dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL;
while(dp) {
int xPos;
int yPos;
double xValue;
double yValue;
xValue=AQDG_Graph_DataPair_GetValueX(dp);
yValue=AQDG_Graph_DataPair_GetValueY(dp);
xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX);
yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY);
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-4, absY+yPos-4, absX+xPos+4, absY+yPos+4);
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-4, absY+yPos+4, absX+xPos+4, absY+yPos-4);
dp=AQDG_Graph_DataPair_List_Next(dp);
}
}
void _drawCurveStepLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve,
double minValueX, double maxValueX, double minValueY, double maxValueY,
int pen)
{
int width;
int height;
const AQDG_GRAPH_DATAPAIR_LIST *dpList;
const AQDG_GRAPH_DATAPAIR *dp;
int absX;
int absY;
int lastX=-1;
int lastY=-1;
absX=AQDG_Object_GetAbsoluteX(o);
absY=AQDG_Object_GetAbsoluteY(o);
width=AQDG_Object_GetWidth(o);
height=AQDG_Object_GetHeight(o);
dpList=AQDG_Graph_Curve_GetDataPairs(curve);
dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL;
while(dp) {
int xPos;
int yPos;
double xValue;
double yValue;
xValue=AQDG_Graph_DataPair_GetValueX(dp);
yValue=AQDG_Graph_DataPair_GetValueY(dp);
xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX);
yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY);
if (lastX>=0 && lastY>=0) {
AQDG_Draw_Context_DrawLine(dc, pen, absX+lastX, absY+lastY, absX+xPos, absY+lastY);
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos, absY+lastY, absX+xPos, absY+yPos);
}
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos-2, absX+xPos+2, absY+yPos+2);
AQDG_Draw_Context_DrawLine(dc, pen, absX+xPos-2, absY+yPos+2, absX+xPos+2, absY+yPos-2);
lastX=xPos;
lastY=yPos;
dp=AQDG_Graph_DataPair_List_Next(dp);
}
}