#include "Math/GenVector/Plane3D.h"
#include <cmath>
namespace ROOT {
namespace Math {
typedef Plane3D::Scalar Scalar;
typedef Plane3D::Point XYZPoint;
typedef Plane3D::Vector XYZVector;
Plane3D::Plane3D(const Scalar & a, const Scalar & b, const Scalar & c, const Scalar & d) :
fA(a), fB(b), fC(c), fD(d) {
Normalize();
}
Plane3D::Plane3D(const XYZVector & n, const XYZPoint & p ) :
fA( n.X() ),
fB( n.Y() ),
fC( n.Z() )
{
fD = - n.Dot(p);
Normalize();
}
Plane3D::Plane3D( const XYZPoint & p1, const XYZPoint & p2, const XYZPoint & p3 ) {
XYZVector n = (p2-p1).Cross(p3-p1);
fA = n.X();
fB = n.Y();
fC = n.Z();
fD = - n.Dot(p1);
Normalize();
}
Scalar Plane3D::Distance(const XYZPoint & p) const {
return fA*p.X() + fB*p.Y() + fC*p.Z() + fD;
}
void Plane3D::Normalize() {
Scalar s = std::sqrt( fA*fA + fB*fB + fC*fC );
if ( s == 0) { fD = 0; return; }
Scalar w = 1./s;
fA *= w;
fB *= w;
fC *= w;
fD *= w;
}
XYZPoint Plane3D::ProjectOntoPlane(const XYZPoint & p) const {
Scalar d = Distance(p);
return XYZPoint( p.X() - fA*d, p.Y() - fB*d, p.Z() - fC*d);
}
std::ostream & operator<< (std::ostream & os, const Plane3D & p) {
os << "\n" << p.Normal().X()
<< " " << p.Normal().Y()
<< " " << p.Normal().Z()
<< " " << p.HesseDistance()
<< "\n";
return os;
}
}
}
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.