summaryrefslogblamecommitdiff
path: root/src/main/CurvedElement.h
blob: 1f7116e205778525d9f489d192f1b0414c5d698d (plain) (tree)
1
2
3
4
5
6
7
8
9
  
                  




                            

                        

                 
                    
                     



                     



                                                                                                                        
                                     


          
                        
                         
 


                                                                

       





                                                                      
                                                                                                                                 
 

                                                                              
                                                                
                                                                   



                                                                                                             

                                                                                                                                              

         















                                                                                        



  
                             
/*
 * CurvedElement.h
 *
 *  Created on: Mar 22, 2011
 *      Author: jakob
 */

#ifndef CURVEDELEMENT_H_
#define CURVEDELEMENT_H_

#include <math.h>
#include "Element.h"
#include "Particle.h"
#include "Vector3D.h"

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:

	/** Courbure. */
	double curvature;

	/** Centre de courbure de cet element. (coord. abs. ) */
	Vector3D curvatureCenter;

public:

	/** Constructeur d'elements courbes.
	 *  @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 curvature courbure de cet element
	 *  @param next pointeur sur l'element suivant */
	CurvedElement(const Vector3D& entry, const Vector3D& exit, double sectionRadius, double curvature, Element* next = NULL);

	virtual CurvedElement* copy() const {return new CurvedElement(*this);}

	virtual bool isOutside(const Particle& particle) const {
		Vector3D x(particle.getPosition() - entryPosition);
		return (x - Vector3D(x.getX(), x.getY(), 0).unit() / fabs(curvature)).norm() > sectionRadius;
	}

	virtual bool isPast(const Particle& particle) const {
		Vector3D out = (entryPosition - curvatureCenter).cross(exitPosition - curvatureCenter).cross(entryPosition - curvatureCenter);
		return (particle.getPosition() - exitPosition).dot(out) > 0;
	}

	double getCurvature() const {return curvature;}

	Vector3D getCurvatureCenter() const {return curvatureCenter;}

	virtual std::string getType() const {return "Curved Element";}
	virtual std::string toString() const {
		std::stringstream s;
		s << Element::toString() << "\n";
		s << "\tcurvature: "		<< getCurvature() 		<< "\n";
		s << "\tcurvature radius: "	<< 1.0 / getCurvature() << "\n";
		s << "\tcurvature center: "	<< getCurvatureCenter();
		return s.str();
	}



};

}

#endif /* CURVEDELEMENT_H_ */