summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2011-04-13 13:26:54 +0000
committerJakob Odersky <jodersky@gmail.com>2011-04-13 13:26:54 +0000
commita0ced12c6a243ac4acf68500ae71688cd851fcda (patch)
tree2d08bdfdd635eb9e00913902df2a5c3736c479f3
parentd4c30f04e6b84df2d88841f1544d16ef9973ffb1 (diff)
downloadvhc-a0ced12c6a243ac4acf68500ae71688cd851fcda.tar.gz
vhc-a0ced12c6a243ac4acf68500ae71688cd851fcda.tar.bz2
vhc-a0ced12c6a243ac4acf68500ae71688cd851fcda.zip
version amelioree de l'interface graphique
-rw-r--r--src/gui/ElementRenderer.cc15
-rw-r--r--src/gui/ElementRenderer.h2
-rw-r--r--src/gui/Main.cc50
-rw-r--r--src/gui/Makefile2
-rw-r--r--src/gui/ParticleRenderer.cc4
-rw-r--r--src/gui/Stage.cc51
-rw-r--r--src/gui/Stage.h9
7 files changed, 107 insertions, 26 deletions
diff --git a/src/gui/ElementRenderer.cc b/src/gui/ElementRenderer.cc
index a31b71b..01b27a0 100644
--- a/src/gui/ElementRenderer.cc
+++ b/src/gui/ElementRenderer.cc
@@ -11,6 +11,7 @@
#include "CurvedElement.h"
#include "StraightElement.h"
#include "Dipole.h"
+#include "Quadrupole.h"
#include "util.h"
#include "Vector3D.h"
@@ -26,8 +27,7 @@ ElementRenderer::~ElementRenderer() {
}
-
-void ElementRenderer::visit(StraightElement* straight) {
+void ElementRenderer::drawStraight(StraightElement* straight) {
glPushMatrix();
glTranslated(straight->getEntryPosition().getX(), straight->getEntryPosition().getY(), straight->getEntryPosition().getZ());
Vector3D axis = Vector3D::k.cross(straight->getDiagonal());
@@ -42,12 +42,21 @@ void ElementRenderer::visit(StraightElement* straight) {
glPopMatrix();
}
-void ElementRenderer::visit(Quadrupole* quadrupole) {
+void ElementRenderer::visit(StraightElement* straight) {
+ glColor4d(0.4, 0.4, 0.4, 0.9);
+ drawStraight(straight);
+}
+
+void ElementRenderer::visit(Quadrupole* quadrupole) {
+ if (quadrupole->getFocusingCoefficient() > 1) glColor4d(0.4, 0, 0, 0.9);
+ else glColor4d(0, 0, 0.4, 0.9);
+ drawStraight(quadrupole);
}
void ElementRenderer::visit(Dipole* dipole) {
+ glColor4d(0.4, 0, 0.6, 0.9);
glPushMatrix();
glTranslated(dipole->getCurvatureCenter().getX(), dipole->getCurvatureCenter().getY(), dipole->getCurvatureCenter().getZ());
Vector3D d = dipole->getExitPosition() - dipole->getCurvatureCenter();
diff --git a/src/gui/ElementRenderer.h b/src/gui/ElementRenderer.h
index 4d50a9f..bbac319 100644
--- a/src/gui/ElementRenderer.h
+++ b/src/gui/ElementRenderer.h
@@ -20,6 +20,8 @@ private:
static const int SLICES = 100;
static const int STACKS_PER_LENGTH = 20;
+ void drawStraight(StraightElement* straight);
+
public:
ElementRenderer();
diff --git a/src/gui/Main.cc b/src/gui/Main.cc
index c96b8f4..f0eb3cd 100644
--- a/src/gui/Main.cc
+++ b/src/gui/Main.cc
@@ -13,7 +13,25 @@
#include "StraightElement.h"
#include "Dipole.h"
#include "Particle.h"
+#include "FODO.h"
#include "Vector3D.h"
+#include <vector>
+
+using namespace vhc;
+
+std::vector< Particle > createParticles(const Vector3D& position, int n) {
+ std::vector< Particle > v;
+
+ for (int i = 0; i < n; ++i) {
+ double x = (rand() % 100) / 1000.0;
+ double y = (rand() % 100) / 1000.0;
+ double z = (rand() % 100) / 1000.0;
+ v.push_back(Particle(position + Vector3D(x, y, z), 1, 1));
+ }
+
+ return v;
+}
+
int main(int argc, char *argv[])
@@ -29,11 +47,37 @@ int main(int argc, char *argv[])
accelerator.add(se2);
accelerator.add(*ce);
- vhc::Particle p(se.getEntryPosition(), 1, 1);
- accelerator.add(p);
+ FODO e1 = FODO(Vector3D(3, 2, 0), Vector3D(3, -2, 0), 0.2, 1.0, 5.0);
+ Dipole e2 = Dipole(e1.getExitPosition(), Vector3D(2, -3, 0), 0.2, 1);
+ FODO e3 = FODO(e2.getExitPosition(), Vector3D(-2, -3, 0), 0.2, 1, 5.0);
+ Dipole e4 = Dipole(e3.getExitPosition(), Vector3D(-3, -2, 0), 0.2, 1);
+ FODO e5 = FODO(e4.getExitPosition(), Vector3D(-3, 2, 0), 0.2, 1.0, 5.0);
+ Dipole e6 = Dipole(e5.getExitPosition(), Vector3D(-2, 3, 0), 0.2, 1);
+ FODO e7 = FODO(e6.getExitPosition(), Vector3D(2, 3, 0), 0.2, 1.0, 5.0);
+ Dipole e8 = Dipole(e7.getExitPosition(), e1.getEntryPosition(), 0.2, 1);
+ Accelerator acc;
+ acc.add(e1);
+ acc.add(e2);
+ acc.add(e3);
+ acc.add(e4);
+ acc.add(e5);
+ acc.add(e6);
+ acc.add(e7);
+ acc.add(e8);
+
+
+ vhc::Particle p(e1.getEntryPosition(), 1, 1);
+ acc.add(p);
+
+ std::vector< Particle > ps = createParticles(e1.getEntryPosition(), 1000);
+
+ for (int i = 0; i < ps.size(); ++i) {
+ acc.add(ps[i]);
+ }
+
vhc::Stage window;
- window.accelerator = &accelerator;
+ window.accelerator = &acc;
window.showFullScreen();
//window.resize(QSize(500, 500));
diff --git a/src/gui/Makefile b/src/gui/Makefile
index 738ae07..410ecc6 100644
--- a/src/gui/Makefile
+++ b/src/gui/Makefile
@@ -1,6 +1,6 @@
#############################################################################
# Makefile for building: $(BINDIR)/gui/gui
-# Generated by qmake (2.01a) (Qt 4.7.0) on: Wed Apr 13 02:07:35 2011
+# Generated by qmake (2.01a) (Qt 4.7.0) on: Wed Apr 13 15:26:23 2011
# Project: gui.pro
# Template: app
# Command: /usr/bin/qmake -o Makefile gui.pro
diff --git a/src/gui/ParticleRenderer.cc b/src/gui/ParticleRenderer.cc
index 38736c7..0674d5b 100644
--- a/src/gui/ParticleRenderer.cc
+++ b/src/gui/ParticleRenderer.cc
@@ -24,8 +24,8 @@ void ParticleRenderer::render(const Particle& particle) const {
glPushMatrix();
glTranslated(particle.getPosition().getX(), particle.getPosition().getY(), particle.getPosition().getZ());
glBegin(GL_POINTS);
- //glVertex3d(0, 0, 0);
- util::sphere(0.01);
+ glVertex3d(0, 0, 0);
+ //util::sphere(0.001);
glEnd();
glPopMatrix();
}
diff --git a/src/gui/Stage.cc b/src/gui/Stage.cc
index 14effa1..d7c6ee1 100644
--- a/src/gui/Stage.cc
+++ b/src/gui/Stage.cc
@@ -12,8 +12,7 @@ using namespace vhc::util;
namespace vhc {
-
-Stage::Stage(QWidget* parent): QGLWidget (parent), accelerator(NULL), camera(), elementRenderer(new ElementRenderer), particleRenderer(), wireframe(false), keys(0) {
+Stage::Stage(QWidget* parent): QGLWidget (parent), accelerator(NULL), camera(), elementRenderer(new ElementRenderer), particleRenderer(), displayMode(FILL), keys(0) {
setMouseTracking(true);
}
@@ -29,6 +28,7 @@ void Stage::initializeGL () {
}
void Stage::resizeGL (int width, int height) {
+ setCursor(QCursor(Qt::CrossCursor));
glViewport (0, 0, width, height);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
@@ -38,10 +38,12 @@ void Stage::resizeGL (int width, int height) {
void Stage::paintGL() {
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity ();
+ glLoadIdentity();
camera.setView();
+
+
glPushMatrix();
glScaled(100, 100, 100);
glColor3d(0.5, 0.5, 0.5);
@@ -55,20 +57,33 @@ void Stage::paintGL() {
glScaled (100.0, 100.0, 100.0);
- if (wireframe) {
- glPolygonMode(GL_FRONT, GL_LINE);
- glPolygonMode(GL_BACK, GL_LINE);
- } else {
+ switch (displayMode) {
+ case FILL:
glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_FILL);
+ break;
+ case WIREFRAME:
+ glPolygonMode(GL_FRONT, GL_LINE);
+ glPolygonMode(GL_BACK, GL_LINE);
+ break;
+ case POINTS:
+ glPolygonMode(GL_FRONT, GL_POINT);
+ glPolygonMode(GL_BACK, GL_POINT);
+ break;
+ default:
+ break;
}
-
if (accelerator != NULL){
- glColor3d(0.9, 0.4, 0);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ glEnable(GL_BLEND);
+ glDisable(GL_DEPTH_TEST);
for (unsigned int i = 0; i < accelerator->getElements().size(); ++i) {
accelerator->getElements()[i]->accept(*elementRenderer);
}
+ glEnable(GL_DEPTH_TEST);
+ glDisable(GL_BLEND);
+
glColor3d(0, 0, 1);
for (unsigned int i = 0; i < accelerator->getParticles().size(); ++i) {
particleRenderer.render(*(accelerator->getParticles()[i]));
@@ -123,17 +138,23 @@ void Stage::keyPressEvent (QKeyEvent* event) {
break;
case Qt::Key_R:
break;
- case Qt::Key_Space:
- wireframe = !wireframe;
+ case Qt::Key_1:
+ displayMode = FILL;
+ break;
+ case Qt::Key_2:
+ displayMode = WIREFRAME;
+ break;
+ case Qt::Key_3:
+ displayMode = POINTS;
break;
default:
break;
}
- if (keys & 1) mv = mv - Vector3D::j;
- if (keys & 2) mv = mv - Vector3D::i;
- if (keys & 4) mv = mv + Vector3D::j;
- if (keys & 8) mv = mv + Vector3D::i;
+ if (keys & 1) mv = mv - 3 * Vector3D::j;
+ if (keys & 2) mv = mv - 3 * Vector3D::i;
+ if (keys & 4) mv = mv + 3 * Vector3D::j;
+ if (keys & 8) mv = mv + 3 * Vector3D::i;
camera.move(mv);
updateGL();
diff --git a/src/gui/Stage.h b/src/gui/Stage.h
index 66bdc03..b37a55b 100644
--- a/src/gui/Stage.h
+++ b/src/gui/Stage.h
@@ -20,6 +20,12 @@
namespace vhc {
+enum DisplayMode {
+ FILL = 0,
+ WIREFRAME = 1,
+ POINTS = 2
+};
+
class Stage: public QGLWidget {
Q_OBJECT
@@ -49,12 +55,11 @@ private:
ElementRenderer* elementRenderer;
ParticleRenderer particleRenderer;
- bool wireframe;
+ DisplayMode displayMode;
int keys;
QPoint center;
-
};
}