implemented vertical bars graph.

This commit is contained in:
Martin Preuss
2025-12-30 10:44:57 +01:00
parent d6040a6bc9
commit fb6af5ef1b

View File

@@ -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);
}
}
}