📄 oglviewer.cpp
字号:
#include "oglViewer.h"#include <GL/gl.h>#include <GL/glu.h>#include <qpixmap.h>#include <qimage.h>#include <qnamespace.h>#include <qcursor.h>#include <stdio.h>#include <iostream>using namespace std;static const float XMT_RGB[3] = {1.0, 0.4, 0.0};static const float RCV_RGB[3] = {0.0, 0.4, 1.0};#define SQR(x) ((x)*(x))OGLViewer::OGLViewer(QWidget *parent, const char *name) : QGLWidget(parent,name, 0, 0) { m_Lx = m_Ly = m_Lz = 50.0; m_lastx = 0.0; m_lasty = 0.0; m_transz = 0.0; m_transy = 0.0; m_transx = 0.0; m_rotx = 0.0; m_roty = 0.0; m_moving = false; m_rotating = true; m_zooming = false; m_solid = false; m_popup = NULL; m_drawBox = true; m_drawObjects = true; m_drawRCVs = true; m_drawXMTs = true; paintGL(); //draw_geometry(); //updateGL();}OGLViewer::~OGLViewer(){ if (m_popup != NULL) delete m_popup; glDeleteLists(1,5);}void OGLViewer::updateMaterialColorTable(QValueList<material_t>& mat){ m_colMap.clear(); for (unsigned int i=0; i<mat.size(); i++) { m_colMap.push_back(mat[i].viewColor); }} void OGLViewer::wireBox(float Lx, float Ly, float Lz, float R, float G, float B){ glBegin(GL_LINE_LOOP); glColor3f(R,G,B); glVertex3f(0,0,0); glVertex3f(Lx,0,0); glVertex3f(Lx,Ly,0); glVertex3f(0,Ly,0); glEnd(); glBegin(GL_LINE_LOOP); glColor3f(R,G,B); glVertex3f(0,0,Lz); glVertex3f(Lx,0,Lz); glVertex3f(Lx,Ly,Lz); glVertex3f(0,Ly,Lz); glEnd(); glBegin(GL_LINES); glColor3f(R,G,B); glVertex3f(0,0,0); glVertex3f(0,0,Lz); glVertex3f(Lx,0,0); glVertex3f(Lx,0,Lz); glVertex3f(0,Ly,0); glVertex3f(0,Ly,Lz); glVertex3f(Lx,Ly,0); glVertex3f(Lx,Ly,Lz); glEnd();}void OGLViewer::wireCube(float length, float R, float G, float B){ glBegin(GL_LINE_LOOP); glColor3f(R,G,B); glVertex3f(-length/2, -length/2, length/2); glVertex3f(length/2, -length/2, length/2); glVertex3f(length/2, length/2, length/2); glVertex3f(-length/2, length/2, length/2); glEnd(); glBegin(GL_LINE_LOOP); glColor3f(R,G,B); glVertex3f(-length/2, -length/2, -length/2); glVertex3f(length/2, -length/2, -length/2); glVertex3f(length/2, length/2, -length/2); glVertex3f(-length/2, length/2, -length/2); glEnd(); glBegin(GL_LINES); glColor3f(R,G,B); glVertex3f(-length/2, -length/2, length/2); glVertex3f(-length/2, -length/2, -length/2); glVertex3f(length/2, -length/2, length/2); glVertex3f(length/2, -length/2, -length/2); glVertex3f(length/2, length/2, length/2); glVertex3f(length/2, length/2, -length/2); glVertex3f(-length/2, length/2, length/2); glVertex3f(-length/2, length/2, -length/2); glEnd();}void OGLViewer::WireSphere(float r, int sec, int slice, float R, float G, float B){ glColor3f(R,G,B); GLUquadricObj* sphereObj = gluNewQuadric (); //can make the sphere solid, wireframe, and points // GLU_LINE, GLU_POINT, GLU_FILL gluQuadricDrawStyle (sphereObj, GLU_LINE); gluSphere(sphereObj, r, sec, slice);}void OGLViewer::drawXMT(int polarization){ float length = 2; float arrow_deg = 30.0; float arrow_length = length*0.3; float dt = arrow_length*sin(M_PI*arrow_deg/180.0); float dl = arrow_length*cos(M_PI*arrow_deg/180.0); //cout << "Draw XMT with polarization: " << polarization << endl; glBegin(GL_LINES); glColor3f(XMT_RGB[0],XMT_RGB[1],XMT_RGB[2]); if (polarization == 0) { // x-polarized glVertex3f(-length/2, 0.0, 0.0); glVertex3f(length/2, 0.0, 0.0); // upper arrow glVertex3f(length/2, 0.0, 0.0); glVertex3f(length/2-dl,dt,0.0); glVertex3f(length/2, 0.0, 0.0); glVertex3f(length/2-dl,-dt,0.0); glVertex3f(length/2, 0.0, 0.0); glVertex3f(length/2-dl,0.0,dt); glVertex3f(length/2, 0.0, 0.0); glVertex3f(length/2-dl,0.0,-dt); // lower arrow glVertex3f(-length/2, 0.0, 0.0); glVertex3f(-length/2+dl,dt,0.0); glVertex3f(-length/2, 0.0, 0.0); glVertex3f(-length/2+dl,-dt,0.0); glVertex3f(-length/2, 0.0, 0.0); glVertex3f(-length/2+dl,0.0,dt); glVertex3f(-length/2, 0.0, 0.0); glVertex3f(-length/2+dl,0.0,-dt); } else if (polarization == 1) { // y-polarized glVertex3f(0.0, -length/2, 0.0); glVertex3f(0.0, length/2, 0.0); // upper arrow glVertex3f(0.0,length/2, 0.0); glVertex3f(dt,length/2-dl,0.0); glVertex3f(0.0,length/2, 0.0); glVertex3f(-dt,length/2-dl,0.0); glVertex3f(0.0,length/2, 0.0); glVertex3f(0.0,length/2-dl,dt); glVertex3f(0.0,length/2, 0.0); glVertex3f(0.0,length/2-dl,-dt); // lower arrow glVertex3f(0.0,-length/2, 0.0); glVertex3f(dt,-length/2+dl,0.0); glVertex3f(0.0,-length/2, 0.0); glVertex3f(-dt,-length/2+dl,0.0); glVertex3f(0.0,-length/2, 0.0); glVertex3f(0.0,-length/2+dl,dt); glVertex3f(0.0,-length/2, 0.0); glVertex3f(0.0,-length/2+dl,-dt); } else { // z-polarized glVertex3f(0.0, 0.0, -length/2); glVertex3f(0.0, 0.0, length/2); // upper arrow glVertex3f(0.0,0.0,length/2); glVertex3f(dt,0.0,length/2-dl); glVertex3f(0.0,0.0,length/2); glVertex3f(-dt,0.0,length/2-dl); glVertex3f(0.0,0.0,length/2); glVertex3f(0.0,dt,length/2-dl); glVertex3f(0.0,0.0,length/2); glVertex3f(0.0,-dt,length/2-dl); // lower arrow glVertex3f(0.0,0.0,-length/2); glVertex3f(dt,0.0,-length/2+dl); glVertex3f(0.0,0.0,-length/2); glVertex3f(-dt,0.0,-length/2+dl); glVertex3f(0.0,0.0,-length/2); glVertex3f(0.0,dt,-length/2+dl); glVertex3f(0.0, 0.0,-length/2); glVertex3f(0.0,-dt,-length/2+dl); } glEnd();}void OGLViewer::drawRCV(int component){ float length = 2; float arrow_deg = 30.0; float arrow_length = length*0.3; float dt = arrow_length*sin(M_PI*arrow_deg/180.0); float dl = arrow_length*cos(M_PI*arrow_deg/180.0); glBegin(GL_LINES); glColor3f(RCV_RGB[0],RCV_RGB[1],RCV_RGB[2]); if ((component == 1)||(component == 4)|| (component == 0)||(component == 7)) { // Hx/Ex-component glVertex3f(-length/2, 0.0, 0.0); glVertex3f(length/2, 0.0, 0.0); // upper arrow glVertex3f(length/2, 0.0, 0.0); glVertex3f(length/2+dl,dt,0.0); glVertex3f(length/2, 0.0, 0.0); glVertex3f(length/2+dl,-dt,0.0); glVertex3f(length/2, 0.0, 0.0); glVertex3f(length/2+dl,0.0,dt); glVertex3f(length/2, 0.0, 0.0); glVertex3f(length/2+dl,0.0,-dt); // lower arrow glVertex3f(-length/2, 0.0, 0.0); glVertex3f(-length/2-dl,dt,0.0); glVertex3f(-length/2, 0.0, 0.0); glVertex3f(-length/2-dl,-dt,0.0); glVertex3f(-length/2, 0.0, 0.0); glVertex3f(-length/2-dl,0.0,dt); glVertex3f(-length/2, 0.0, 0.0); glVertex3f(-length/2-dl,0.0,-dt); // "current" loop symbolize magnetic field if ((component == 1)||(component == 0)) { glVertex3f(0,-0.5,-0.5); glVertex3f(0,-0.5,0.5); glVertex3f(0,-0.5,0.5); glVertex3f(0,0.5,0.5); glVertex3f(0,0.5,0.5); glVertex3f(0,0.5,-0.5); glVertex3f(0,0.5,-0.5); glVertex3f(0,-0.5,-0.5); } } if ((component == 2)||(component == 5)|| (component == 0)||(component == 7)) { // Hy/Ey-component glVertex3f(0.0,-length/2, 0.0); glVertex3f(0.0,length/2, 0.0); // upper arrow glVertex3f(0.0,length/2, 0.0); glVertex3f(dt,length/2+dl,0.0); glVertex3f(0.0,length/2, 0.0); glVertex3f(-dt,length/2+dl,0.0); glVertex3f(0.0,length/2, 0.0); glVertex3f(0.0,length/2+dl,dt); glVertex3f(0.0,length/2,0.0); glVertex3f(0.0,length/2+dl,-dt); // lower arrow glVertex3f(0.0,-length/2, 0.0); glVertex3f(dt,-length/2-dl,0.0); glVertex3f(0.0,-length/2, 0.0); glVertex3f(-dt,-length/2-dl,0.0); glVertex3f(0.0,-length/2, 0.0); glVertex3f(0.0,-length/2-dl,dt); glVertex3f(0.0,-length/2, 0.0); glVertex3f(0.0,-length/2-dl,-dt); // "current" loop symbolize magnetic field if ((component == 2)||(component == 0)) { glVertex3f(-0.5,0,-0.5); glVertex3f(-0.5,0,0.5); glVertex3f(-0.5,0,0.5); glVertex3f(0.5,0,0.5); glVertex3f(0.5,0,0.5); glVertex3f(0.5,0,-0.5); glVertex3f(0.5,0,-0.5); glVertex3f(-0.5,0,-0.5); } } if ((component == 3)||(component == 6)|| (component == 0)||(component == 7)) { // Hz/Ez-component glVertex3f(0.0,0.0,-length/2); glVertex3f(0.0,0.0,length/2); // upper arrow glVertex3f(0.0,0.0,length/2); glVertex3f(dt,0.0,length/2+dl); glVertex3f(0.0,0.0,length/2); glVertex3f(-dt,0.0,length/2+dl); glVertex3f(0.0,0.0,length/2); glVertex3f(0.0,dt,length/2+dl); glVertex3f(0.0,0.0,length/2); glVertex3f(0.0,-dt,length/2+dl); // lower arrow glVertex3f(0.0,0.0,-length/2); glVertex3f(dt,0.0,-length/2-dl); glVertex3f(0.0,0.0,-length/2); glVertex3f(-dt,0.0,-length/2-dl); glVertex3f(0.0,0.0,-length/2); glVertex3f(0.0,dt,-length/2-dl); glVertex3f(0.0,0.0,-length/2); glVertex3f(0.0,-dt,-length/2-dl); // "current" loop symbolize magnetic field if ((component == 3)||(component == 0)) { glVertex3f(-0.5,-0.5,0); glVertex3f(-0.5,0.5,0); glVertex3f(-0.5,0.5,0); glVertex3f(0.5,0.5,0); glVertex3f(0.5,0.5,0); glVertex3f(0.5,-0.5,0); glVertex3f(0.5,-0.5,0); glVertex3f(-0.5,-0.5,0); } } if (component == 7) WireSphere(0.6,10,10,RCV_RGB[0],RCV_RGB[1],RCV_RGB[2]); glEnd();}void OGLViewer::initializeGL () { //glClearDepth(1.0); //glEnable(GL_DEPTH_TEST); glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); //glShadeModel(GL_FLAT); //glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE); //glEnable(GL_COLOR_MATERIAL);}void OGLViewer::resizeGL ( int w, int h ) { //printf("w,h= %d %d\n",w,h); // Map real coordinates to window 2D coordinates glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); double backClipingPlan = 2.0*sqrt(SQR(m_Lx)+SQR(m_Ly)+SQR(m_Lz));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -