diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/Accelerator.h | 4 | ||||
-rw-r--r-- | src/main/Particle.cc | 6 | ||||
-rw-r--r-- | src/main/Particle.h | 9 | ||||
-rw-r--r-- | src/main/Vector3D.cc | 56 | ||||
-rw-r--r-- | src/main/Vector3D.h | 40 | ||||
-rw-r--r-- | src/test/PacticleTest.cc | 28 | ||||
-rw-r--r-- | src/test/Vector3DTest.cc | 47 |
7 files changed, 159 insertions, 31 deletions
diff --git a/src/main/Accelerator.h b/src/main/Accelerator.h index 2fe0b1a..deeaf69 100644 --- a/src/main/Accelerator.h +++ b/src/main/Accelerator.h @@ -26,7 +26,7 @@ private : Accelerator (Accelerator const& other) {} /** Opérateur '=' ne faisant rien. */ - void operator= (Accelerator const& other) const {} + void operator= (Accelerator const& other) {} protected: @@ -148,7 +148,7 @@ public: Vector3D a = particle.getForce() / (particle.getGamma() * particle.getMass()); particle.setVelocity(particle.getVelocity() + a * dt); - particle.setPosition(particle.getPosition() + particle.getVelocity() * dt); + particle.translate(particle.getVelocity() * dt); particle.setForce(Vector3D::Null); if (particle.getElement()->isBeside(particle)) std::cout << "Particle hit wall!" << std::endl; diff --git a/src/main/Particle.cc b/src/main/Particle.cc index 405b6b5..230f049 100644 --- a/src/main/Particle.cc +++ b/src/main/Particle.cc @@ -33,14 +33,16 @@ Vector3D Particle::getPosition() const {return position;} void Particle::setPosition(const Vector3D& pos) {position = pos;} +void Particle::translate(const Vector3D& dx) {position += dx;} + Vector3D Particle::getForce() const {return force;} void Particle::setForce(const Vector3D& f) {force = f;} -void Particle::applyForce(const Vector3D& f) {force = force + f;} +void Particle::applyForce(const Vector3D& f) {force += f;} void Particle::applyMagneticForce(const Vector3D& b, double dt) { - if (b != Vector3D::Null) { + if (dt != 0 && b != Vector3D::Null) { Vector3D f = charge * velocity.cross(b); applyForce(f.rotate(velocity.cross(f), (dt * f.norm()) / (2 * gamma * mass * velocity.norm()))); } diff --git a/src/main/Particle.h b/src/main/Particle.h index 78ee905..7c16176 100644 --- a/src/main/Particle.h +++ b/src/main/Particle.h @@ -26,13 +26,13 @@ class Particle: public Printable, public Cloneable { private: /** Position de cette particule. [m] */ - Vector3D position; + MutableVector3D position; /** Vitesse de cette particule. [m/s] */ - Vector3D velocity; + MutableVector3D velocity; /** Force résultante sur cette particule. [N] */ - Vector3D force; + MutableVector3D force; /** Masse de cette particule. [kg] */ double mass; @@ -69,6 +69,9 @@ public: /** Affecte la position de cette particule. [m] */ void setPosition(const Vector3D& pos); + /** Translate cette particule. */ + void translate(const Vector3D& dx); + /** Retourne la force résultante sur cette particule. [N] */ Vector3D getForce() const; diff --git a/src/main/Vector3D.cc b/src/main/Vector3D.cc index 94952c3..fc7fc2b 100644 --- a/src/main/Vector3D.cc +++ b/src/main/Vector3D.cc @@ -86,6 +86,62 @@ Vector3D const Vector3D::j = Vector3D(0.0, 1.0, 0.0); //c.f. header Vector3D const Vector3D::k = Vector3D(0.0, 0.0, 1.0); +MutableVector3D::MutableVector3D(double _x, double _y, double _z): Vector3D(_x, _y, _z) {}; +MutableVector3D::MutableVector3D(const Vector3D& v): Vector3D(v.getX(), v.getY(), v.getZ()) {}; + +void MutableVector3D::update() { + normCache = -1; +} + +void MutableVector3D::setX(double x) { + this->x = x; + update(); +} + +void MutableVector3D::setY(double y) { + this->y = y; + update(); +} + +void MutableVector3D::setZ(double z) { + this->z = z; + update(); +} + +void MutableVector3D::operator=(const Vector3D& v) { + x = v.getX(); + y = v.getY(); + z = v.getZ(); + update(); +} + +void MutableVector3D::operator+=(const Vector3D& v) { + x += v.getX(); + y += v.getY(); + z += v.getZ(); + update(); +} + +void MutableVector3D::operator-=(const Vector3D& v) { + x -= v.getX(); + y -= v.getY(); + z -= v.getZ(); + update(); +} + +void MutableVector3D::operator*=(double n) { + x *= n; + y *= n; + z *= n; + update(); +} + +void MutableVector3D::operator/=(double n) { + x /= n; + y /= n; + z /= n; +} + //c.f. header Vector3D operator* (double n, const Vector3D& v) { return v * n; diff --git a/src/main/Vector3D.h b/src/main/Vector3D.h index ee7ffcc..21f484f 100644 --- a/src/main/Vector3D.h +++ b/src/main/Vector3D.h @@ -21,12 +21,10 @@ namespace vhc { * Ainsi, chaque opération sur un vecteur retourne une nouvelle instance. La * performance ainsi perdue est minimale pour une classe ne contenant que trois * champs. - * Les méthodes d'un vecteur sont toutes très simples et implémentées dans le header, - * afin d'être développées 'inline' durant la compilation, ce qui est plus rapide. */ class Vector3D: public Printable { -private: +protected: /** Composante x. */ double x; @@ -132,6 +130,42 @@ public: }; +/** Un vecteur mutable de dimension trois. Contrairement a sa super classe, les composantes des instances + * d'un vecteur mutable peuvent varier. + * Bien que le raisonement sur une classe mutable soit plus difficile (i.e. on ne peut pas facilement savoir si quelqu'un l'a + * modifiee), elle peur apporter un gain de performance. + * L'utilisation de cette classe n'est donc pas recommendee sauf pour des cas ou un vecteur changerait tres souvent comme + * les coordonnees d'une particule par exemple. */ +class MutableVector3D: public Vector3D { + +private: + + /** Methode pour mettre a jour ce vecteur (reinisialier toute sorte de cache etc...). Appele quand ce vecteur est modifie. */ + void update(); + +public: + + MutableVector3D(double _x, double _y, double _z); + MutableVector3D(const Vector3D& v); + + /** Assigne une valeur x a la premiere composante de ce vecteur. */ + void setX(double x); + + /** Assigne une valeur y a la deuxieme composante de ce vecteur. */ + void setY(double y); + + /** Assigne une valeur z a la deuxieme composante de ce vecteur. */ + void setZ(double z); + + void operator=(const Vector3D& v); + + void operator+=(const Vector3D& v); + void operator-=(const Vector3D& v); + void operator*=(double n); + void operator/=(double n); + +}; + /** Surcharge externe de la mutliplication scalaire. */ Vector3D operator* (double n, const Vector3D& v); diff --git a/src/test/PacticleTest.cc b/src/test/PacticleTest.cc new file mode 100644 index 0000000..4bc5a59 --- /dev/null +++ b/src/test/PacticleTest.cc @@ -0,0 +1,28 @@ +/* + * PacticleTest.cc + * + * Created on: Apr 25, 2011 + * Author: jakob + */ + +#include <iostream> +#include "constants.h" +#include "Particle.h" +#include "Vector3D.h" + +using namespace std; +using namespace vhc; +using namespace constants; + +int main() { + Particle p1 = Particle(Vector3D::Null, PROTON_MASS, E, 1 * GeV, Vector3D::i); + Particle p2 = Particle(Vector3D(5,3,2), ELECTRON_MASS, E, 1.5 * GeV, Vector3D::j); + Particle p3 = p1; + + cout << p1 << endl; + cout << p2 << endl; + cout << p3 << endl; + + + return 0; +} diff --git a/src/test/Vector3DTest.cc b/src/test/Vector3DTest.cc index d090682..c9bd3c7 100644 --- a/src/test/Vector3DTest.cc +++ b/src/test/Vector3DTest.cc @@ -16,18 +16,37 @@ using namespace std; using namespace vhc; -bool printTest(); - int main() { - //equality test - assert(Vector3D(1, 2, 3) == Vector3D(1, 2, 3)); - assert(Vector3D(1, 2.4, 3) != Vector3D(1, 2, 3)); + Vector3D vect1(1.0, 2, -0.1); + Vector3D vect2(2.6, 3.5, 4.1); + Vector3D vect3 = vect1; + + cout << "Vecteur 1 :"; + cout << vect1; + + cout << "Vecteur 2 :"; + cout << vect2; + + cout << "Le vecteur 1 est "; + if (Vector3D::ae(vect1, vect2)) { + cout << "egal au"; + } else { + cout << "différent du"; + } + cout << " vecteur 2," << endl << "et est"; + if (Vector3D::ae(vect1, vect3)) { + cout << "egal au"; + } else { + cout << "différent du"; + } + cout << " vecteur 3." << endl; + //addition test - assert(Vector3D(1, -0.9, 57683) + Vector3D(-1, 0.9, -57683) == Vector3D::Null); + assert(Vector3D::ae(Vector3D(1, -0.9, 57683) + Vector3D(-1, 0.9, -57683), Vector3D::Null)); //addition, multiplication test - assert(Vector3D(4, 0, 16) / 4 == -Vector3D(0.25, 0, 1) * -4); + assert(Vector3D::ae(Vector3D(4, 0, 16) / 4, -Vector3D(0.25, 0, 1) * -4)); //length test assert(Vector3D(0,3,4).norm() == 5); @@ -50,17 +69,3 @@ int main() { return 0; } - -bool printTest() { - cout << "PRINT TEST" << endl; - cout << Vector3D(1,2,3) << endl; - char answer; - do { - cout << "Was 'Vector3D(1,2,3)' displayed? (y/n)" << endl; - cin >> answer; - } while (answer != 'y' && answer != 'n'); - cout << "END PRINT TEST" << endl; - - if (answer == 'y') return true; - else return false; -} |