From 7d139093df2382cb6f8a206d5a68b4e7351cc63b Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Sun, 4 Jan 2026 15:09:10 +0100 Subject: [PATCH] fixed axis ticks mainly used for y-axis. --- src/lib/aqdiagram/graph/axis.t2d | 152 ++++++++++++++++++++++--------- 1 file changed, 107 insertions(+), 45 deletions(-) diff --git a/src/lib/aqdiagram/graph/axis.t2d b/src/lib/aqdiagram/graph/axis.t2d index 733c376..752ed1e 100644 --- a/src/lib/aqdiagram/graph/axis.t2d +++ b/src/lib/aqdiagram/graph/axis.t2d @@ -52,6 +52,92 @@ + + + static int _genLog10TicksUp($(struct_type) *st, \n + double vStep, \n + double vBegin, double vEnd, \n + int level, \n + int precision) \n + { \n + double vRun; \n + GWEN_BUFFER *dbuf; \n + \n + dbuf=GWEN_Buffer_new(0, 256, 0, 1); \n + vRun=vBegin; \n + while(vRun<=vEnd) { \n + if (vRun>=vBegin) { \n + if (!$(struct_prefix)_HasTickValue(st, vRun)) { \n + GWEN_Buffer_AppendArgs(dbuf, "%.*f", precision, vRun); \n + $(struct_prefix)_AddNewTick(st, GWEN_Buffer_GetStart(dbuf), vRun, level, 0, vStep); \n + DBG_INFO(NULL, "Adding tick %d: %s", level, GWEN_Buffer_GetStart(dbuf)); \n + GWEN_Buffer_Reset(dbuf); \n + } \n + } \n + vRun+=vStep; \n + } \n + GWEN_Buffer_free(dbuf); \n + return ($(struct_prefix)_HasAtLeastNLevelTicks(st, level, level?1:4))?1:0; \n + } \n + + + + + + + static int _genLog10TicksDown($(struct_type) *st, \n + double vStep, \n + double vBegin, double vEnd, \n + int level, \n + int precision) \n + { \n + double vRun; \n + GWEN_BUFFER *dbuf; \n + \n + dbuf=GWEN_Buffer_new(0, 256, 0, 1); \n + vRun=vBegin; \n + while(vRun>=vEnd) { \n + if (vRun<=vBegin) { \n + if (!$(struct_prefix)_HasTickValue(st, vRun)) { \n + GWEN_Buffer_AppendArgs(dbuf, "%.*f", precision, vRun); \n + $(struct_prefix)_AddNewTick(st, GWEN_Buffer_GetStart(dbuf), vRun, level, 0, vStep); \n + DBG_INFO(NULL, "Adding tick %d: %s", level, GWEN_Buffer_GetStart(dbuf)); \n + GWEN_Buffer_Reset(dbuf); \n + } \n + } \n + vRun-=vStep; \n + } \n + GWEN_Buffer_free(dbuf); \n + return ($(struct_prefix)_HasAtLeastNLevelTicks(st, level, level?1:4))?1:0; \n + } \n + + + + + + + static int _genLog10Ticks($(struct_type) *st, \n + double vStart, \n + double vStep, \n + double vMin, double vMax, \n + int level, \n + int precision) \n + { \n + if (vMin<0.0 && vMax>=0.0) { \n + int rv; \n + \n + rv=_genLog10TicksUp(st, vStep, 0.0, vMax, level, precision); \n + rv|=_genLog10TicksDown(st, vStep, 0.0, vMin, level, precision); \n + return rv; \n + } \n + else if (vMin<0.0 && vMax<=0.0) \n + return _genLog10TicksDown(st, vStep, vStart, vMin, level, precision); \n + else \n + return _genLog10TicksUp(st, vStep, vStart, vMax, level, precision); \n + } \n + + + @@ -65,68 +151,44 @@ { \n double absMaxValue; \n double v; \n - double vRun; \n - double startValue; \n - GWEN_BUFFER *dbuf; \n + double vMin; \n + double vMax; \n + double vStart; \n int nextLevel=0; \n \n - absMaxValue=abs(st->minValue); \n - v=abs(st->maxValue); \n + vMin=st->minValue; \n + vMax=st->maxValue; \n + absMaxValue=abs(vMin); \n + v=abs(vMax); \n absMaxValue=(v>absMaxValue)?v:absMaxValue; \n \n - dbuf=GWEN_Buffer_new(0, 64, 0, 1); \n if (absMaxValue==0.0) \n absMaxValue=1.0; \n v=pow(10, floor(log10(absMaxValue))); \n \n - startValue=v; \n - if ((st->minValue)<startValue) \n - startValue=-startValue; \n + vStart=v; \n + if (vMin<vStart) \n + vStart=-vStart; \n + \n + for(;;) { \n + int rv; \n \n - while(v>=0.0) { \n DBG_INFO(NULL, "Handling level %d (%.2f)", nextLevel, v); \n if (nextLevel>=3) \n break; \n - vRun=startValue; \n - while(vRun<=(st->maxValue)) { \n - if (vRun>=(st->minValue)) { \n - if (!$(struct_prefix)_HasTickValue(st, vRun)) { \n - GWEN_Buffer_AppendArgs(dbuf, "%.*f", st->precision, vRun); \n - $(struct_prefix)_AddNewTick(st, GWEN_Buffer_GetStart(dbuf), vRun, nextLevel, 0, v); \n - DBG_INFO(NULL, "Adding tick %d: %s", nextLevel, GWEN_Buffer_GetStart(dbuf)); \n - GWEN_Buffer_Reset(dbuf); \n - } \n - } \n - vRun+=v; \n - } \n + rv=_genLog10Ticks(st, vStart, v, vMin, vMax, nextLevel, st->precision); \n + if (rv) \n + nextLevel++; \n v/=2.0; \n - if ($(struct_prefix)_HasAtLeastNLevelTicks(st, nextLevel, nextLevel?1:4)) \n - nextLevel++; \n - else \n - $(struct_prefix)_RemoveLevelTicks(st, nextLevel); \n \n - DBG_INFO(NULL, "Handling level %d (%.2f)", nextLevel, v); \n if (nextLevel>=3) \n break; \n - vRun=startValue; \n - while(vRun<=(st->maxValue)) { \n - if (vRun>=(st->minValue)) { \n - if (!$(struct_prefix)_HasTickValue(st, vRun)) { \n - GWEN_Buffer_AppendArgs(dbuf, "%.*f", st->precision, vRun); \n - $(struct_prefix)_AddNewTick(st, GWEN_Buffer_GetStart(dbuf), vRun, nextLevel, 0, v); \n - DBG_INFO(NULL, "Adding tick %d: %s", nextLevel, GWEN_Buffer_GetStart(dbuf)); \n - GWEN_Buffer_Reset(dbuf); \n - } \n - } \n - vRun+=v; \n - } \n + DBG_INFO(NULL, "Handling level %d (%.2f)", nextLevel, v); \n + rv=_genLog10Ticks(st, vStart, v, vMin, vMax, nextLevel, st->precision); \n + if (rv) \n + nextLevel++; \n v/=5.0; \n - if ($(struct_prefix)_HasAtLeastNLevelTicks(st, nextLevel, nextLevel?1:4)) \n - nextLevel++; \n - else \n - $(struct_prefix)_RemoveLevelTicks(st, nextLevel); \n - } /* while */ \n - GWEN_Buffer_free(dbuf); \n + } /* for */ \n } \n