diff options
author | Jakob Odersky <jodersky@gmail.com> | 2011-04-13 13:26:54 +0000 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2011-04-13 13:26:54 +0000 |
commit | a0ced12c6a243ac4acf68500ae71688cd851fcda (patch) | |
tree | 2d08bdfdd635eb9e00913902df2a5c3736c479f3 | |
parent | d4c30f04e6b84df2d88841f1544d16ef9973ffb1 (diff) | |
download | vhc-a0ced12c6a243ac4acf68500ae71688cd851fcda.tar.gz vhc-a0ced12c6a243ac4acf68500ae71688cd851fcda.tar.bz2 vhc-a0ced12c6a243ac4acf68500ae71688cd851fcda.zip |
version amelioree de l'interface graphique
-rw-r--r-- | src/gui/ElementRenderer.cc | 15 | ||||
-rw-r--r-- | src/gui/ElementRenderer.h | 2 | ||||
-rw-r--r-- | src/gui/Main.cc | 50 | ||||
-rw-r--r-- | src/gui/Makefile | 2 | ||||
-rw-r--r-- | src/gui/ParticleRenderer.cc | 4 | ||||
-rw-r--r-- | src/gui/Stage.cc | 51 | ||||
-rw-r--r-- | src/gui/Stage.h | 9 |
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; - }; } |