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 }
00069
00070 #endif//RulerTicks_hxx
00071