qtSpectrumDisplay.cpp 4.95 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::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()
{
    //prepare the projection (orthographic, bounded by spectral values)
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(nuMin, nuMax, aMin, aMax);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    //clear the screen
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //set the line width
    glLineWidth(2);

    //draw the simulated spectrum (in white)
    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();
    }
    //draw the reference spectrum in gray
    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();
    }

    //draw the material properties

    //change the viewport properties (materials are plotted on a different scale)

    //compute the maximum k and n
    int nSamples = MaterialList[currentMaterial].eta.size();
    float maxK = 0.0;
    float maxN = 0.0;
    float thisN, thisK;
    for(int i=0; i<nSamples; i++)
    {
        thisN = fabs(MaterialList[currentMaterial].eta[i].real() - 1.49);
        if(thisN > maxN)
            maxN = thisN;
        thisK = fabs(MaterialList[currentMaterial].eta[i].imag());
        if(thisK > maxK)
            thisK = maxK;
    }
    cout<<maxN<<"---------"<<maxK<<endl;


    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(nuMin, nuMax, aMin, aMax);


    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);

glFlush();

//display the values at the mouse location
renderText(50, 50, "test");
}

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

}

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();

 lastPos = event->pos();
}

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::normalizeAngle(int *angle)
{
 while (*angle < 0)
     *angle += 360 * 16;
 while (*angle > 360 * 16)
     *angle -= 360 * 16;
}