qtSpectrumDisplay.cpp 7.21 KB
 #include <QtGui>
 #include <QtOpenGL/QtOpenGL>
#include <GL/glu.h>

 #include <math.h>

 #include "qtSpectrumDisplay.h"

 qtSpectrumDisplay::qtSpectrumDisplay(QWidget *parent)
     : QGLWidget(parent)
 {
     object = 0;
     xRot = 0;
     yRot = 0;
     zRot = 0;

     qtGreen = QColor::fromCmykF(0.40, 0.0, 1.0, 0.0);
     qtPurple = QColor::fromCmykF(0.39, 0.39, 0.0, 0.0);
 }

 qtSpectrumDisplay::~qtSpectrumDisplay()
 {
     makeCurrent();
     glDeleteLists(object, 1);
 }

 QSize qtSpectrumDisplay::minimumSizeHint() const
 {
     return QSize(50, 50);
 }

 QSize qtSpectrumDisplay::sizeHint() const
 {
     return QSize(400, 400);
 }

 /*void qtSpectrumDisplay::setXRotation(int angle)
 {
     normalizeAngle(&angle);
     if (angle != xRot) {
         xRot = angle;
         emit xRotationChanged(angle);
         updateGL();
     }
 }

 void qtSpectrumDisplay::setYRotation(int angle)
 {
     normalizeAngle(&angle);
     if (angle != yRot) {
         yRot = angle;
         emit yRotationChanged(angle);
         updateGL();
     }
 }

 void qtSpectrumDisplay::setZRotation(int angle)
 {
     normalizeAngle(&angle);
     if (angle != zRot) {
         zRot = angle;
         emit zRotationChanged(angle);
         updateGL();
     }
 }*/

 void qtSpectrumDisplay::initializeGL()
 {
     qglClearColor(qtPurple.dark());
     //object = makeObject();
     glShadeModel(GL_FLAT);
     glEnable(GL_DEPTH_TEST);
     glEnable(GL_CULL_FACE);
 }

 void qtSpectrumDisplay::printWavenumber(int xPos)
 {
	 int viewParams[4];
	 glGetIntegerv(GL_VIEWPORT, viewParams);

	 float a = (float)xPos/(float)viewParams[2];

	 int wn = a * (nuMax - nuMin) + nuMin;
	 cout<<wn<<endl;

 }

 void qtSpectrumDisplay::paintGL()
 {
	 glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     //glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
	 gluOrtho2D(nuMin, nuMax, aMin, aMax);
     glMatrixMode(GL_MODELVIEW);

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glLoadIdentity();
     /*glTranslated(0.0, 0.0, -10.0);
     glRotated(xRot / 16.0, 1.0, 0.0, 0.0);
     glRotated(yRot / 16.0, 0.0, 1.0, 0.0);
     glRotated(zRot / 16.0, 0.0, 0.0, 1.0);*/
	 glLineWidth(2);
	 if(dispSimSpec)
	 {
		 glColor3f(1.0, 1.0, 1.0);
		 glBegin(GL_LINE_STRIP);
		 for(unsigned int i=0; i<SimSpectrum.size(); i++)
			 glVertex2f(SimSpectrum[i].nu, SimSpectrum[i].A);
		 glEnd();
	 }
	 if(dispRefSpec && RefSpectrum.size() > 0)
	 {
		 glColor3f(0.5, 0.5, 0.5);
		 glBegin(GL_LINE_STRIP);
		 float nu;
		 for(unsigned int i=0; i<RefSpectrum[currentSpec].size(); i++)
		 {
			 nu = RefSpectrum[currentSpec][i].nu;
			 glVertex2f(nu, RefSpectrum[currentSpec][i].A + nu * refSlope);
		 }
		 glEnd();
	 }

	 int nSamples = MaterialList[currentMaterial].eta.size();
	 float nu;
	 //display absorbance
	 if(dispMatK)
	 {
		 
		 glColor3f(1.0, 0.0, 0.0);
		 glBegin(GL_LINE_STRIP);
		 for(int i=0; i<nSamples; i++){
			 nu = MaterialList[currentMaterial].nu[i];
			 glVertex2f(nu, MaterialList[currentMaterial].eta[i].imag() * dispScaleK);
		 }
		 glEnd();
	 }
	 if(dispSimK)
	 {
		 glColor3f(1.0, 1.0, 0.0);
		 glBegin(GL_LINE_STRIP);
		 for(unsigned int i=0; i<EtaK.size(); i++){
			 glVertex2f(EtaK[i].nu, EtaK[i].A * dispScaleK);
		 }
		 glEnd();
	 }

	 //display refractive index (real)
	 if(dispMatN)
	 {
		 glColor3f(0.0, 1.0, 0.0);
		 glBegin(GL_LINE_STRIP);
		 for(int i=0; i<nSamples; i++){
			 nu = MaterialList[currentMaterial].nu[i];
			 glVertex2f(nu, (MaterialList[currentMaterial].eta[i].real() - baseIR) * dispScaleN);
		 }
		 glEnd();
	 }
	 if(dispSimN)
	 {
		 glColor3f(0.0, 1.0, 1.0);
		 glBegin(GL_LINE_STRIP);
		 for(unsigned int i=0; i<EtaN.size(); i++)
			 glVertex2f(EtaN[i].nu, (EtaN[i].A - baseIR) * dispScaleN);
		 glEnd();
	 }
	 

     glCallList(object);
 }

 void qtSpectrumDisplay::resizeGL(int width, int height)
 {
     int side = qMin(width, height);
     //glViewport((width - side) / 2, (height - side) / 2, side, side);
	 glViewport(0, 0, width, height);

     /*glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     //glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
	 gluOrtho2D(nuMin, nuMax, aMin, aMax);
     glMatrixMode(GL_MODELVIEW);*/
 }

 void qtSpectrumDisplay::mousePressEvent(QMouseEvent *event)
 {
     lastPos = event->pos();

	 if(event->buttons() & Qt::LeftButton)
	 {
		 int wn = 0;
		 printWavenumber(event->x());
	 }
 }

 void qtSpectrumDisplay::mouseMoveEvent(QMouseEvent *event)
 {
     int dx = event->x() - lastPos.x();
     int dy = event->y() - lastPos.y();
	 /*
     if (event->buttons() & Qt::LeftButton) {
         setXRotation(xRot + 8 * dy);
         setYRotation(yRot + 8 * dx);
     } else if (event->buttons() & Qt::RightButton) {
         setXRotation(xRot + 8 * dy);
         setZRotation(zRot + 8 * dx);
     }*/
     lastPos = event->pos();
 }

 /*GLuint qtSpectrumDisplay::makeObject()
 {
     GLuint list = glGenLists(1);
     glNewList(list, GL_COMPILE);

     glBegin(GL_QUADS);

     GLdouble x1 = +0.06;
     GLdouble y1 = -0.14;
     GLdouble x2 = +0.14;
     GLdouble y2 = -0.06;
     GLdouble x3 = +0.08;
     GLdouble y3 = +0.00;
     GLdouble x4 = +0.30;
     GLdouble y4 = +0.22;

     quad(x1, y1, x2, y2, y2, x2, y1, x1);
     quad(x3, y3, x4, y4, y4, x4, y3, x3);

     extrude(x1, y1, x2, y2);
     extrude(x2, y2, y2, x2);
     extrude(y2, x2, y1, x1);
     extrude(y1, x1, x1, y1);
     extrude(x3, y3, x4, y4);
     extrude(x4, y4, y4, x4);
     extrude(y4, x4, y3, x3);

     const double Pi = 3.14159265358979323846;
     const int NumSectors = 200;

     for (int i = 0; i < NumSectors; ++i) {
         double angle1 = (i * 2 * Pi) / NumSectors;
         GLdouble x5 = 0.30 * sin(angle1);
         GLdouble y5 = 0.30 * cos(angle1);
         GLdouble x6 = 0.20 * sin(angle1);
         GLdouble y6 = 0.20 * cos(angle1);

         double angle2 = ((i + 1) * 2 * Pi) / NumSectors;
         GLdouble x7 = 0.20 * sin(angle2);
         GLdouble y7 = 0.20 * cos(angle2);
         GLdouble x8 = 0.30 * sin(angle2);
         GLdouble y8 = 0.30 * cos(angle2);

         quad(x5, y5, x6, y6, x7, y7, x8, y8);

         extrude(x6, y6, x7, y7);
         extrude(x8, y8, x5, y5);
     }

     glEnd();

     glEndList();
     return list;
 }*/

 void qtSpectrumDisplay::quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2,
                     GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4)
 {
     qglColor(qtGreen);

     glVertex3d(x1, y1, -0.05);
     glVertex3d(x2, y2, -0.05);
     glVertex3d(x3, y3, -0.05);
     glVertex3d(x4, y4, -0.05);

     glVertex3d(x4, y4, +0.05);
     glVertex3d(x3, y3, +0.05);
     glVertex3d(x2, y2, +0.05);
     glVertex3d(x1, y1, +0.05);
 }

 /*void qtSpectrumDisplay::extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
 {
     qglColor(qtGreen.dark(250 + int(100 * x1)));

     glVertex3d(x1, y1, +0.05);
     glVertex3d(x2, y2, +0.05);
     glVertex3d(x2, y2, -0.05);
     glVertex3d(x1, y1, -0.05);
 }*/

 void qtSpectrumDisplay::normalizeAngle(int *angle)
 {
     while (*angle < 0)
         *angle += 360 * 16;
     while (*angle > 360 * 16)
         *angle -= 360 * 16;
 }