CLAM-Development
1.1
|
00001 #ifndef RulerTicks_hxx 00002 #define RulerTicks_hxx 00003 00004 #include <cmath> 00005 namespace CLAM 00006 { 00007 00008 class RulerTicks 00009 { 00010 double _min; 00011 double _max; 00012 double _markGap; 00013 double _minGap; 00014 double _width; 00015 public: 00017 void setRange(double min, double max) 00018 { 00019 _min = min; 00020 _max = max; 00021 } 00023 void setWidth(double width) 00024 { 00025 _width = width; 00026 } 00028 void setMinGap(double minGap) 00029 { 00030 _minGap = minGap; 00031 } 00032 double markOffset() const 00033 { 00034 double gap = markGap(); 00035 double ceil = std::ceil(_min/gap); 00036 if (std::fabs(ceil)<1e-5) return 0.; 00037 return ceil*gap; 00038 } 00039 double markGap() const 00040 { 00041 double mappedMinGap = std::fabs(_minGap*(_max-_min)/_width); 00042 double markGap=1; 00043 if (mappedMinGap>=1) 00044 { 00045 while (true) 00046 { 00047 if (markGap>=mappedMinGap) return markGap; 00048 if (markGap*2>=mappedMinGap) return markGap*2; 00049 if (markGap*5>=mappedMinGap) return markGap*5; 00050 markGap*=10; 00051 } 00052 } 00053 else 00054 { 00055 while (true) 00056 { 00057 if (markGap<1e-8) return 1e-8; 00058 if (markGap<mappedMinGap) return markGap; 00059 if (markGap/2<mappedMinGap) return markGap/2; 00060 if (markGap/5<mappedMinGap) return markGap/5; 00061 markGap/=10; 00062 } 00063 } 00064 return markGap; 00065 } 00066 }; 00067 00068 } // namespace CLAM 00069 00070 #endif//RulerTicks_hxx 00071