implemented vertical bars graph.
This commit is contained in:
@@ -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,17 +344,20 @@ 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;
|
||||
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;
|
||||
|
||||
v=AQDG_Graph_Tick_GetLevelDist(firstLevelTick);
|
||||
pts=(v*(contentSize/(maxValue-minValue)));
|
||||
DBG_ERROR(NULL, "Level dist %d: %d", lvl, pts);
|
||||
pts=(value*(contentSize/(maxValue-minValue)));
|
||||
return pts;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user