summaryrefslogtreecommitdiff
path: root/src/main/Element.h
blob: 8f1ce234d25ebb6faa1b6656df37af85a812e855 (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
/*
 * Element.h
 *
 *  Created on: Mar 16, 2011
 *      Author: jakob
 */

#ifndef ELEMENT_H_
#define ELEMENT_H_

#include <string>
#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 {

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 precedent.
	 *  NULL si aucun element n'existe. */
	Element *previous;

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



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);

	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;

	virtual bool isBefore(const Vector3D& position) const = 0;
	bool isBefore(const Particle& particle) const;

	virtual bool isBeside(const Vector3D& position) const = 0;
	bool isBeside(const Particle& particle) const;

	virtual bool isAfter(const Vector3D& position) const = 0;
	bool isAfter(const Particle& particle) const;

	bool contains(const Vector3D& position) const;
	bool contains(const Particle& particle) const;

	virtual Vector3D getHorizontalAt(const Vector3D& position) const = 0;

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

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

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

	/** Retourne la position d'entree. */
	Vector3D getEntryPosition() const;

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

	/** Retourne la position de sortie. */
	Vector3D getExitPosition() const;

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

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

	/** Retourne la longueur de cet element. */
	virtual double getLength() const = 0;

	/** 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* getPrevious() const;

	/** Assigne un pointeur sur l'element suivant. */
	void setPrevious(Element* p);

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

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

	/** Retourne vrai si cet element est connecte a un element precedent et suivant, faux sinon. */
	bool isConnected() const;

	/** 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;

	/** Retourne une représentation de cet élément sous forme de chaînes de caractères.*/
	virtual std::string toString() const;

	/** Accepte un visiteur d'elements.
	 *  @see ElementVisitor */
	virtual void accept(const ElementVisitor& v) const = 0;

};

}

#endif /* ELEMENT_H_ */