8#ifndef model_Plane_CPP_
9#define model_Plane_CPP_
25 if(n.norm()<FLT_EPSILON)
27 std::cout<<
"Plane: n="<<n.transpose()<<std::endl;
28 throw std::runtime_error(
"Plane must have non-zero normal");
72 if(fabs(pointLocal(dim-1))>FLT_EPSILON)
74 std::cout<<
"point="<<point.transpose()<<std::endl;
75 std::cout<<
"P="<<
P.transpose()<<std::endl;
76 std::cout<<
"L2G=\n"<<
L2G<<std::endl;
77 std::cout<<
"pointLocal="<<pointLocal.transpose()<<std::endl;
78 throw std::runtime_error(
"Local point has non-zero z-coordinate");
80 return pointLocal.template segment<dim-1>(0);
86 return L2G.template block<dim,dim-1>(0,0)*point+
P;
93 if(fabs(dirLocal(dim-1))>FLT_EPSILON)
95 std::cout<<
"dir="<<dir.transpose()<<std::endl;
96 std::cout<<
"L2G=\n"<<
L2G<<std::endl;
97 std::cout<<
"dirLocal="<<dirLocal.transpose()<<std::endl;
98 throw std::runtime_error(
"Local point has non-zero z-coordinate");
100 return dirLocal.template segment<dim-1>(0);
106 return L2G.template block<dim,dim-1>(0,0)*dir;
117 return MatrixDim::Identity();
122 const double yNorm(
y.norm());
123 if(yNorm<FLT_EPSILON)
125 throw std::runtime_error(
"LocalToGlobal<2>::getL2G input vector has zero norm.");
138 const double zNorm(
z.norm());
139 if(zNorm<FLT_EPSILON)
141 throw std::runtime_error(
"LocalToGlobal<3>::getL2G input vector has zero norm.");
143 assert(zNorm>FLT_EPSILON);
147 double xNorm(
x.norm());
148 if(xNorm>FLT_EPSILON)
154 x=VectorDim::UnitY().cross(
z);
156 if(xNorm>FLT_EPSILON)
162 x=VectorDim::UnitZ().cross(
z);
164 if(xNorm>FLT_EPSILON)
170 throw std::runtime_error(
"CANNOT FIND VECTOR ORTHOGONAL TO z");
175 assert(std::fabs(
x.norm()-1.0)<FLT_EPSILON);
176 assert(std::fabs(
z.norm()-1.0)<FLT_EPSILON);
177 assert(fabs(
x.dot(
z)<FLT_EPSILON));
Eigen::Matrix< double, 3, 1 > VectorDim
Eigen::Matrix< double, dim, 1 > VectorDim
Eigen::Matrix< double, dim, 1 > VectorDim
Eigen::Matrix< double, dim, dim > MatrixDim
Eigen::Matrix< double, dim, 1 > VectorDim
Eigen::Matrix< double, dim, dim > MatrixDim
bool isBelow(const VectorDim &P0) const
bool contains(const VectorDim &P0) const
Plane(const VectorDim &p, const VectorDim &n)
bool isAbove(const VectorDim &P0) const
VectorDim snapToPlane(const VectorDim &P0) const
Eigen::Matrix< double, dim-1, 1 > VectorLowerDim
double signedDistanceTo(const VectorDim &P0) const
Eigen::Matrix< double, dim, 1 > VectorDim
Eigen::Matrix< double, dim, dim > MatrixDim
double distanceTo(const VectorDim &P0) const
VectorLowerDim localDirection(const VectorDim &dir) const
VectorLowerDim localPosition(const VectorDim &point) const
VectorDim globalPosition(const VectorLowerDim &point) const
VectorDim globalDirection(const VectorLowerDim &dir) const
const VectorDim unitNormal
static MatrixDim getL2G(const VectorDim &z)