taxplot3d_pane.cpp
字号:
glVertex3f( step_n * i, 0, 0.0f); glVertex3f( step_n * i, 0, 1.0f); glEnd(); glBegin(GL_LINES); glVertex3f(0, step_n * i, 0.0f); glVertex3f(1, step_n * i, 0.0f); glEnd(); glBegin(GL_LINES); glVertex3f(0, 0.0f, step_n * i); glVertex3f(1, 0.0f, step_n * i); glEnd(); glBegin(GL_LINES); glVertex3f(0, 0.0f, step_n * i); glVertex3f(0, 1.0f, step_n * i); glEnd(); glBegin(GL_LINES); glVertex3f(0, step_n * i, 0.0f); glVertex3f(0, step_n * i, 1.0f); glEnd(); } } glPopMatrix(); // labels if (m_Data && m_bLabels){ glColor3f(1.0f,1.0f,1.0f); if (m_ViewMode!=eViewY) m_Font_Bitmap8x13.TextOut(0.0f, 1.07f, m_Data->yLabel().c_str()); if (m_ViewMode!=eViewX) m_Font_Bitmap8x13.TextOut(1.07f, 0.0f, m_Data->xLabel().c_str()); if (m_ViewMode!=eViewZ){ glPushMatrix(); glRotatef(90,1.0f,0.0f,0.0f); glColor3f(1.0f,1.0f,1.0f); m_Font_Bitmap8x13.TextOut(0.0f, 1.07f, m_Data->zLabel().c_str()); glPopMatrix(); } } // arrows if (m_bArrows){ if (m_ViewMode!=eViewZ){ glPushMatrix(); glColor3f(1.0f,1.0f,1.0f); glTranslatef(0.0f,0.0f, 1.0f); gluQuadricDrawStyle(pObj, GLU_FILL); gluCylinder(pObj, 0.01, 0, 0.05, 20, 20); glPopMatrix(); } if (m_ViewMode!=eViewY){ glPushMatrix(); glColor3f(1.0f,1.0f,1.0f); glRotatef(90,-1.0f,0.0f,0.0f); glTranslatef(0.0f,0.0f, 1.0f); gluQuadricDrawStyle(pObj, GLU_FILL); gluCylinder(pObj, 0.01, 0, 0.05, 20, 20); glPopMatrix(); } if (m_ViewMode!=eViewX){ glPushMatrix(); glColor3f(1.0f,1.0f,1.0f); glRotatef(90,0.0f,1.0f,0.0f); glTranslatef(0.0f,0.0f, 1.0f); gluQuadricDrawStyle(pObj, GLU_FILL); gluCylinder(pObj, 0.01, 0, 0.05, 20, 20); glPopMatrix(); } }}CVect3<float> CTaxplot3dPanel::GetOGLPos(int x, int y){ GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, posY, posZ; glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); glGetDoublev( GL_PROJECTION_MATRIX, projection ); glGetIntegerv( GL_VIEWPORT, viewport ); winX = (float)x; winY = (float)viewport[3] - (float)y; glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ ); gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); return CVect3<float>(posX, posY, posZ);}// object lookup in 3D sceneint CTaxplot3dPanel::findObject(int x, int y){ int foundIndex = -1; float delta = 0.006f; CVect3<float> pos = GetOGLPos(x, y); if (m_Data){ for (unsigned int i=0; i<m_Data->getData().size(); i++){ CVect3<float> point(m_Data->getVertexAt(i).getXYZ()); if ((pos.X()>(point.X()-delta)) && (pos.X()<(point.X()+delta)) && (pos.Y()>(point.Y()-delta)) && (pos.Y()<(point.Y()+delta)) && (pos.Z()>(point.Z()-delta)) && (pos.Z()<(point.Z()+delta))) { foundIndex = i; break; } } } return foundIndex;}void CTaxplot3dPanel::checkSelection(int x, int y){ if (m_Data){ m_Data->dropSelection(); int curObject = findObject(x, y); if (curObject>=0){ CVect3<float> point(m_Data->getVertexAt(curObject).getXYZ()); m_Pivot = point; m_Data->getVertexAt(curObject).doSelect(true); if (m_Handler) m_Handler->fireEvent(this, ITaxplot3dCP::eSelection); slowRedraw(); } }}// all view transformations for ortho and perspective projectionsvoid CTaxplot3dPanel::transformView(void){ switch (m_ViewMode){ case eCamera: m_Camera.SetLayout(CGlCamera::ePerspective); m_Camera.MakeCurrent(); switch (m_PivotPoint){ case eFloating: m_Transform.ApplyGL(CGlMTransform::eZoom); m_Transform.ApplyGL(CGlMTransform::ePan); m_Transform.ApplyGL(CGlMTransform::eRotate); break; case eFixed: m_Transform.ApplyGL(CGlMTransform::eZoom); m_Transform.ApplyGL(CGlMTransform::eRotate); m_Transform.ApplyGL(CGlMTransform::ePan); } glRotatef(45, 1,0,0); glRotatef(45, 0,-1,0); if (m_bPvAttach) glTranslatef(-m_Pivot.X(), -m_Pivot.Y(), -m_Pivot.Z()); break; case eViewX: switch2ortho(); m_Transform.ApplyGL(CGlMTransform::eTranslate); gluLookAt(0,0,0,-1,0,0,0,0,1); break; case eViewY: switch2ortho(); m_Transform.ApplyGL(CGlMTransform::eTranslate); gluLookAt(0,0,0,0,-1,0,1,0,0); break; case eViewZ: switch2ortho(); m_Transform.ApplyGL(CGlMTransform::eTranslate); gluLookAt(0,0,0,0,0,-1,0,1,0); break; }}void CTaxplot3dPanel::switch2ortho(void){ GLfloat ratio = (m_Transform.GetTranslation().Z())/2 - 0.8; m_Camera.SetLayout(CGlCamera::eOrtho); m_Camera.SetLeftPlane(ratio); m_Camera.SetRightPlane(-ratio); m_Camera.SetTopPlane(-ratio); m_Camera.SetBottomPlane(ratio); m_Camera.MakeCurrent(); glTranslatef(-0.6f, -0.6f, 0); }void CTaxplot3dPanel::slowRedraw(void){ m_Dlist.Invalidate(); redraw();}void CTaxplot3dPanel::drawScale(void){ float scaleSize = 0.07f; m_Camera.SetLayout(CGlCamera::eOrtho); m_Camera.SetLeftPlane(-1); m_Camera.SetRightPlane(1); m_Camera.SetTopPlane(1); m_Camera.SetBottomPlane(-1); m_Camera.MakeCurrent(); glColor4f(0.0f,1.0f,0.5f,0.3f); // graph label string strViewMode = "Undefined"; switch (m_ViewMode){ case eViewX: strViewMode = "Ortho YZ"; break; case eViewY: strViewMode = "Ortho XZ"; break; case eViewZ: strViewMode = "Ortho XY"; break; case eCamera: strViewMode = "Perspective"; break; } m_Font_Bitmap8x13.TextOut(-0.9f, 0.9f, strViewMode.c_str()); string strScale = NStr::DoubleToString(GetBestStep()*2) + " x " + NStr::DoubleToString(GetBestStep()*2); m_Font_Bitmap8x13.TextOut(-0.9f + scaleSize*2, 0.8f, strScale.c_str()); glColor4f(1.0f,1.0f,1.0f, 0.3f); glBegin(GL_LINE_LOOP); glVertex3f(-0.9f, 0.8f, 0); glVertex3f(-0.9f + scaleSize, 0.8f, 0); glVertex3f(-0.9f + scaleSize, 0.8f + scaleSize, 0); glVertex3f(-0.9f, 0.8f + scaleSize, 0); glEnd(); glColor4f(1.0f,1.0f,1.0f, 0.05f); glBegin(GL_LINES); glVertex3f(-0.9f + scaleSize/2, 0.8f, 0); glVertex3f(-0.9f + scaleSize/2, 0.8f+scaleSize, 0); glVertex3f(-0.9f, 0.8f + scaleSize/2, 0); glVertex3f(-0.9f + scaleSize, 0.8f + scaleSize/2, 0); glEnd(); m_Camera.ReleaseCurrent(); }double CTaxplot3dPanel::GetBestStep(bool bNorm){ int maxTicks = 20; int minTicks = 10; // step selection double scale = m_Data?m_Data->getScale():1; double log = ceil(log10(scale)); double step = pow((double)10, log)/maxTicks; double step_n = step / scale; // minimum 10 ticks while (step_n > (1.0 / minTicks)) {step/=2; step_n/=2;} return bNorm?step_n:step;}// tooltips implementationbool CTaxplot3dPanel::TC_NeedTooltip(int x, int y){ return findObject(x, y) >= 0;}string CTaxplot3dPanel::TC_GetTooltip(int& x, int& y, int& w, int& h){ string toolTip = ""; int currIndex = findObject(x, y); double scale = m_Data?m_Data->getScale():1; if (currIndex >= 0) { toolTip = "gi: " + NStr::IntToString(m_Data->getVertexAt(currIndex).getGi()); toolTip += "\nScores:"; toolTip += ("\n" + m_Data->xLabel() + ": " + NStr::IntToString(m_Data->getVertexAt(currIndex).getXYZ().X()*scale)); toolTip += ("\n" + m_Data->yLabel() + ": " + NStr::IntToString(m_Data->getVertexAt(currIndex).getXYZ().Y()*scale)); toolTip += ("\n" + m_Data->zLabel() + ": " + NStr::IntToString(m_Data->getVertexAt(currIndex).getXYZ().Z()*scale)); } return toolTip;}END_NCBI_SCOPE/* * =========================================================================== * $Log: taxplot3d_pane.cpp,v $ * Revision 1000.1 2004/06/01 21:13:45 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4 * * Revision 1.4 2004/05/21 22:27:55 gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.3 2004/01/28 15:56:29 tereshko * UI additions - scale, tooltips * * Revision 1.2 2004/01/14 16:39:22 tereshko * Minor changes due to integration with Taxplot viewer * * Revision 1.1 2004/01/05 16:20:49 tereshko * Initial revision * * =========================================================================== */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -