From fb6af5ef1b0c9d4adcd6aac785742f4e4106c0c8 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Tue, 30 Dec 2025 10:44:57 +0100 Subject: [PATCH] implemented vertical bars graph. --- src/lib/aqdiagram/graph/w_viewport.c | 98 +++++++++++++++++++++++----- 1 file changed, 83 insertions(+), 15 deletions(-) diff --git a/src/lib/aqdiagram/graph/w_viewport.c b/src/lib/aqdiagram/graph/w_viewport.c index 8ab492c..eb612a0 100644 --- a/src/lib/aqdiagram/graph/w_viewport.c +++ b/src/lib/aqdiagram/graph/w_viewport.c @@ -40,6 +40,7 @@ static int _screenDistBetweenLevelTicksX(const AQDG_GRAPH_TICK_LIST *tickList, i int contentSize, double minValue, double maxValue); static int _screenDistBetweenLevelTicksY(const AQDG_GRAPH_TICK_LIST *tickList, int lvl, int contentSize, double minValue, double maxValue); +static int _distToScreenDist(int contentSize, double minValue, double maxValue, double value); static void _drawCurveLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, double minValueX, double maxValueX, double minValueY, double maxValueY, @@ -50,6 +51,9 @@ static void _drawCurvePoints(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_G 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); +static void _drawCurveVertBars(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen); @@ -193,6 +197,8 @@ void _drawCurve(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *c _drawCurveStepLines(o, dc, curve, minValueX, maxValueX, minValueY, maxValueY, pen); break; case AQDG_GRAPH_TYPE_BARS: + _drawCurveVertBars(o, dc, curve, minValueX, maxValueX, minValueY, maxValueY, pen); + break; default: break; } @@ -327,12 +333,7 @@ void _drawHorizontalGrid(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc) int _screenDistBetweenLevelTicksX(const AQDG_GRAPH_TICK_LIST *tickList, int lvl, int contentSize, double minValue, double maxValue) { - double v; - int pts; - - v=AQDG_Graph_Tick_List_DistanceBetweenTicks(tickList, lvl); - pts=(v*(contentSize/(maxValue-minValue))); - return pts; + return _distToScreenDist(contentSize, minValue, maxValue, AQDG_Graph_Tick_List_DistanceBetweenTicks(tickList, lvl)); } @@ -343,20 +344,23 @@ int _screenDistBetweenLevelTicksY(const AQDG_GRAPH_TICK_LIST *tickList, int lvl, const AQDG_GRAPH_TICK *firstLevelTick; firstLevelTick=AQDG_Graph_Tick_List_GetFirstTickForLevel(tickList, lvl); - if (firstLevelTick) { - double v; - int pts; - - v=AQDG_Graph_Tick_GetLevelDist(firstLevelTick); - pts=(v*(contentSize/(maxValue-minValue))); - DBG_ERROR(NULL, "Level dist %d: %d", lvl, pts); - return pts; - } + if (firstLevelTick) + return _distToScreenDist(contentSize, minValue, maxValue, AQDG_Graph_Tick_GetLevelDist(firstLevelTick)); return 0; } +int _distToScreenDist(int contentSize, double minValue, double maxValue, double value) +{ + int pts; + + pts=(value*(contentSize/(maxValue-minValue))); + return pts; +} + + + @@ -489,6 +493,70 @@ void _drawCurveStepLines(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH +void _drawCurveVertBars(AQDG_OBJECT *o, AQDG_DRAW_CONTEXT *dc, const AQDG_GRAPH_CURVE *curve, + double minValueX, double maxValueX, double minValueY, double maxValueY, + int pen) +{ + const AQDG_GRAPH_DATAPAIR_LIST *dpList; + const AQDG_GRAPH_DATAPAIR *dp; + + dpList=AQDG_Graph_Curve_GetDataPairs(curve); + dp=dpList?AQDG_Graph_DataPair_List_First(dpList):NULL; + if (dp) { + int width; + int height; + int absX; + int absY; + double valueMinDist; + int barWidth; + double baseLineValueY; + int baseLinePosY; + + absX=AQDG_Object_GetAbsoluteX(o); + absY=AQDG_Object_GetAbsoluteY(o); + width=AQDG_Object_GetWidth(o); + height=AQDG_Object_GetHeight(o); + valueMinDist=AQDG_Graph_DataPair_List_GetMinDiffX(dpList); + barWidth=_distToScreenDist(width, minValueX, maxValueX, (valueMinDist*5.0)/6.0); + + if (maxValueY<0.0) + baseLineValueY=maxValueY; + else if (minValueY>0.0) + baseLineValueY=minValueY; + else + baseLineValueY=0.0; + baseLinePosY=_calcVerticalPos(baseLineValueY, height, minValueY, maxValueY); + +#if 0 + DBG_ERROR(NULL, + "valueMinDist=%.2f, barWidth=%d, baseLineValueY=%.2f, baseLinePosY=%d", + valueMinDist, barWidth, baseLineValueY, baseLinePosY); +#endif + while(dp) { + int xPos; + int yPos; + int h; + double xValue; + double yValue; + + xValue=AQDG_Graph_DataPair_GetValueX(dp); + yValue=AQDG_Graph_DataPair_GetValueY(dp); + + xPos=_calcHorizontalPos(xValue, width, minValueX, maxValueX)-barWidth/2; + yPos=_calcVerticalPos(yValue, height, minValueY, maxValueY); + h=baseLinePosY-yPos; + if (h<0) { + yPos+=h; + h=-h; + } + AQDG_Draw_Context_DrawFilledRect(dc, pen, absX+xPos, absY+yPos, barWidth, h); + dp=AQDG_Graph_DataPair_List_Next(dp); + } + } +} + + +