summaryrefslogtreecommitdiff
path: root/src/main/Element.h
blob: 32ba2db5d0bd81da28ab1445b1409b91d46fc83e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * Element.h
 *
 *  Created on: Mar 16, 2011
 *      Author: jakob
 */

#ifndef ELEMENT_H_
#define ELEMENT_H_

#include <string>
#include <sstream>
#include "Vector3D.h"
#include "Particle.h"
#include "Printable.h"
#include "ElementVisitor.h"
#include "Cloneable.h"


namespace vhc {

/** Classe abstraite representant un element d'un accelerateur. */
class Element: public Printable, public Cloneable {

private:

	/** Empêche la copie d'éléments par le constructeur de copie.
	 *  Si on veut explicitement copier un element utiliser <code>clone()</code>.*/
	//Element(const Element& e);

protected:

	/** Position du centre de la face d'entrée. */
	Vector3D entryPosition;

	/** Position du centre de la face de sortie. */
	Vector3D exitPosition;

	/** Rayon de la chambre à vide. */
	double sectionRadius;

	/** Pointeur sur l'élément suivant.
	 *  NULL si aucun element n'existe. */
	Element *next;

	/* Intensité (constante) du champ.
		 *  à améliorer
		double fieldIntensity;
		Vector3D magneticField

		* Direction du champ magnétique, invariant dans l'espace.
		Vector3D fieldDirection;
	 */

public:

	/** Constructeur d'elements.
	 *  @param entry position de la face d'entree
	 *  @param exit position de face de sortie
	 *  @param sectionRadius rayon de section de la chambre a vide
	 *  @param next pointeur sur l'element suivant */
	Element(const Vector3D& entry, const Vector3D& exit, double sectionRadius, Element* next = NULL):
		entryPosition(entry),
		exitPosition(exit),
		sectionRadius(sectionRadius),
		next(next) {};

	virtual ~Element() {};

	/** Copie l'element sur le heap et renvoye un pointeur sur la copie.
	 *  En copiant un element, le pointeur sur l'element suivant est remis a zero.
	 *  ATTENTION: La delocation de memoire est sous la responsabilite de l'appelant. */
	virtual Element* clone() const = 0;

	/** Determine si la particule donnee a heurte le bord de cet element. */
	virtual bool hasHit(const Particle& particle) const = 0;

	/** Determine si la particule donnee a passe cet element. */
	virtual bool isPast(const Particle& particle) const = 0;

	/** Retourne le champ magnetique, a l'interieur de cet element a la position donnee. */
	virtual Vector3D magneticFieldAt(const Vector3D& position) const {
		return Vector3D::Null;
	}

	/** Retourne le champ electrique, a l'interieur de cet element a la position donnee. */
	virtual Vector3D electricFieldAt(const Vector3D& position) const {
		return Vector3D::Null;
	}

	/** Retourne la diagonale, c'est-a-dire le vecteur de la position d'entree
	 *  a la position de sortie. */
	Vector3D getDiagonal() const {return exitPosition - entryPosition;}

	/** Retourne la position d'entree. */
	Vector3D getEntryPosition() const {return entryPosition;}

	/** Assigne la position d'entree. */
	//void setEntryPosition(const Vector3D& newPos) {entryPosition = newPos;}

	/** Retourne la position de sortie. */
	Vector3D getExitPosition() const {return exitPosition;}

	/** Assigne la position de sortie. */
	//void setExitPosition(const Vector3D& newPos) {exitPosition = newPos;}

	/** Retourne le rayon de la section de cet element. */
	double getSectionRadius() const {return sectionRadius;}

	/** Assigne le rayon de la section de cet element. */
	void setSectionRadius(double r) {sectionRadius = r;}

	/** Retourne un pointeur l'element suivant. NULL s'il n'existe pas. */
	Element* getNext() const {return next;}

	/** Assigne un pointeur sur l'element suivant. */
	void setNext(Element* n) {next = n;}

	/** Retourne vrai si cet element est connecte a un element suivant, faux sinon. */
	bool isConnected() const {return next != NULL;}

	/** Retourne une representation en chaine du type de cet element, i.e. du nom de la classe.
	 *  Cette methode est utilisee principalement pour changer le comportement de <code>toString()</code>
	 *  dans des implementations concretes. */
	virtual std::string getType() const {return "Element";}

	virtual std::string toString() const {
		std::stringstream s;
		s << getType() << ":\n";
		s << "\tentry: " << getEntryPosition()	<<	"\n";
		s << "\texit: " << getExitPosition()	<<	"\n";
		s << "\tsection radius: " << getSectionRadius()	<<	"\n";
		s << "\tconnected: " << (isConnected() ? "true" : "false");
		return s.str();
	}

	virtual void accept(const ElementVisitor& v) const = 0;
};

}

#endif /* ELEMENT_H_ */