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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: scatter_graph.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:49:37  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: scatter_graph.cpp,v 1000.1 2004/06/01 20:49:37 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/scatter_graph.hpp>
  41. BEGIN_NCBI_SCOPE
  42. ///////////////////////////////////////////////////////////////////////////////
  43. /// class CScatterGraph 
  44. CScatterGraph::CScatterGraph()
  45. : m_MarkerType(CGraphDotMarker::eRect),
  46.   m_bDrawLines(true)
  47. {
  48. }
  49. CGraphDotMarker::EMarkerType  CScatterGraph::GetMarkerType()  const
  50. {
  51.     return m_MarkerType;
  52. }
  53. void    CScatterGraph::SetMarkerType(CGraphDotMarker::EMarkerType Type)
  54. {
  55.     m_MarkerType = Type;
  56. }
  57. bool    CScatterGraph::IsDrawLines() const
  58. {
  59.     return m_bDrawLines;
  60. }
  61. void    CScatterGraph::SetDrawLines(bool bDraw)
  62. {
  63.     m_bDrawLines = bDraw;
  64. }
  65. bool    CScatterGraph::SetDataSource(IGraphDataSource* pDS)
  66. {
  67.     IScatterDataSource* pScatterDS = dynamic_cast<IScatterDataSource*>(pDS);
  68.     bool bOk =  pScatterDS!= NULL;
  69.     CGraphBase::SetDataSource(bOk ? pDS : NULL);
  70.     
  71.     CalculateLimits();
  72.     return bOk;
  73. }
  74. const   TModelRect&    CScatterGraph::GetLimits()    const
  75. {
  76.     return m_Limits;
  77. }
  78. void    CScatterGraph::Render(CGlPane* pPane)
  79. {
  80.     _ASSERT(pPane);
  81.     IScatterDataSource* pSource = GetScatterDataSource();
  82.     if(pPane && pSource) {        
  83.         pPane->OpenOrtho();
  84.         try {
  85.             glColorC(m_Color);
  86.             
  87.             double MarkerW = pPane->UnProjectWidth(7);
  88.             double MarkerH = pPane->UnProjectHeight(7);
  89.             IScatterDataSource* pSource = GetScatterDataSource();
  90.             INumericArray* pArX = pSource->GetXArray();
  91.             INumericArray* pArY = pSource->GetYArray();
  92.             int ElemN = pArX->GetSize();
  93.             
  94.             // draw lines
  95.             if (m_bDrawLines) {
  96.                 glBegin(GL_LINE_STRIP);
  97.                 for( int i=0;  i<ElemN;  i++ ) {
  98.                     glVertex2d(pArX->GetElem(i), pArY->GetElem(i));
  99.                 }
  100.                 glEnd();
  101.             }
  102.             //draw Markers
  103.             if (m_MarkerType != CGraphDotMarker::eNone) {             
  104.                 TModelRect rcHit(pPane->GetVisibleRect());
  105.                 rcHit.Inflate(MarkerW, MarkerH);
  106.                 for( int i=0;  i<ElemN;  i++ ) {
  107.                     TModelUnit mX = pArX->GetElem(i);
  108.                     TModelUnit mY = pArY->GetElem(i);
  109.                     if (rcHit.PtInRect(mX, mY))
  110.                         CGraphDotMarker::RenderMarker(mX, mY, MarkerW, MarkerH, m_MarkerType);
  111.                 }
  112.             }
  113.         }
  114.         catch(...)  {
  115.             //need to trace it
  116.         }
  117.         pPane->Close();
  118.     }
  119. }
  120. void    CScatterGraph ::CalculateLimits()
  121. {
  122.     IScatterDataSource* pSource = GetScatterDataSource();
  123.     bool bEmpty = true;
  124.     if(pSource)
  125.     {
  126.         INumericArray* pArX = pSource->GetXArray();
  127.         INumericArray* pArY = pSource->GetYArray();
  128.         int ElemN = pArX->GetSize();
  129.         if(ElemN>0)
  130.         {
  131.             bEmpty = false;
  132.             TModelUnit MinX, MaxX, MinY, MaxY;
  133.             MinX = MaxX = pArX->GetElem(0);
  134.             MinY = MaxY = pArY->GetElem(0);
  135.             for( int i=1;  i<ElemN;  i++ ) {
  136.                 TModelUnit X = pArX->GetElem(i);
  137.                 TModelUnit Y = pArY->GetElem(i);
  138.                 MinX = min(MinX, X);
  139.                 MaxX = max(MaxX, X);
  140.                 MinY = min(MinY, Y);
  141.                 MaxY = max(MaxY, Y);
  142.             }            
  143.             m_Limits.Init(MinX, MinY, MaxX, MaxY);
  144.         }        
  145.     }
  146.     if(bEmpty)
  147.         m_Limits.Init(0, 0, 1, 1);
  148. }
  149. END_NCBI_SCOPE
  150. /*
  151.  * ===========================================================================
  152.  * $Log: scatter_graph.cpp,v $
  153.  * Revision 1000.1  2004/06/01 20:49:37  gouriano
  154.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  155.  *
  156.  * Revision 1.5  2004/05/21 22:27:42  gorelenk
  157.  * Added PCH ncbi_pch.hpp
  158.  *
  159.  * Revision 1.4  2003/08/11 16:10:57  yazhuk
  160.  * Compilation fixes for GCC
  161.  *
  162.  * Revision 1.3  2003/08/10 14:11:47  dicuccio
  163.  * Added makefiles for Unix projects; compilation fixes for gcc
  164.  *
  165.  * Revision 1.2  2003/08/08 15:59:36  yazhuk
  166.  * Comments added
  167.  *
  168.  * ===========================================================================
  169.  */