graphwindow.cpp
来自「ncbi源码」· C++ 代码 · 共 359 行
CPP
359 行
/* * =========================================================================== * PRODUCTION $Log: graphwindow.cpp,v $ * PRODUCTION Revision 1000.2 2004/06/01 20:50:01 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9 * PRODUCTION * =========================================================================== *//* $Id: graphwindow.cpp,v 1000.2 2004/06/01 20:50:01 gouriano Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors: Andrey Yazhuk * * File Description: * */#include <ncbi_pch.hpp>#include <util/range.hpp>#include <corelib/ncbistd.hpp>#include <gui/opengl/glcolortable.hpp>// graphs#include <gui/graph/pie_graph.hpp>#include <gui/graph/scatter_graph.hpp>#include <gui/graph/combo_chart.hpp>#include "graphwindow.hpp"#include <math.h>#include <stdio.h>USING_NCBI_SCOPE;/////////////////////////////////////////////////////////////////////////////////// class CGraphWindow CGraphWindow::CGraphWindow(int x, int y, int w, int h) : CGlCanvas2d(x, y, w, h, "Graph Demo"), m_pScrollCont(NULL){ m_Panel.Create(); m_Panel.SetLayout(100, 25, 100, 60); m_Panel.SetBackColor(CGlColor(0.95f, 0.95f, 1.0f), CGlColor(0.9f, 0.9f, 1.0f)); // create on the graphs int iG = 0; switch (iG) { case 0: x_CreateComboChart(); break; case 1: x_CreatePie(); break; case 2: x_CreateScatter(); break; } resize(x, y, w, h); m_Panel.GetGraphPane().ZoomAll(true);}CGraphWindow::~CGraphWindow(){ RemoveGraphsAndSources();}void CGraphWindow::ZoomAll(){ m_Panel.GetGraphPane().ZoomAll(); x_UpdateScrollBars(); redraw();}void CGraphWindow::ZoomIn(){ m_Panel.GetGraphPane().ZoomInCenter(); x_UpdateScrollBars(); redraw();}void CGraphWindow::ZoomOut(){ m_Panel.GetGraphPane().ZoomOutCenter(); x_UpdateScrollBars(); redraw();}void CGraphWindow::AddGraph(IGraph* pGraph){ m_Panel.AddGraph(pGraph); m_vpGraphs.push_back(pGraph);}void CGraphWindow::AddDataSource(IGraphDataSource* pDS){ m_vpSources.push_back(pDS);}void CGraphWindow::RemoveGraphsAndSources(){ m_Panel.RemoveAllGraphs(); destroy_and_erase_elems(m_vpGraphs); destroy_and_erase_elems(m_vpSources);}#define BORDER 5void CGraphWindow::resize(int x, int y, int w, int h){ CGlCanvas2d::resize(x, y, w, h); // resize m_Panel m_Panel.SetRect(TVPRect(BORDER, BORDER, w - 1 - BORDER, h - 1 - BORDER)); x_UpdateScrollBars();}#define MAX_SCROLL 0x10000void CGraphWindow::x_UpdateScrollBars(){ if (m_pScrollCont) { TModelRect rcV = m_Panel.GetGraphPane().GetVisibleRect(); TModelRect rcL = m_Panel.GetGraphPane().GetModelLimitsRect(); double PageN = rcV.Width() / rcL.Width(); double PosN = (rcV.Left() - rcL.Left()) / rcL.Width(); m_pScrollCont->SetValuesX((int) (PosN * MAX_SCROLL), (int)(PageN * MAX_SCROLL), 1, MAX_SCROLL); PageN = rcV.Height() / rcL.Height(); PosN = (rcL.Top() - rcV.Top()) / rcL.Height(); m_pScrollCont->SetValuesY((int)(PosN * MAX_SCROLL), (int)(PageN * MAX_SCROLL), 1, MAX_SCROLL); }}void CGraphWindow::SetContainer(IScrollContainer* pCont){ m_pScrollCont = pCont; if(m_pScrollCont) x_UpdateScrollBars();}void CGraphWindow::OnScrollX(Fl_Scrollbar* pBar){ double PosN = ((double) pBar->value()) / MAX_SCROLL; TModelRect rcV = m_Panel.GetGraphPane().GetVisibleRect(); TModelRect rcL = m_Panel.GetGraphPane().GetModelLimitsRect(); double Pos = PosN* rcL.Width() + rcL.Left(); double Shift = Pos - rcV.Left(); rcV.Offset(Shift, 0); m_Panel.GetGraphPane().SetVisibleRect(rcV); redraw();}void CGraphWindow::OnScrollY(Fl_Scrollbar* pBar){ double PosN = ((double) pBar->value()) / MAX_SCROLL; TModelRect rcV = m_Panel.GetGraphPane().GetVisibleRect(); TModelRect rcL = m_Panel.GetGraphPane().GetModelLimitsRect(); double Pos = rcL.Top() - (PosN * rcL.Height()); double Shift = Pos - rcV.Top(); rcV.Offset(0, Shift); m_Panel.GetGraphPane().SetVisibleRect(rcV); redraw();}void CGraphWindow::draw(){ m_Panel.Render();}void CGraphWindow::x_CreateComboChart(){ RemoveGraphsAndSources(); int ElemsN = 20; int SeriesN = 4; CComboChartDataSource *pChartDS = new CComboChartDataSource(SeriesN, ElemsN); pChartDS->CreateArrays(); for( int i = 0; i< SeriesN; i++ ) { CComboChartDataSource::TValueCont& Cont = pChartDS->GetValueContainer(i); for( int j = 0; j < ElemsN; j++ ) { Cont[j] = sin(i + (i/10 + 0.05)*j) + j * 0.01; char S[30]; sprintf(S, "Series %d", i); pChartDS->GetLabelContainer()[i] = S; } } CComboChart* pChart = new CComboChart(); //pChart->SetStyle(CComboChart::eBarChart); //eStackedBarChart, ePercentBarChart pChart->SetDataSource(pChartDS); pChart->AssignAutoMarkers(); pChart->AssignAutoColors(); //m_Panel.GetGraphPane().SetModelLimitsRect(pChart->GetLimits()); AddGraph(static_cast<IGraph*>(pChart)); AddDataSource(static_cast<IGraphDataSource*>(pChartDS)); m_Panel.GetLegend()->SetDataSource(static_cast<IGraphDataSource*>(pChart)); m_Panel.GetGraphPane().EnableZoom(true, false); m_Panel.SetIntegerMode(true, false);}void CGraphWindow::x_CreatePie(){ RemoveGraphsAndSources(); int ElemsN = 10; CGlColorTable Table(ElemsN); CPieDataSource* pPieDS = new CPieDataSource(ElemsN); pPieDS->CreateArrays(); for( int i=0; i<ElemsN; i++ ) { pPieDS->GetValueContainer()[i] = i + 1; pPieDS->GetColorContainer()[i] = Table.GetColor(i); char S[30]; sprintf(S, "Sector N %d", i); pPieDS->GetStringContainer()[i] = S; } IGraphDataSource* pIPDS = static_cast<IGraphDataSource*>(pPieDS); CPieGraph* pGraph = new CPieGraph(); pGraph->SetDataSource(pIPDS); m_Panel.SetDrawAxes(false); m_Panel.SetDrawGrid(false); m_Panel.GetGraphPane().SetModelLimitsRect(pGraph->GetLimits()); AddGraph(static_cast<IGraph*>(pGraph)); AddDataSource(static_cast<IGraphDataSource*>(pPieDS)); m_Panel.GetLegend()->SetDataSource(static_cast<IGraphDataSource*>(pGraph)); m_Panel.GetGraphPane().EnableZoom(true, true); //### m_Panel.GetGraphPane().SetProportionalMode(true); //###}typedef CScatterDataSource<double, double> TScatterDS;void CGraphWindow::x_CreateScatter(){ RemoveGraphsAndSources(); int ElemsN = 500; TScatterDS* pScatterDS = new TScatterDS(ElemsN); pScatterDS->CreateArrays(); for( int i=0; i<ElemsN; i++) { pScatterDS->GetXContainer()[i] = 1000 * (sin(0.013*i)*2 + sin(0.1 * i)); pScatterDS->GetYContainer()[i] = cos(0.17 *i) + sin(0.04 * i)*3; } CScatterGraph* pGraph = new CScatterGraph(); pGraph->SetDataSource(pScatterDS); pGraph->SetColor(CGlColor(0.0f, 0.0f, 1.0f)); pGraph->SetMarkerType(CGraphDotMarker::eDiamond); pGraph->SetDrawLines(false); TModelRect rcAll(pGraph->GetLimits()); AddGraph(static_cast<IGraph*>(pGraph)); AddDataSource(static_cast<IGraphDataSource*>(pScatterDS)); pScatterDS = new TScatterDS(ElemsN); pScatterDS->CreateArrays(); for( int i=0; i<ElemsN; i++) { pScatterDS->GetXContainer()[i] = - 600 + 1200 * (sin(0.07*i)*2 + sin(0.1 * i) ); pScatterDS->GetYContainer()[i] = cos(0.17 *i) + sin(0.04 * i)*5; } pGraph = new CScatterGraph(); pGraph->SetDataSource(pScatterDS); pGraph->SetColor(CGlColor(0.0f, 1.f, 0.0f)); pGraph->SetMarkerType(CGraphDotMarker::eNone); pGraph->SetDrawLines(true); AddGraph(static_cast<IGraph*>(pGraph)); AddDataSource(static_cast<IGraphDataSource*>(pScatterDS)); rcAll.CombineWith(pGraph->GetLimits()); m_Panel.GetGraphPane().SetModelLimitsRect(rcAll); }/* * =========================================================================== * $Log: graphwindow.cpp,v $ * Revision 1000.2 2004/06/01 20:50:01 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9 * * Revision 1.9 2004/05/21 22:27:43 gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.8 2003/12/10 21:32:24 ucko * +<stdio.h> for sprintf() * * Revision 1.7 2003/09/24 19:55:41 yazhuk * Enforced zooming in the first ZoomAll() call. * * Revision 1.6 2003/08/28 19:26:21 yazhuk * Changed CGlPane function names * * Revision 1.5 2003/08/14 18:04:00 yazhuk * Refactored CGraphWindow in order to use CGraphPanel * * Revision 1.4 2003/08/11 19:20:35 yazhuk * Cosmetic changes * * Revision 1.3 2003/08/11 16:10:58 yazhuk * Compilation fixes for GCC * * Revision 1.2 2003/08/08 15:59:37 yazhuk * Comments added * * =========================================================================== */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?