regular_grid.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: regular_grid.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 20:49:34  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: regular_grid.cpp,v 1000.3 2004/06/01 20:49:34 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Andrey Yazhuk
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/graph/regular_grid.hpp>
  41. #include <math.h>
  42. BEGIN_NCBI_SCOPE
  43. #define DEF_MIN_CELL_SIZE 30
  44. #define DEF_MAX_CELL_SIZE 75
  45. const int  CRegularGridGen::ms_StepK[] = { 2, 5, 10 };
  46. CRegularGridGen::CRegularGridGen()
  47. :   m_MinCellSize(DEF_MIN_CELL_SIZE),
  48.     m_MaxCellSize(DEF_MAX_CELL_SIZE),
  49. //    m_XScaleType(eDec), m_YScaleType(eDec),
  50.     m_IntegerX(false), m_IntegerY(false),
  51.     m_bHorz(true),
  52.     m_Start(0), m_Finish(0),
  53.     m_Step(0)
  54. {
  55. }
  56. CRegularGridGen::~CRegularGridGen()
  57. {
  58. }
  59. /*void CRegularGridGen::SetScaleType(EScaleType TypeX, EScaleType TypeY)
  60. {
  61.     m_XScaleType = TypeX;
  62.     m_YScaleType = TypeY;
  63. }*/
  64. void CRegularGridGen::SetIntegerMode(bool IntegerX, bool IntegerY) 
  65.     m_IntegerX = IntegerX; 
  66.     m_IntegerY = IntegerY; 
  67. }
  68. void    CRegularGridGen::EnableOneBased(bool en_x, bool en_y)
  69. {
  70.     m_OneBasedX = en_x;
  71.     m_OneBasedY = en_y;
  72. }
  73. // set limitations on the CellSize in pixels
  74. void    CRegularGridGen::SetCellLimits(int Min, int Max)
  75. {
  76.     m_MinCellSize = Min;  m_MaxCellSize = Max;
  77. }
  78. void    CRegularGridGen::GenerateGrid(CGlPane* pGraphPane, bool bHorz)
  79. {
  80.     m_bHorz = bHorz;
  81.     bool bInteger = m_bHorz ? m_IntegerX : m_IntegerY;
  82.     TModelRect rcVisible = pGraphPane->GetVisibleRect();
  83.     m_Start = m_bHorz ? rcVisible.Left() : rcVisible.Bottom();
  84.     m_Finish = m_bHorz ? rcVisible.Right() : rcVisible.Top();
  85.     m_Step = 1;
  86.     if(m_Finish > m_Start)
  87.     {
  88.         double BaseStep = SelectBaseStep(m_Start, m_Finish);      
  89.         double MinCell = m_bHorz ? pGraphPane->UnProjectWidth(m_MinCellSize)
  90.                                     : pGraphPane->UnProjectHeight(m_MinCellSize);
  91.         double MaxCell = m_bHorz ? pGraphPane->UnProjectWidth(m_MaxCellSize)
  92.                                     : pGraphPane->UnProjectHeight(m_MaxCellSize);
  93.         
  94.         m_Step = SelectScreenStep(BaseStep, MinCell, MaxCell);
  95.   
  96.         if(bInteger && m_Step < 1.0)   
  97.             m_Step = 1.0;     
  98.         double BaseOrigin = ceil(m_Start / m_Step) - 1; 
  99.         
  100.         BaseOrigin *= m_Step;
  101.         if((bHorz  &&  m_OneBasedX)  ||  (! bHorz  &&  m_OneBasedY))  {
  102.             BaseOrigin++;
  103.         }
  104.         m_Start = BaseOrigin;
  105.     } else {
  106.         //range Start - Finish is empty, make it negtaive (not iterable)
  107.         m_Finish = m_Start - 1;
  108.     }
  109. }
  110. CRegularGridGen::const_iterator CRegularGridGen::begin() const
  111. {
  112.     return const_iterator(m_Start, m_Finish, m_Step);
  113. }
  114. CRegularGridGen::const_iterator CRegularGridGen::end() const
  115. {
  116.     return const_iterator();
  117. }
  118. // function calculates "sensible" step for representing labels, drawing gris etc. on graphs
  119. // minV and MaxV define range of values to be represented
  120. // it is assumed that desired number of "ticks" ( BaseStep is a difference between two neighbour ticks)
  121. // should be between 8 and 20.
  122. double  CRegularGridGen::SelectBaseStep(double MinV, double MaxV )
  123. {
  124.     double Range = MaxV - MinV;
  125.     double logRange = log10(Range);
  126.     logRange = ceil(logRange) - 1;
  127.     double Step = pow(10.0, logRange);
  128.     // selcting BaseStep as step divided by 1, 2 or 5
  129.     double BaseStep = Step;
  130.     double nTicks = Range / BaseStep;
  131.     int i=0;
  132.     while( nTicks < 8 )
  133.     {
  134.         BaseStep = Step / ms_StepK[i++];
  135.         nTicks = Range / BaseStep;
  136.     }
  137.     return BaseStep;
  138. }
  139. void  CRegularGridGen::RoundRangeToStep(double& Start, double& Finish, double Step )
  140. {
  141.     double V = Start;
  142.     V = floor(V / Step) * Step;
  143.     Start = V;
  144.     V = Finish;
  145.     V = ceil(V / Step) * Step;
  146.     Finish = V;
  147. }
  148. // Scale = Pixels per Unit
  149. // return optimal step values calculated on the basis of given BaseStep, MinStep and MaxStep 
  150. //(corresponding to min and max cell size in pixels respectively)
  151. double CRegularGridGen::SelectScreenStep(double BaseStep,  double MinStep, double MaxStep )
  152. {
  153.     if ((BaseStep >= MinStep && BaseStep <= MaxStep) || (MinStep == MaxStep))  
  154.         return BaseStep;
  155.     else {
  156.         // BaseStep has a form M * pow(10, P), where P is power
  157.         double Power = log10(BaseStep);
  158.         double P = ceil(Power) -1;
  159.         double pow10P = pow(10.0, P);
  160.         double M = BaseStep / pow10P;      
  161.         if (M >= 10) {
  162.             M /= 10;  
  163.             pow10P *= 10;    
  164.         }
  165.         int oldK = 1, K = 1, Index = 0;
  166.         if(BaseStep < MinStep) // increasing BaseStep to make it more then minPix
  167.         {
  168.             double minK = MinStep / pow10P;  
  169.             while (K < minK)
  170.             {
  171.                 if(Index <2)  
  172.                     K = oldK * ms_StepK[Index++];
  173.                 else {
  174.                     K = oldK = oldK * 10;
  175.                     Index = 0;
  176.                 }
  177.             }
  178.             BaseStep = pow10P * K;
  179.         } else if (BaseStep > MaxStep) { // decreasing BaseStep to make it less then maxPix
  180.             pow10P *= 10;
  181.             double maxK = pow10P / MaxStep;
  182.             while (K < maxK)
  183.             {
  184.                 if(Index <2)  
  185.                     K = oldK * ms_StepK[Index++];
  186.                 else {
  187.                     K = oldK = oldK * 10;
  188.                     Index = 0;
  189.                 }
  190.             }
  191.             BaseStep = pow10P / K;
  192.         }
  193.         return BaseStep;
  194.     }
  195. }
  196. CRegularGridRenderer::CRegularGridRenderer()
  197. :   m_bCentering(false),
  198.     m_Color(0.8f, 0.8f, 0.8f)
  199. {
  200. }
  201. void   CRegularGridRenderer::Render(CGlPane* pAreaPane, CGlPane* pGraphPane, CRegularGridGen* pGenerator)
  202. {
  203.     // in order for CGlPane::Project() to work we need to initilize graph pane
  204.     pGraphPane->OpenOrtho();
  205.     pGraphPane->Close();
  206.     
  207.     pAreaPane->OpenPixels();
  208.     
  209.     TVPRect   rcVP = pGraphPane->GetViewport();
  210.     double vpBottom = rcVP.Bottom();
  211.     double vpTop = rcVP.Top();
  212.     double vpLeft = rcVP.Left();
  213.     double vpRight = rcVP.Right();
  214.     
  215.     glColorC(m_Color);
  216.     glLineWidth(1.0);
  217.     
  218.     glBegin(GL_LINES);    
  219.     
  220.     double d = m_bCentering ? 0.5 : 0.0;
  221.     // horizontal grid (vert. lines)
  222.     pGenerator->GenerateGrid(pGraphPane, true);
  223.     ITERATE(CRegularGridGen, it, *pGenerator) {
  224.         double X = *it + d;
  225.         int vpX = pGraphPane->ProjectX(X);
  226.         if (vpX >= vpLeft && vpX <= vpRight) {
  227.             glVertex2d(vpX, vpBottom);
  228.             glVertex2d(vpX, vpTop);
  229.         }
  230.     }
  231.     
  232.     // vertical grid (horz. lines)    
  233.     pGenerator->GenerateGrid(pGraphPane, false);
  234.     ITERATE(CRegularGridGen, it, *pGenerator) {
  235.         double Y = *it + d;
  236.         int vpY = pGraphPane->ProjectY(Y);
  237.         if (vpY >= vpBottom && vpY <= vpTop) {
  238.             glVertex2d(vpLeft, vpY);
  239.             glVertex2d(vpRight, vpY);
  240.         }
  241.     }
  242.     glEnd();
  243.     pAreaPane->Close();
  244. }
  245. END_NCBI_SCOPE
  246. /*
  247.  * ===========================================================================
  248.  * $Log: regular_grid.cpp,v $
  249.  * Revision 1000.3  2004/06/01 20:49:34  gouriano
  250.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  251.  *
  252.  * Revision 1.7  2004/05/21 22:27:42  gorelenk
  253.  * Added PCH ncbi_pch.hpp
  254.  *
  255.  * Revision 1.6  2004/03/19 14:56:43  gorelenk
  256.  * Fixed compilation errors on MSVC 7.10
  257.  *
  258.  * Revision 1.5  2003/11/17 20:30:05  yazhuk
  259.  * Added support one-based grids and centering
  260.  *
  261.  * Revision 1.4  2003/08/14 17:57:45  yazhuk
  262.  * Deleted CRegularGrid class
  263.  *
  264.  * Revision 1.3  2003/08/11 16:10:57  yazhuk
  265.  * Compilation fixes for GCC
  266.  *
  267.  * Revision 1.2  2003/08/08 15:59:36  yazhuk
  268.  * Comments added
  269.  *
  270.  * ===========================================================================
  271.  */
  272.