我想实现一个视图标尺用于工控显示采集到的数据。
具体是这样的,y值的范围是:-2000 ~ +2000 最小刻度为0.001
随着视图缩放调整刻度而调整,刻度步长为以下几种值:
500 50 5 0.5 0.05 0.005 
200 20 2 0.2 0.02 0.002
100 10 1 0.1 0.01 0.001
求法如下:那位有更好的求法?
delta=0; a=500;b=200;c=100
RangeY = value;
while(1)
{
   if ( 2 < RangeY/a < 9)
      {
         delta=a;break;
      }
   else if ( 2 < RangeY/b < 9)
           {
             delta=b;break;
           }
   else if (2 < RangeY/c < 9)
           {
             delta=c;break;
           }   a /=10; b/=10; c/=10;
}
比如说-13 ~ 17 找到步长为5
这时的刻度为:(刻度为步长的整数倍)
-10 -5 0 5 10 15
而不是
-13 -8 -3 2 7 12 17
怎么到第一个显示的刻度-10呢?
大家能提供一个算法吗?

解决方案 »

  1.   

    看的有点迷糊
    RangeY 是指什么??
    举例,对于 数据 -13 -8 -3 2 7 12 17  RangeY=??30
    -13大的最小的5的倍数不是很简单吗??
    (-13)-(-13)%5
      

  2.   

    Example
    CFile myFile("myfile.dat", CFile::modeCreate | CFile::modeReadWrite);// Create a storing archive.
    CArchive arStore(&myFile, CArchive::store);// Store the class CAge in the archive.
    arStore.WriteClass( RUNTIME_CLASS(CAge) );// Close the storing archive.
    arStore.Close();// Create a loading archive.
    myFile.SeekToBegin();
    CArchive arLoad(&myFile, CArchive::load);// Load a class from the archive.
    CRuntimeClass* pClass = arLoad.ReadClass( );
    if (!pClass->IsDerivedFrom(RUNTIME_CLASS(CAge)))
          arLoad.Abort();
      

  3.   

    RangeY是要数值范围,也就是要在整个视图范围内显示的Y轴的数值范围.比如[-13, 17](在Y轴)就是视图的底部对应-13,视图的最高处对应17.但我画刻度的时候是在-10. -5 ....15这样的画刻度.不知道我说明白了没有
      

  4.   

    贴错了莫怪。你这个就是简单计算一下就行了。比如:int i = -13;
    int y = i / 5 * 5; //注意:整数除法,-13 / 5 = -2
      

  5.   

    有作这类软件的吗?能一起讨论讨论吗? [email protected]
      

  6.   

    之前有问过这样的问题的:
    http://community.csdn.net/Expert/topic/4330/4330922.xml?temp=.1156732
    我也间或琢磨了一阵子,继续努力。
    delphi里头有个自带的控件DBChart就完全实现了这样的功能。