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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: phylo_tree_rect_cladogram.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:11:48  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: phylo_tree_rect_cladogram.cpp,v 1000.1 2004/06/01 21:11:48 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:  Vladimir Tereshkov
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistl.hpp>
  41. #include <gui/opengl/glhelpers.hpp>
  42. #include <gui/graph/igraph_utils.hpp>
  43. #include <gui/widgets/phylo_tree/phylo_tree_render.hpp>
  44. #include <gui/widgets/phylo_tree/phylo_tree_rect_cladogram.hpp>
  45. #include <FL/Fl.H>
  46. #include <math.h>
  47. BEGIN_NCBI_SCOPE
  48. CPhyloRectCladogram::CPhyloRectCladogram()
  49. {  
  50. }
  51. CPhyloRectCladogram::~CPhyloRectCladogram()
  52. {
  53. }
  54. void  CPhyloRectCladogram::x_Layout(CPhyloTreeDataSource& ds)
  55. {    
  56.     CPhyloTreeNode * tree = ds.GetTree();    
  57.     
  58.     Int4 leafs = ds.GetSize();
  59.     Int4 width = ds.GetWidth();
  60.     
  61.     m_xStep = (m_DimX - m_LeftMargin - m_RightMargin) /  width;
  62.     m_yStep = (m_DimY - m_TopMargin - m_BottomMargin) / (leafs-1); 
  63.     if (ds.GetNormDistance() > 0){
  64.         m_NormDistance = (m_DimX - m_LeftMargin - m_RightMargin) / ds.GetNormDistance();
  65.     }
  66.     x_Calculate(ds.GetTree());    
  67. }
  68. void  CPhyloRectCladogram::x_Render(CGlPane& pane, CPhyloTreeDataSource& ds)
  69. {    
  70.     pane.OpenOrtho();    
  71.     x_DrawTree(ds.GetTree());
  72.     pane.Close();   
  73. }
  74. void CPhyloRectCladogram:: x_Calculate(CPhyloTreeNode * node)
  75. {
  76.     
  77.     if (node->IsLeaf()) {
  78.         
  79.         if (m_bDistMode){
  80.             node->XY().first  = m_LeftMargin + m_NormDistance * node->GetDistFromRoot();               
  81.         }
  82.         else {
  83.             node->XY().first  = (m_DimX - m_RightMargin);                                  // all leafs on the right
  84.         }
  85.         node->XY().second = (m_DimY - m_TopMargin - node->IDX().second * m_yStep);     // y coordinate 
  86.         node->SetAngle(0); // for correct labeling
  87.     }
  88.     else {        
  89.         for(CPhyloTreeNode::TNodeList_I  it = node->SubNodeBegin();  it != node->SubNodeEnd(); it++ )  x_Calculate((*it)->GetValue());         
  90.         
  91.         CPhyloTreeNode::TNodeList_I fst = node->SubNodeBegin();
  92.         CPhyloTreeNode::TNodeList_I lst = node->SubNodeEnd(); 
  93.         lst--;
  94.         
  95.         double yf = (*fst)->GetValue()->XY().second;
  96.         double yl = (*lst)->GetValue()->XY().second;
  97.                
  98.         
  99.         if (m_bDistMode){            
  100.             node->XY().first  = m_LeftMargin + m_NormDistance * node->GetDistFromRoot();               
  101.         }
  102.         else {
  103.             node->XY().first  = (m_LeftMargin + node->IDX().first * m_xStep);
  104.         }
  105.     
  106.         node->XY().second = (yl + (yf - yl)/2);            
  107.     }   
  108. }
  109. void CPhyloRectCladogram:: x_DrawTree(CPhyloTreeNode * node)
  110. {   
  111.     if (node->IsLeaf()) {
  112.          // label
  113.         if (m_pLabelFont) {
  114.             CGlPoint<int> labelPos(node->GetValue()->XY().first, node->GetValue()->XY().second);
  115.             m_Label.Render(*m_pPane, labelPos, node->GetLabel(), node->GetSelected());
  116.             //x_RenderText(node->GetValue()->XY().first, node->GetValue()->XY().second, node->GetLabel());
  117.         }
  118.             
  119.         // drawing leaf node                     
  120.         x_RenderLine(node->GetParent()->GetValue()->XY().first + m_LineWidth, node->GetValue()->XY().second,
  121.             node->GetValue()->XY().first, node->GetValue()->XY().second, m_LineWidth, node->GetSelected()?m_LineSelColor:m_LineColor, node->GetSelected()?m_LineSelHiColor:m_LineHiColor);
  122.        
  123.         x_RenderNode(node->GetValue()->XY().first, node->GetValue()->XY().second, m_NodeSize,  node->GetSelected()?m_NodeSelColor:m_NodeColor);
  124.     }
  125.     else {
  126.         // drawing internal node                   
  127.         CPhyloTreeNode::TNodeList_I fst = node->SubNodeBegin();
  128.         CPhyloTreeNode::TNodeList_I lst = node->SubNodeEnd(); 
  129.         lst--;
  130.         double ratio = m_pPane->GetScaleY()/m_pPane->GetScaleX();
  131.     
  132.         // vertical line
  133.         x_RenderLine(node->GetValue()->XY().first, (*fst)->GetValue()->XY().second - m_LineWidth * ratio,
  134.                      node->GetValue()->XY().first, (*lst)->GetValue()->XY().second + m_LineWidth * ratio, m_LineWidth, node->GetSelected()?m_LineSelColor:m_LineColor, node->GetSelected()?m_LineSelHiColor:m_LineHiColor);
  135.         
  136.         // horizontal line        
  137.         double xleft = node->GetParent()?node->GetParent()->GetValue()->XY().first:m_LeftMargin;
  138.         bool   bSel  = (node->GetSelected() && (node->GetParent() && node->GetParent()->GetValue()->GetSelected()));       
  139.         x_RenderLine(xleft + m_LineWidth, node->GetValue()->XY().second,
  140.                      node->GetValue()->XY().first + m_LineWidth, node->GetValue()->XY().second,m_LineWidth, bSel?m_LineSelColor:m_LineColor, bSel?m_LineSelHiColor:m_LineHiColor);
  141.         
  142.         // drawing top corner        
  143.         x_DrawCorner(node->GetValue()->XY().first, (*fst)->GetValue()->XY().second, eTop,    node->GetSelected()?m_LineSelColor:m_LineColor, node->GetSelected()?m_LineSelHiColor:m_LineHiColor);
  144.         
  145.         // bottom corner
  146.         x_DrawCorner(node->GetValue()->XY().first, (*lst)->GetValue()->XY().second, eBottom, node->GetSelected()?m_LineSelColor:m_LineColor, node->GetSelected()?m_LineSelHiColor:m_LineHiColor);        
  147.         
  148.         // middle on parent
  149.         if (node->GetParent() && (node!=*(node->GetParent()->SubNodeBegin()) && node!=*(--node->GetParent()->SubNodeEnd()))){
  150.             x_DrawCorner(xleft, node->GetValue()->XY().second, eMiddle, node->GetParent()->GetValue()->GetSelected()?m_LineSelColor:m_LineColor, node->GetParent()->GetValue()->GetSelected()?m_LineSelHiColor:m_LineHiColor);        
  151.         }
  152.         
  153.         //  node itself
  154.         x_RenderNode(node->GetValue()->XY().first, node->GetValue()->XY().second, m_NodeSize,   node->GetSelected()?m_NodeSelColor:m_NodeColor);
  155.         // draw childs
  156.          for(CPhyloTreeNode::TNodeList_I  it = node->SubNodeBegin();  it != node->SubNodeEnd(); it++ )  {
  157.             x_DrawTree((*it)->GetValue());                     
  158.         }
  159.        
  160.     }
  161. }
  162.     
  163. void  CPhyloRectCladogram::x_DrawCorner(double x, double y, ECorner corner, CGlColor color1, CGlColor color2)
  164. {
  165.     // reset line width
  166.     glEnable(GL_BLEND);
  167.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  
  168.     glLineWidth(1.0);        
  169.     glShadeModel(GL_SMOOTH);
  170.     glEnable(GL_LINE_SMOOTH);
  171.     double ratio = m_pPane->GetScaleY()/m_pPane->GetScaleX();  
  172.     double dx = m_LineWidth;
  173.     double dy = m_LineWidth * ratio * ((corner==eBottom || corner==eMiddle)? 1: -1); 
  174.     
  175.     if (corner==eTop || corner==eBottom){
  176.         glBegin(GL_QUADS);
  177.         glColor4fv(color2.GetGlColor());
  178.         glVertex2d(x, y+dy); 
  179.         glColor4fv(color1.GetGlColor());
  180.         glVertex2d(x+dx,    y+dy);         
  181.         glColor4fv(color2.GetGlColor());
  182.         glVertex2d(x+dx, y); 
  183.         glVertex2d(x, y); 
  184.         glColor4fv(color2.GetGlColor());
  185.         glVertex2d(x, y); 
  186.         glVertex2d(x+dx, y); 
  187.         glColor4fv(color1.GetGlColor());
  188.         glVertex2d(x+dx, y-dy); 
  189.         glVertex2d(x, y-dy); 
  190.         glColor4fv(color2.GetGlColor());
  191.         glVertex2d(x, y+dy); 
  192.         glVertex2d(x, y); 
  193.         glColor4fv(color1.GetGlColor());
  194.         glVertex2d(x-dx, y); 
  195.         glVertex2d(x-dx, y+dy);         
  196.         glEnd();
  197.         glBegin(GL_TRIANGLES);    
  198.         glColor4fv(color2.GetGlColor());        
  199.         glVertex2d(x, y); 
  200.         glColor4fv(color1.GetGlColor());
  201.         glVertex2d(x, y-dy); 
  202.         glVertex2d(x-dx, y);        
  203.         glEnd();
  204.         glBegin(GL_LINES);    
  205.         glColor4fv(color1.GetGlColor());        
  206.         glVertex2d(x+dx, y-dy); glVertex2d(x, y-dy);    
  207.         glVertex2d(x, y-dy);    glVertex2d(x-dx, y);        
  208.         glVertex2d(x-dx, y);    glVertex2d(x-dx, y+dy);
  209.         glEnd();
  210.     }
  211.     else { // middle joint
  212.         glBegin(GL_QUADS);
  213.         glColor4fv(color2.GetGlColor());
  214.         glVertex2d(x+dx, y); 
  215.         glVertex2d(x, y); 
  216.         glVertex2d(x, y+dy); 
  217.         glColor4fv(color1.GetGlColor());
  218.         glVertex2d(x+dx, y+dy); 
  219.         glBegin(GL_QUADS);
  220.         glColor4fv(color2.GetGlColor());
  221.         glVertex2d(x, y-dy); 
  222.         glVertex2d(x, y); 
  223.         glVertex2d(x+dx, y);         
  224.         glColor4fv(color1.GetGlColor());
  225.         glVertex2d(x+dx, y-dy); 
  226.         glEnd();
  227.     }
  228.     glDisable(GL_BLEND);    
  229. }
  230. string CPhyloRectCladogram::GetDescription(void)
  231. {
  232.     return "Rectangle Cladogram";
  233. }
  234. END_NCBI_SCOPE
  235. /*
  236.  * ===========================================================================
  237.  * $Log: phylo_tree_rect_cladogram.cpp,v $
  238.  * Revision 1000.1  2004/06/01 21:11:48  gouriano
  239.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  240.  *
  241.  * Revision 1.9  2004/05/21 22:27:54  gorelenk
  242.  * Added PCH ncbi_pch.hpp
  243.  *
  244.  * Revision 1.8  2004/05/06 19:42:21  tereshko
  245.  * Rendering improvements
  246.  *
  247.  * Revision 1.7  2004/04/28 19:27:10  tereshko
  248.  * Added support for distances rendering
  249.  *
  250.  * Revision 1.6  2004/04/20 21:57:19  tereshko
  251.  * Major rendering, labeling and performance improvements
  252.  *
  253.  * Revision 1.5  2004/04/13 20:28:53  tereshko
  254.  * Numerous renderers improvements
  255.  *
  256.  * Revision 1.4  2004/04/01 21:47:25  tereshko
  257.  * Code clean-up
  258.  *
  259.  * Revision 1.3  2004/02/24 21:43:45  tereshko
  260.  * Added support for rendering joints
  261.  *
  262.  * Revision 1.2  2004/02/23 22:52:27  tereshko
  263.  * Rendering Improvements
  264.  *
  265.  * Revision 1.1  2004/02/13 17:05:08  tereshko
  266.  * Phylogenetic Tree Widget initial revision
  267.  *
  268.  * ===========================================================================
  269.  */