Files
2019-12-06 15:12:28 +01:00

241 lines
6.2 KiB
C++

// -*- C++ -*-
// ---------------------------------------------------------------------------
//
// This file is a part of the CLHEP - a Class Library for High Energy Physics.
//
// History:
// 09.09.96 E.Chernyaev - initial version
// 12.06.01 E.Chernyaev - CLHEP-1.7: introduction of BasicVector3D to decouple
// the functionality from CLHEP::Hep3Vector
// 01.04.03 E.Chernyaev - CLHEP-1.9: template version
//
#ifndef HEP_POINT3D_H
#define HEP_POINT3D_H
#include <iosfwd>
#include "CLHEP/Vector/ThreeVector.h"
#include "CLHEP/Geometry/BasicVector3D.h"
namespace HepGeom {
class Transform3D;
/**
* Geometrical 3D Point.
* This is just a declaration of the class needed to define
* specializations Point3D<float> and Point3D<double>.
*
* @ingroup geometry
* @author Evgeni Chernyaev <Evgueni.Tcherniaev@cern.ch>
*/
template<class T>
class Point3D : public BasicVector3D<T> {};
/**
* Geometrical 3D Point with components of float type.
*
* @author Evgeni Chernyaev <Evgueni.Tcherniaev@cern.ch>
* @ingroup geometry
*/
template<>
class Point3D<float> : public BasicVector3D<float> {
public:
/**
* Default constructor. */
Point3D() = default;
/**
* Constructor from three numbers. */
Point3D(float x1, float y1, float z1) : BasicVector3D<float>(x1,y1,z1) {}
/**
* Constructor from array of floats. */
explicit Point3D(const float * a)
: BasicVector3D<float>(a[0],a[1],a[2]) {}
/**
* Copy constructor. */
Point3D(const Point3D<float> &) = default;
/**
* Move constructor. */
Point3D(Point3D<float> &&) = default;
/**
* Constructor from BasicVector3D<float>. */
Point3D(const BasicVector3D<float> & v) : BasicVector3D<float>(v) {}
/**
* Destructor. */
~Point3D() = default;
/**
* Assignment. */
Point3D<float> & operator=(const Point3D<float> &) = default;
/**
* Assignment from BasicVector3D<float>. */
Point3D<float> & operator=(const BasicVector3D<float> & v) {
this->BasicVector3D<float>::operator=(v);
return *this;
}
/**
* Move assignment. */
Point3D<float> & operator=(Point3D<float> &&) = default;
/**
* Returns distance to the origin squared. */
float distance2() const { return mag2(); }
/**
* Returns distance to the point squared. */
float distance2(const Point3D<float> & p) const {
float dx = p.x()-x(), dy = p.y()-y(), dz = p.z()-z();
return dx*dx + dy*dy + dz*dz;
}
/**
* Returns distance to the origin. */
float distance() const { return std::sqrt(distance2()); }
/**
* Returns distance to the point. */
float distance(const Point3D<float> & p) const {
return std::sqrt(distance2(p));
}
/**
* Transformation by Transform3D. */
Point3D<float> & transform(const Transform3D & m);
};
/**
* Transformation of Point3D<float> by Transform3D.
* @relates Point3D
*/
Point3D<float>
operator*(const Transform3D & m, const Point3D<float> & p);
/**
* Geometrical 3D Point with components of double type.
*
* @author Evgeni Chernyaev <Evgueni.Tcherniaev@cern.ch>
* @ingroup geometry
*/
template<>
class Point3D<double> : public BasicVector3D<double> {
public:
/**
* Default constructor. */
Point3D() = default;
/**
* Constructor from three numbers. */
Point3D(double x1, double y1, double z1) : BasicVector3D<double>(x1,y1,z1) {}
/**
* Constructor from array of floats. */
explicit Point3D(const float * a)
: BasicVector3D<double>(a[0],a[1],a[2]) {}
/**
* Constructor from array of doubles. */
explicit Point3D(const double * a)
: BasicVector3D<double>(a[0],a[1],a[2]) {}
/**
* Copy constructor. */
Point3D(const Point3D<double> &) = default;
/**
* Move constructor. */
Point3D(Point3D<double> &&) = default;
/**
* Constructor from BasicVector3D<float>. */
Point3D(const BasicVector3D<float> & v) : BasicVector3D<double>(v) {}
/**
* Constructor from BasicVector3D<double>. */
Point3D(const BasicVector3D<double> & v) : BasicVector3D<double>(v) {}
/**
* Destructor. */
~Point3D() = default;
/**
* Constructor from CLHEP::Hep3Vector.
* This constructor is needed only for backward compatibility and
* in principle should be absent.
*/
Point3D(const CLHEP::Hep3Vector & v)
: BasicVector3D<double>(v.x(),v.y(),v.z()) {}
/**
* Conversion (cast) to CLHEP::Hep3Vector.
* This operator is needed only for backward compatibility and
* in principle should not exit.
*/
operator CLHEP::Hep3Vector () const { return CLHEP::Hep3Vector(x(),y(),z()); }
/**
* Assignment. */
Point3D<double> & operator=(const Point3D<double> &) = default;
/**
* Assignment from BasicVector3D<float>. */
Point3D<double> & operator=(const BasicVector3D<float> & v) {
this->BasicVector3D<double>::operator=(v);
return *this;
}
/**
* Assignment from BasicVector3D<double>. */
Point3D<double> & operator=(const BasicVector3D<double> & v) {
this->BasicVector3D<double>::operator=(v);
return *this;
}
/**
* Move assignment. */
Point3D<double> & operator=(Point3D<double> &&) = default;
/**
* Returns distance to the origin squared. */
double distance2() const { return mag2(); }
/**
* Returns distance to the point squared. */
double distance2(const Point3D<double> & p) const {
double dx = p.x()-x(), dy = p.y()-y(), dz = p.z()-z();
return dx*dx + dy*dy + dz*dz;
}
/**
* Returns distance to the origin. */
double distance() const { return std::sqrt(distance2()); }
/**
* Returns distance to the point. */
double distance(const Point3D<double> & p) const {
return std::sqrt(distance2(p));
}
/**
* Transformation by Transform3D. */
Point3D<double> & transform(const Transform3D & m);
};
/**
* Transformation of Point3D<double> by Transform3D.
* @relates Point3D
*/
Point3D<double>
operator*(const Transform3D & m, const Point3D<double> & p);
} /* namespace HepGeom */
#endif /* HEP_POINT3D_H */