diff options
author | Christian Vazquez <christian.vazquez@epfl.ch> | 2011-03-27 14:55:09 +0000 |
---|---|---|
committer | Christian Vazquez <christian.vazquez@epfl.ch> | 2011-03-27 14:55:09 +0000 |
commit | 3e3ba28bbe391350405b4bc2d8bdd3488e56897f (patch) | |
tree | cfef4a404376ef82b95226658152b78e6344c342 /src | |
parent | af3436f5befeeb90ec9cd9e2277176a2881b6f64 (diff) | |
download | vhc-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.cc | 31 | ||||
-rw-r--r-- | src/main/Accelerator.h | 49 | ||||
-rw-r--r-- | src/main/CurvedElement.cc | 24 | ||||
-rw-r--r-- | src/main/CurvedElement.h | 9 | ||||
-rw-r--r-- | src/main/Element.cc | 1 | ||||
-rw-r--r-- | src/main/Element.h | 9 | ||||
-rw-r--r-- | src/main/Makefile | 4 | ||||
-rw-r--r-- | src/main/StraightElement.cc | 15 | ||||
-rw-r--r-- | src/main/StraightElement.h | 17 | ||||
-rw-r--r-- | src/test/AccelTest.cc | 22 |
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; +} |