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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: graphwindow.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 20:50:01  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: graphwindow.cpp,v 1000.2 2004/06/01 20:50:01 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 <util/range.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <gui/opengl/glcolortable.hpp>
  43. // graphs
  44. #include <gui/graph/pie_graph.hpp>
  45. #include <gui/graph/scatter_graph.hpp>
  46. #include <gui/graph/combo_chart.hpp>
  47. #include "graphwindow.hpp"
  48. #include <math.h>
  49. #include <stdio.h>
  50. USING_NCBI_SCOPE;
  51. ////////////////////////////////////////////////////////////////////////////////
  52. /// class CGraphWindow 
  53. CGraphWindow::CGraphWindow(int x, int y, int w, int h)
  54.  : CGlCanvas2d(x, y, w, h, "Graph Demo"),
  55.    m_pScrollCont(NULL)
  56. {
  57.     m_Panel.Create();
  58.     m_Panel.SetLayout(100, 25, 100, 60);
  59.     m_Panel.SetBackColor(CGlColor(0.95f, 0.95f, 1.0f), CGlColor(0.9f, 0.9f, 1.0f));
  60.     
  61.     // create on the graphs    
  62.     int iG = 0;
  63.     switch (iG) {
  64.     case 0: x_CreateComboChart(); break;
  65.     case 1: x_CreatePie(); break;
  66.     case 2: x_CreateScatter(); break;
  67.     }
  68.     resize(x, y, w, h);
  69.     m_Panel.GetGraphPane().ZoomAll(true);
  70. }
  71. CGraphWindow::~CGraphWindow()
  72. {
  73.     RemoveGraphsAndSources();
  74. }
  75. void CGraphWindow::ZoomAll()
  76. {
  77.     m_Panel.GetGraphPane().ZoomAll();
  78.     
  79.     x_UpdateScrollBars();
  80.     redraw();
  81. }
  82. void CGraphWindow::ZoomIn()
  83. {
  84.     m_Panel.GetGraphPane().ZoomInCenter();
  85.     
  86.     x_UpdateScrollBars();
  87.     redraw();
  88. }
  89. void CGraphWindow::ZoomOut()
  90. {
  91.     m_Panel.GetGraphPane().ZoomOutCenter();
  92.     
  93.     x_UpdateScrollBars();
  94.     redraw();
  95. }
  96. void    CGraphWindow::AddGraph(IGraph* pGraph)
  97. {
  98.     m_Panel.AddGraph(pGraph);
  99.     m_vpGraphs.push_back(pGraph);
  100. }
  101. void    CGraphWindow::AddDataSource(IGraphDataSource* pDS)
  102. {
  103.     m_vpSources.push_back(pDS);
  104. }
  105. void    CGraphWindow::RemoveGraphsAndSources()
  106. {
  107.     m_Panel.RemoveAllGraphs();
  108.     destroy_and_erase_elems(m_vpGraphs);
  109.     destroy_and_erase_elems(m_vpSources);
  110. }
  111. #define BORDER 5
  112. void    CGraphWindow::resize(int x, int y, int w, int h)
  113. {
  114.     CGlCanvas2d::resize(x, y, w, h); 
  115.     
  116.     // resize m_Panel 
  117.     m_Panel.SetRect(TVPRect(BORDER, BORDER, w - 1 - BORDER, h - 1 - BORDER));
  118.     
  119.     x_UpdateScrollBars();
  120. }
  121. #define MAX_SCROLL 0x10000
  122. void CGraphWindow::x_UpdateScrollBars()
  123. {
  124.     if (m_pScrollCont) {
  125.         TModelRect rcV = m_Panel.GetGraphPane().GetVisibleRect();
  126.         TModelRect rcL = m_Panel.GetGraphPane().GetModelLimitsRect();
  127.         double PageN = rcV.Width() / rcL.Width();
  128.         double PosN = (rcV.Left() - rcL.Left()) / rcL.Width();
  129.         m_pScrollCont->SetValuesX((int) (PosN  * MAX_SCROLL), (int)(PageN * MAX_SCROLL), 1, MAX_SCROLL);
  130.         PageN = rcV.Height() / rcL.Height();
  131.         PosN = (rcL.Top() - rcV.Top()) / rcL.Height();
  132.         m_pScrollCont->SetValuesY((int)(PosN  * MAX_SCROLL), (int)(PageN * MAX_SCROLL), 1, MAX_SCROLL);
  133.     }
  134. }
  135. void CGraphWindow::SetContainer(IScrollContainer* pCont)
  136. {
  137.     m_pScrollCont = pCont;
  138.     if(m_pScrollCont)
  139.         x_UpdateScrollBars();
  140. }
  141. void CGraphWindow::OnScrollX(Fl_Scrollbar* pBar)
  142. {
  143.     double PosN = ((double) pBar->value()) / MAX_SCROLL;        
  144.     
  145.     TModelRect rcV = m_Panel.GetGraphPane().GetVisibleRect();
  146.     TModelRect rcL = m_Panel.GetGraphPane().GetModelLimitsRect();
  147.     double Pos = PosN* rcL.Width() + rcL.Left();
  148.     double Shift = Pos - rcV.Left();
  149.     rcV.Offset(Shift, 0);
  150.     m_Panel.GetGraphPane().SetVisibleRect(rcV);
  151.     
  152.     redraw();
  153. }
  154. void CGraphWindow::OnScrollY(Fl_Scrollbar* pBar)
  155. {
  156.     double PosN = ((double) pBar->value()) / MAX_SCROLL;        
  157.     
  158.     TModelRect rcV = m_Panel.GetGraphPane().GetVisibleRect();
  159.     TModelRect rcL = m_Panel.GetGraphPane().GetModelLimitsRect();
  160.     double Pos = rcL.Top() - (PosN * rcL.Height());
  161.     double Shift = Pos - rcV.Top();
  162.     rcV.Offset(0, Shift);
  163.     m_Panel.GetGraphPane().SetVisibleRect(rcV);
  164.     
  165.     redraw();
  166. }
  167. void CGraphWindow::draw()
  168. {
  169.     m_Panel.Render();
  170. }
  171. void    CGraphWindow::x_CreateComboChart()
  172. {
  173.     RemoveGraphsAndSources();
  174.     
  175.     int ElemsN = 20;
  176.     int SeriesN = 4;
  177.     
  178.     CComboChartDataSource *pChartDS = new CComboChartDataSource(SeriesN, ElemsN);
  179.     pChartDS->CreateArrays();
  180.     
  181.     for( int i = 0;  i< SeriesN;  i++ ) {
  182.         CComboChartDataSource::TValueCont& Cont = pChartDS->GetValueContainer(i);
  183.         for( int j = 0; j < ElemsN; j++ ) {
  184.             Cont[j] = sin(i + (i/10 + 0.05)*j) + j * 0.01;
  185.             
  186.             char S[30];
  187.             sprintf(S, "Series %d", i);
  188.             pChartDS->GetLabelContainer()[i] = S;
  189.         }
  190.     }
  191.     
  192.     CComboChart* pChart = new CComboChart();
  193.     //pChart->SetStyle(CComboChart::eBarChart); //eStackedBarChart, ePercentBarChart
  194.     
  195.     pChart->SetDataSource(pChartDS);
  196.     pChart->AssignAutoMarkers();
  197.     pChart->AssignAutoColors();
  198.     
  199.     //m_Panel.GetGraphPane().SetModelLimitsRect(pChart->GetLimits());
  200.     
  201.     AddGraph(static_cast<IGraph*>(pChart));
  202.     AddDataSource(static_cast<IGraphDataSource*>(pChartDS));
  203.     
  204.     m_Panel.GetLegend()->SetDataSource(static_cast<IGraphDataSource*>(pChart));
  205.     m_Panel.GetGraphPane().EnableZoom(true, false);
  206.     m_Panel.SetIntegerMode(true, false);
  207. }
  208. void    CGraphWindow::x_CreatePie()
  209. {
  210.     RemoveGraphsAndSources();
  211.     int ElemsN = 10;
  212.     CGlColorTable Table(ElemsN);
  213.     CPieDataSource* pPieDS = new CPieDataSource(ElemsN);
  214.     pPieDS->CreateArrays();
  215.     for( int i=0;  i<ElemsN;  i++ ) {
  216.         pPieDS->GetValueContainer()[i] = i + 1;
  217.         pPieDS->GetColorContainer()[i] = Table.GetColor(i);
  218.         
  219.         char S[30];
  220.         sprintf(S, "Sector N %d", i);
  221.         pPieDS->GetStringContainer()[i] = S;
  222.     }
  223.     IGraphDataSource* pIPDS = static_cast<IGraphDataSource*>(pPieDS);
  224.     CPieGraph* pGraph = new CPieGraph();
  225.     pGraph->SetDataSource(pIPDS);
  226.     m_Panel.SetDrawAxes(false);
  227.     m_Panel.SetDrawGrid(false);
  228.     m_Panel.GetGraphPane().SetModelLimitsRect(pGraph->GetLimits());
  229.     AddGraph(static_cast<IGraph*>(pGraph));
  230.     AddDataSource(static_cast<IGraphDataSource*>(pPieDS));
  231.     m_Panel.GetLegend()->SetDataSource(static_cast<IGraphDataSource*>(pGraph));
  232.     m_Panel.GetGraphPane().EnableZoom(true, true); //###
  233.     m_Panel.GetGraphPane().SetProportionalMode(true); //###
  234. }
  235. typedef CScatterDataSource<double, double> TScatterDS;
  236. void    CGraphWindow::x_CreateScatter()
  237. {
  238.     RemoveGraphsAndSources();
  239.     
  240.     int ElemsN = 500;
  241.     TScatterDS* pScatterDS = new TScatterDS(ElemsN);
  242.     pScatterDS->CreateArrays();
  243.     for( int i=0;  i<ElemsN;  i++) {
  244.         pScatterDS->GetXContainer()[i] = 1000 * (sin(0.013*i)*2 + sin(0.1 * i));
  245.         pScatterDS->GetYContainer()[i] = cos(0.17 *i) + sin(0.04 * i)*3;
  246.     }
  247.     CScatterGraph* pGraph = new CScatterGraph();
  248.     pGraph->SetDataSource(pScatterDS);
  249.     pGraph->SetColor(CGlColor(0.0f, 0.0f, 1.0f));
  250.     pGraph->SetMarkerType(CGraphDotMarker::eDiamond);
  251.     pGraph->SetDrawLines(false);
  252.     TModelRect rcAll(pGraph->GetLimits());
  253.     AddGraph(static_cast<IGraph*>(pGraph));
  254.     AddDataSource(static_cast<IGraphDataSource*>(pScatterDS));
  255.     pScatterDS = new TScatterDS(ElemsN);
  256.     pScatterDS->CreateArrays();
  257.     for( int i=0;  i<ElemsN;  i++) {
  258.         pScatterDS->GetXContainer()[i] = - 600 + 1200 * (sin(0.07*i)*2 + sin(0.1 * i) );
  259.         pScatterDS->GetYContainer()[i] = cos(0.17 *i) + sin(0.04 * i)*5;
  260.     }
  261.     pGraph = new CScatterGraph();
  262.     pGraph->SetDataSource(pScatterDS);
  263.     pGraph->SetColor(CGlColor(0.0f, 1.f, 0.0f));
  264.     pGraph->SetMarkerType(CGraphDotMarker::eNone);
  265.     pGraph->SetDrawLines(true);
  266.     
  267.     AddGraph(static_cast<IGraph*>(pGraph));
  268.     AddDataSource(static_cast<IGraphDataSource*>(pScatterDS));
  269.     rcAll.CombineWith(pGraph->GetLimits());
  270.     m_Panel.GetGraphPane().SetModelLimitsRect(rcAll);    
  271. }
  272. /*
  273.  * ===========================================================================
  274.  * $Log: graphwindow.cpp,v $
  275.  * Revision 1000.2  2004/06/01 20:50:01  gouriano
  276.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  277.  *
  278.  * Revision 1.9  2004/05/21 22:27:43  gorelenk
  279.  * Added PCH ncbi_pch.hpp
  280.  *
  281.  * Revision 1.8  2003/12/10 21:32:24  ucko
  282.  * +<stdio.h> for sprintf()
  283.  *
  284.  * Revision 1.7  2003/09/24 19:55:41  yazhuk
  285.  * Enforced zooming in the first ZoomAll() call.
  286.  *
  287.  * Revision 1.6  2003/08/28 19:26:21  yazhuk
  288.  * Changed CGlPane function names
  289.  *
  290.  * Revision 1.5  2003/08/14 18:04:00  yazhuk
  291.  * Refactored CGraphWindow in order to use CGraphPanel
  292.  *
  293.  * Revision 1.4  2003/08/11 19:20:35  yazhuk
  294.  * Cosmetic changes
  295.  *
  296.  * Revision 1.3  2003/08/11 16:10:58  yazhuk
  297.  * Compilation fixes for GCC
  298.  *
  299.  * Revision 1.2  2003/08/08 15:59:37  yazhuk
  300.  * Comments added
  301.  *
  302.  * ===========================================================================
  303.  */