[Kst] [Bug 88337] hysteresis for tick density would be nice

Andrew Walker arwalker at sumusltd.com
Fri Sep 3 19:16:26 CEST 2004


------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
        
http://bugs.kde.org/show_bug.cgi?id=88337        
arwalker sumusltd com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |FIXED



------- Additional Comments From arwalker sumusltd com  2004-09-03 19:16 -------
CVS commit by arwalker: 

Provide some hysteresis in the tick seperation. This is designed only to solve the problem of the y-axis tick spacing jumping in value following a small change in the max-min difference of the curve. For other scenarios, where the difference change is more extreme, a fixed scale should be set by the user.

CCMAIL: 88337-done bugs kde org


  M +32 -13    kst2dplot.cpp   1.258
  M +3 -1      kst2dplot.h   1.106


--- kdeextragear-2/kst/kst/kst2dplot.cpp  #1.257:1.258
 @ -42,4 +42,5  @
 
 #define MAX_NUM_POLYLINES     1000
+#define TICK_HYSTERESIS_FACTOR  2.0
 #define DIFFERENCE_PRECISION  7
 #define LABEL_PRECISION       9
 @ -325,4 +326,6  @ void Kst2DPlot::commonConstructor(const 
   _xLog = x_log;
   _yLog = y_log;
+  _tickYLast = 0.0;
+  _stLast = 0.0;
 
   setTagName(in_tag);
 @ -1890,6 +1893,6  @ void Kst2DPlot::GenerateDefaultLabels() 
 void Kst2DPlot::setTicks(double& tick, double& org,
                        double max, double min, bool is_log, bool isX) {
-  double St,Mant1,Mant2;  // used to generate tick interval
-  double Exp,Log,FLog;    // used to generate tick interval
+  double St=0.0;
+  double Exp,Mant1,Mant2;  // used to generate tick interval
   int auto_tick = 5;
   int majorDensity = isX ? _xMajorTicks : _yMajorTicks;
 @ -1898,13 +1901,15  @ void Kst2DPlot::setTicks(double& tick, d
     tick = 1.0;
   } else {
-    /* Determine tick Interval */
-    St = (max - min) / (double)majorDensity;       /* ticks */
-    Log = log10(St);
-    FLog = floor(Log);
-    Exp = pow(10.0, FLog);
+    //
+    // determine tick interval...
+    //
+    St = (max - min) / (double)majorDensity;
+    Exp = pow(10.0, floor(log10(St)));
     Mant1 = fabs(Exp - St) < fabs(2.0 * Exp - St) ? Exp : 2.0 * Exp;
     Mant2 = fabs(5.0 * Exp - St) < fabs(10.0 * Exp - St) ? 5.0 * Exp : 10.0 * Exp;
     tick = fabs(Mant1 - St) < fabs(Mant2 - St) ? Mant1 : Mant2;
-    if (tick==2.0*Exp) auto_tick=4;
+    if (tick == 2.0*Exp) {
+      auto_tick = 4;
+    }
   }
 
 @ -1923,4 +1928,12  @ void Kst2DPlot::setTicks(double& tick, d
   }
 
+  if (!isX && St != 0.0) {
+    if (is_log == _isLogLast && _stLast != 0.0) {
+      if (St/_stLast < TICK_HYSTERESIS_FACTOR && St/_stLast > 1.0/TICK_HYSTERESIS_FACTOR) {
+        tick = _tickYLast;
+      }
+    }
+  }
+  
   /* Determine Location of Origin */
   if (min > 0.0) {
 @ -1931,4 +1944,10  @ void Kst2DPlot::setTicks(double& tick, d
     org = 0.0;
   }
+
+  if (!isX) {
+    _stLast    = St;
+    _tickYLast = tick;
+    _isLogLast = is_log;
+  }                   
 }
 

--- kdeextragear-2/kst/kst/kst2dplot.h  #1.105:1.106
 @ -364,4 +364,6  @ private:
   QRect _oldAlignment;
   double _m_X, _b_X, _m_Y, _b_Y;
+  double _tickYLast, _stLast;
+  bool _isLogLast;
 
   //the list of more than one image



More information about the Kst mailing list