summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/Accelerator.h4
-rw-r--r--src/main/Particle.cc6
-rw-r--r--src/main/Particle.h9
-rw-r--r--src/main/Vector3D.cc56
-rw-r--r--src/main/Vector3D.h40
-rw-r--r--src/test/PacticleTest.cc28
-rw-r--r--src/test/Vector3DTest.cc47
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;
-}