summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Vazquez <christian.vazquez@epfl.ch>2011-03-27 14:55:09 +0000
committerChristian Vazquez <christian.vazquez@epfl.ch>2011-03-27 14:55:09 +0000
commit3e3ba28bbe391350405b4bc2d8bdd3488e56897f (patch)
treecfef4a404376ef82b95226658152b78e6344c342 /src
parentaf3436f5befeeb90ec9cd9e2277176a2881b6f64 (diff)
downloadvhc-3e3ba28bbe391350405b4bc2d8bdd3488e56897f.tar.gz
vhc-3e3ba28bbe391350405b4bc2d8bdd3488e56897f.tar.bz2
vhc-3e3ba28bbe391350405b4bc2d8bdd3488e56897f.zip
Updated 'Reponses'.
New class Accelerator and related test file. Updated makefile from ./main few doxygen comments added
Diffstat (limited to 'src')
-rw-r--r--src/main/Accelerator.cc31
-rw-r--r--src/main/Accelerator.h49
-rw-r--r--src/main/CurvedElement.cc24
-rw-r--r--src/main/CurvedElement.h9
-rw-r--r--src/main/Element.cc1
-rw-r--r--src/main/Element.h9
-rw-r--r--src/main/Makefile4
-rw-r--r--src/main/StraightElement.cc15
-rw-r--r--src/main/StraightElement.h17
-rw-r--r--src/test/AccelTest.cc22
10 files changed, 165 insertions, 16 deletions
diff --git a/src/main/Accelerator.cc b/src/main/Accelerator.cc
index c0b9378..ddc2d81 100644
--- a/src/main/Accelerator.cc
+++ b/src/main/Accelerator.cc
@@ -8,10 +8,33 @@
#include "Accelerator.h"
namespace vhc {
+ /** Cf. Accelerator.h */
+ std::string Accelerator::toString() const {
-Accelerator::Accelerator() {
- // TODO Auto-generated constructor stub
-
-}
+ std::stringstream s;
+ if (elementCollec.size()==0) {
+ s<<"This accelerator doesn't contain anything."<<"\n";
+ }else if (elementCollec.size()==1) {
+ s<<"This accelerator is made of the following element :"<<"\n";
+ s<<elementCollec[0]->toString()<<"\n";
+ }else{
+ s<<"This accelerator is made of the "<<elementCollec.size()<<" following elements :"<<"\n";
+ for (int i(1); elementCollec.size(); ++i){
+ s<<elementCollec[i-1]->toString()<<"\n";
+ }
+ }
+ if (elementCollec.size()!=0 || particleCollec.size()==0) {
+ s<<"This accelerator doesn't contain any particle."<<"\n";
+ }else if (particleCollec.size()==1) {
+ s<<"This accelerator contains the following particle :"<<"\n";
+ s<<particleCollec[0]->toString()<<"\n";
+ }else{
+ s<<"This accelerator contains the "<<particleCollec.size()<<" following particles :"<<"\n";
+ for (int i(1); particleCollec.size(); ++i){
+ s<<particleCollec[i-1]->toString()<<"\n";
+ }
+ }
+ return s.str();
+ };
}
diff --git a/src/main/Accelerator.h b/src/main/Accelerator.h
index 96b599a..2481350 100644
--- a/src/main/Accelerator.h
+++ b/src/main/Accelerator.h
@@ -14,17 +14,29 @@
namespace vhc {
+// TODO Do we need any destructor ?
class Accelerator {
+private :
+
+ /** Constructeur de copie ne faisant rien. */
+ Accelerator (Accelerator const& autre) {}
+
+ /** Opérateur '=' ne faisant rien. */
+ bool operator= (Accelerator const& autre) const {}
+
protected:
- vector <Element> elementCollec;
- vector <Particle> particleCollec;
+
+ /** Attributs d'un accélérateur : une collection d'éléments, et une de particules. */
+ std::vector< Element* > elementCollec;
+ std::vector< Particle* > particleCollec;
+
public:
- /* Constructeur d'un accélérateur.
- * Todo améliorer l'instanciation des attributs à l'aide d'une fonction. */
- Accelerator (const vector<Element>& eCollec, const vector<Particle>& pCollec):
- elementCollec=eCollec,
- particle=pCollec
+ /** Constructeur d'un accélérateur. */
+ // Pour l'instant j'ai décidé que l'accélérateur possède deux containers (cf. slide35)
+ Accelerator ():
+ elementCollec(0),
+ particleCollec(0)
{};
/* Retourne un pointeur sur un élément de l'accélérateur,
@@ -35,7 +47,28 @@ public:
/* Retourne un pointeur sur une particule de l'accélérateur,
* il n'y a pas besoin d'avoir la particule elle-même.
* Question : où mettre le 'delete' ? */
- Particle* getParticle(int matricle) const { return particleCollec[matricle-1]; }
+ Particle* getParticle(int rank) const { return particleCollec[rank-1]; }
+
+ /** Retourne une représentation en chaîne de caractères de cet accélérateur. */
+ virtual std::string toString() const;
+
+ // TODO méthodes demandées dans la consigne
+ /** Ajoute un élément à l'accélérateur. */
+ void addElement();
+
+ /** Ajoute une particule à l'accélérateur. */
+ void addParticle();
+
+ /** Efface tous les éléments. */
+ void killAllElements();
+
+ /** Efface toutes les particules. */
+ void KillAllParticles();
+
+ /** Fait évoluer l'accélérateur. */
+ void play();
+
+
};
}
diff --git a/src/main/CurvedElement.cc b/src/main/CurvedElement.cc
index f4b760a..1abfcbf 100644
--- a/src/main/CurvedElement.cc
+++ b/src/main/CurvedElement.cc
@@ -12,9 +12,14 @@
namespace vhc {
+<<<<<<< .mine
+ /** Cf. CurvedElement.h */
+ CurvedElement::CurvedElement(const Vector3D& entry, const Vector3D& exit, double sectionRadius, double curvature, Element* next):
+
using namespace std;
CurvedElement::CurvedElement(const Vector3D& entry, const Vector3D& exit, double sectionRadius, double curvature, Element* next):
+
Element(entry, exit, sectionRadius, next),
curvature(curvature),
curvatureCenter(Vector3D::Null) {
@@ -30,4 +35,23 @@ CurvedElement::CurvedElement(const Vector3D& entry, const Vector3D& exit, double
curvatureCenter = midpoint + sqrt(1.0 - (k * k) / 4 * getDiagonal().normSquare()) * (getDiagonal().unit().cross(Vector3D::k));
}
+
+ /* TODO print also Vecotr3D magnetic field
+ * Schould we do as if curved element is an abstract class
+ * and implement this method under the class 'MagneticCurvedElement'??
+ */
+ /** Cf. CurvedElement.h */
+ std::string CurvedElement::toString() const {
+
+ std::stringstream s;
+ s << "CurvedElement:" << "\n";
+ s << "\tPosition of entry: " << entryPosition << "\n";
+ s << "\tPosition of exit: " << exitPosition << "\n";
+ s << "\tRadius of section: " << sectionRadius << "\n";
+ s << "\tRadius of curvature 1/k: " << 1/curvature << "\n";
+ s << "\tCenter of curvature: " << curvatureCenter << "\n";
+ s << "\t";
+ return s.str();
+ }
+
}
diff --git a/src/main/CurvedElement.h b/src/main/CurvedElement.h
index 1f7116e..1f3e6c6 100644
--- a/src/main/CurvedElement.h
+++ b/src/main/CurvedElement.h
@@ -15,10 +15,12 @@
namespace vhc {
+
/** Represente un element courbe. En plus de posseder les proprietes generales d'un element,
* un element courbe a de plus une courbure et un centre de courbure.
* ==> TODO ajouter explication de la courbure
* Le centre de courbure est calcule avec la courbure et les positions des faces d'entree et de sortie d'un element. */
+
class CurvedElement: public Element {
protected:
@@ -31,6 +33,8 @@ protected:
public:
+
+ /** Constructeur d'un élément courbe. */
/** Constructeur d'elements courbes.
* @param entry position de la face d'entree
* @param exit position de face de sortie
@@ -39,6 +43,7 @@ public:
* @param next pointeur sur l'element suivant */
CurvedElement(const Vector3D& entry, const Vector3D& exit, double sectionRadius, double curvature, Element* next = NULL);
+ /** Retourne un booléen indiquant la présence à l'intérieur de l'élément de la particule. */
virtual CurvedElement* copy() const {return new CurvedElement(*this);}
virtual bool isOutside(const Particle& particle) const {
@@ -46,11 +51,15 @@ public:
return (x - Vector3D(x.getX(), x.getY(), 0).unit() / fabs(curvature)).norm() > sectionRadius;
}
+ /** Retourne un booléen indiquant le passage au prochain élément de la particule. */
virtual bool isPast(const Particle& particle) const {
Vector3D out = (entryPosition - curvatureCenter).cross(exitPosition - curvatureCenter).cross(entryPosition - curvatureCenter);
return (particle.getPosition() - exitPosition).dot(out) > 0;
}
+ /** Retourne une chaîne de caractères de cet élément courbe. */
+ virtual std::string toString () const;
+
double getCurvature() const {return curvature;}
Vector3D getCurvatureCenter() const {return curvatureCenter;}
diff --git a/src/main/Element.cc b/src/main/Element.cc
index ef1302a..8776fbf 100644
--- a/src/main/Element.cc
+++ b/src/main/Element.cc
@@ -15,5 +15,4 @@ namespace vhc {
//}
-
}
diff --git a/src/main/Element.h b/src/main/Element.h
index 598a23d..eb122e3 100644
--- a/src/main/Element.h
+++ b/src/main/Element.h
@@ -16,7 +16,8 @@
namespace vhc {
-/** Classe abstraite representant un element d'un accelerateur. */
+// TODO destructeur virtuel!!!
+/** Classe abstraite représentant un élément d'un accelerateur. */
class Element: public Printable {
private:
@@ -67,6 +68,7 @@ public:
virtual Element* copy() const = 0;
/** Determine si la particule donnee a heurte le bord de cet element. */
+
virtual bool isOutside(const Particle& particle) const = 0;
/** Determine si la particule donnee a passe cet element. */
@@ -97,9 +99,12 @@ public:
/** Retourne un pointeur l'element suivant. NULL s'il n'existe pas. */
Element* getNext() const {return next;}
- /** Assigne un pointeur sur l'element suivant. */
+ /** Assigne un pointeur sur l'élément suivant. */
void setNext(Element* n) {next = n;}
+ /** Retourne une représentation en chaîne de caractères de cet élément. */
+ virtual std::string toString() const = 0;
+
bool isConnected() const {return next != NULL;}
virtual std::string getType() const {return "Element";}
diff --git a/src/main/Makefile b/src/main/Makefile
index 9cb11b0..9c99d37 100644
--- a/src/main/Makefile
+++ b/src/main/Makefile
@@ -13,8 +13,10 @@ LOCALDIR = main
# ==> Ajouter ici les objets à compiler
# Si un objet nécessite une compilation non-standard (i.e. pas de règle du style Foo.o : Foo.cc Foo.h), rajouter
# cette règle.
+
LOCALOBJS = Vector3D.o Particle.o Printable.o Element.o CurvedElement.o StraightElement.o MagneticElement.o \
- CompositeElement.o ElectricElement.o
+ CompositeElement.o ElectricElement.o Accelerator.o
+
OBJS=$(addprefix $(BINDIR)/$(LOCALDIR)/,$(LOCALOBJS))
.PHONY = lib
diff --git a/src/main/StraightElement.cc b/src/main/StraightElement.cc
index d1540ec..e438531 100644
--- a/src/main/StraightElement.cc
+++ b/src/main/StraightElement.cc
@@ -9,6 +9,21 @@
namespace vhc {
+ // TODO finish implementing abstract methods of Element (toString)
+ // Print also magnetic field
+ // Same question as in CurvedElement.cc
+
+ /** Cf. StraightElement.h */
+ std::string StraightElement::toString() const {
+
+ std::stringstream s;
+ s << "StraightElement:" << "\n";
+ s << "\tPosition of entry: " << entryPosition << "\n";
+ s << "\tPosition of exit: " << exitPosition << "\n";
+ s << "\tRadius of section: " << sectionRadius << "\n";
+ s << "\t";
+ return s.str();
+ }
}
diff --git a/src/main/StraightElement.h b/src/main/StraightElement.h
index 8ce4db0..cf769be 100644
--- a/src/main/StraightElement.h
+++ b/src/main/StraightElement.h
@@ -23,8 +23,22 @@ public:
Element(entry, exit, sectionRadius, next)
{};
+ // TODO avec cette mauvaise méthode, tous les éléments pointent vers l'origine...
+ /** Constructeur d'une section, où l'on donne une position d'entrée et une longueur. */
+ StraightElement(const Vector3D& entry, double l, double sectionRadius,const Vector3D& exit=Vector3D::Null, Element* next = NULL):
+ Element(entry, exit, sectionRadius, next)
+ { this->setLength(l); };
+
+ /* Affecte un longueur à la section droite, à partir de la position d'entrée. */
+ void setLength (double l) {
+ setExitPosition( entryPosition + ( l * (~(exitPosition - entryPosition))));
+ }
+
+ //TODO ! why can't you access protected variables, i.e. entryPosition won't work?!
+
virtual StraightElement* copy() const {return new StraightElement(*this);}
+
virtual bool isOutside(const Particle& particle) const {
Vector3D a(particle.getPosition() - entryPosition);
const Vector3D b = (particle.getPosition() - entryPosition);
@@ -36,6 +50,9 @@ public:
return getDiagonal().dot(v) > getDiagonal().dot(getDiagonal());
}
+ /* Retourne une chaîne de caractères de cet élément droit. */
+ virtual std::string toString () const;
+
virtual std::string getType() const {return "Straight Element";}
virtual std::string toString() const {
std::stringstream s;
diff --git a/src/test/AccelTest.cc b/src/test/AccelTest.cc
new file mode 100644
index 0000000..e3c40cd
--- /dev/null
+++ b/src/test/AccelTest.cc
@@ -0,0 +1,22 @@
+/*
+ * testAccel1.cc
+ *
+ * Created on: 23 mars 2011
+ * Author: christian
+ */
+
+
+#include "Accelerator.h"
+#include <iostream>
+#include <string>
+#include <vector>
+
+using namespace vhc;
+using namespace std;
+/** lance le test*/
+//TODO test avec un accélérateur initialisé
+int main() {
+ Accelerator a();
+ cout << a << endl;
+ return 0;
+}