12#ifndef EIGEN_HYPERPLANE_H
13#define EIGEN_HYPERPLANE_H
16#include "./InternalHeaderCheck.h"
37template <
typename Scalar_,
int AmbientDim_,
int Options_>
40 EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,
41 AmbientDim_ == Dynamic ? Dynamic : AmbientDim_ + 1)
42 enum { AmbientDimAtCompileTime = AmbientDim_, Options = Options_ };
43 using Scalar = Scalar_;
44 using RealScalar =
typename NumTraits<Scalar>::Real;
48 Matrix<Scalar,
Index(AmbientDimAtCompileTime) == Dynamic ? Dynamic :
Index(AmbientDimAtCompileTime) + 1, 1,
56 template <
int OtherOptions>
58 : m_coeffs(other.
coeffs()) {}
67 EIGEN_DEVICE_FUNC
inline Hyperplane(
const VectorType& n,
const VectorType& e) : m_coeffs(n.size() + 1) {
76 EIGEN_DEVICE_FUNC
inline Hyperplane(
const VectorType& n,
const Scalar& d) : m_coeffs(n.size() + 1) {
84 EIGEN_DEVICE_FUNC
static inline Hyperplane Through(
const VectorType& p0,
const VectorType& p1) {
86 result.
normal() = (p1 - p0).unitOrthogonal();
94 EIGEN_DEVICE_FUNC
static inline Hyperplane Through(
const VectorType& p0,
const VectorType& p1,
const VectorType& p2) {
95 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 3)
97 VectorType v0(p2 - p0), v1(p1 - p0);
98 result.
normal() = v0.cross(v1);
99 RealScalar norm = result.
normal().norm();
100 if (norm <= v0.norm() * v1.norm() * NumTraits<RealScalar>::epsilon()) {
102 m << v0.transpose(), v1.transpose();
117 normal() = parametrized.direction().unitOrthogonal();
123 return AmbientDimAtCompileTime == Dynamic ? m_coeffs.size() - 1 :
Index(AmbientDimAtCompileTime);
146 EIGEN_DEVICE_FUNC
inline ConstNormalReturnType
normal()
const {
147 return ConstNormalReturnType(m_coeffs, 0, 0,
dim(), 1);
153 EIGEN_DEVICE_FUNC
inline NormalReturnType
normal() {
return NormalReturnType(m_coeffs, 0, 0,
dim(), 1); }
158 EIGEN_DEVICE_FUNC
inline const Scalar&
offset()
const {
return m_coeffs.coeff(
dim()); }
162 EIGEN_DEVICE_FUNC
inline Scalar&
offset() {
return m_coeffs(
dim()); }
167 EIGEN_DEVICE_FUNC
inline const Coefficients&
coeffs()
const {
return m_coeffs; }
172 EIGEN_DEVICE_FUNC
inline Coefficients&
coeffs() {
return m_coeffs; }
181 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)
185 if (internal::isMuchSmallerThan(det, Scalar(1))) {
187 if (numext::abs(
coeffs().coeff(1)) > numext::abs(
coeffs().coeff(0)))
192 Scalar invdet = Scalar(1) / det;
205 template <
typename XprType>
209 m_coeffs /=
normal().norm();
213 eigen_assert(0 &&
"invalid traits value in Hyperplane::transform()");
225 template <
int TrOptions>
238 template <
typename NewScalarType>
239 EIGEN_DEVICE_FUNC
inline
240 typename internal::cast_return_type<
Hyperplane,
244 typename internal::cast_return_type<
Hyperplane,
249 template <
typename OtherScalarType,
int OtherOptions>
263 template <
int OtherOptions>
266 const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision())
const {
267 return m_coeffs.isApprox(other.m_coeffs, prec);
292 template <
int OtherOptions>
295 const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision())
const {
296 const RealScalar this_norm =
normal().norm();
297 const RealScalar other_norm = other.
normal().norm();
298 eigen_assert(this_norm > RealScalar(0) && other_norm > RealScalar(0));
304 const RealScalar inner_norm = numext::abs(inner);
305 const Scalar phase = inner_norm > RealScalar(0) ? inner / Scalar(inner_norm) : Scalar(1);
306 if (!((other.
normal() / Scalar(other_norm) - phase * (
normal() / Scalar(this_norm))).norm() <= prec))
return false;
307 return internal::isApprox(other.
offset() / Scalar(other_norm), numext::conj(phase) * (
offset() / Scalar(this_norm)),
312 Coefficients m_coeffs;
Expression of a fixed-size or dynamic-size block.
Definition Block.h:111
A hyperplane.
Definition Hyperplane.h:38
static Hyperplane Through(const VectorType &p0, const VectorType &p1)
Definition Hyperplane.h:84
Hyperplane & transform(const MatrixBase< XprType > &mat, TransformTraits traits=Affine)
Definition Hyperplane.h:206
VectorType intersection(const Hyperplane &other) const
Definition Hyperplane.h:180
ConstNormalReturnType normal() const
Definition Hyperplane.h:146
Scalar signedDistance(const VectorType &p) const
Definition Hyperplane.h:132
Hyperplane(const VectorType &n, const VectorType &e)
Definition Hyperplane.h:67
NormalReturnType normal()
Definition Hyperplane.h:153
Eigen::Index Index
Definition Hyperplane.h:45
Hyperplane()
Definition Hyperplane.h:54
const Coefficients & coeffs() const
Definition Hyperplane.h:167
Coefficients & coeffs()
Definition Hyperplane.h:172
internal::cast_return_type< Hyperplane, Hyperplane< NewScalarType, AmbientDimAtCompileTime, Options > >::type cast() const
Definition Hyperplane.h:242
Index dim() const
Definition Hyperplane.h:122
Scalar absDistance(const VectorType &p) const
Definition Hyperplane.h:137
static Hyperplane Through(const VectorType &p0, const VectorType &p1, const VectorType &p2)
Definition Hyperplane.h:94
const Scalar & offset() const
Definition Hyperplane.h:158
Hyperplane(const VectorType &n, const Scalar &d)
Definition Hyperplane.h:76
bool isApprox(const Hyperplane< Scalar, AmbientDimAtCompileTime, OtherOptions > &other, const typename NumTraits< Scalar >::Real &prec=NumTraits< Scalar >::dummy_precision()) const
Definition Hyperplane.h:264
Hyperplane(const Hyperplane< OtherScalarType, AmbientDimAtCompileTime, OtherOptions > &other)
Definition Hyperplane.h:250
bool isCoincident(const Hyperplane< Scalar, AmbientDimAtCompileTime, OtherOptions > &other, const typename NumTraits< Scalar >::Real &prec=NumTraits< Scalar >::dummy_precision()) const
Definition Hyperplane.h:293
void normalize(void)
Definition Hyperplane.h:127
Scalar & offset()
Definition Hyperplane.h:162
Hyperplane(Index _dim)
Definition Hyperplane.h:62
Hyperplane(const ParametrizedLine< Scalar, AmbientDimAtCompileTime > ¶metrized)
Definition Hyperplane.h:116
VectorType projection(const VectorType &p) const
Definition Hyperplane.h:141
Hyperplane & transform(const Transform< Scalar, AmbientDimAtCompileTime, Affine, TrOptions > &t, TransformTraits traits=Affine)
Definition Hyperplane.h:226
Two-sided Jacobi SVD decomposition of a rectangular matrix.
Definition JacobiSVD.h:613
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:53
Inverse< Derived > inverse() const
Definition InverseImpl.h:280
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:188
A parametrized line.
Definition ParametrizedLine.h:36
constexpr const Scalar & coeff(Index rowId, Index colId) const
Definition PlainObjectBase.h:187
const MatrixVType & matrixV() const
Definition SVDBase.h:192
TransformTraits
Definition Constants.h:470
@ ComputeFullV
Definition Constants.h:398
@ Affine
Definition Constants.h:475
@ Isometry
Definition Constants.h:472