1#ifndef GfxTL__L2NORM_HEADER__
2#define GfxTL__L2NORM_HEADER__
32 template <
unsigned int SizeT>
55 template <
class VectorKernelT,
class MaskElemSizeT = FixedMaskElementSize<1>>
61 template <
class ScalarAT,
class ScalarBT>
67 template <
class Po
intAT,
class Po
intBT>
70 Distance(
const PointAT& p,
const PointBT& v)
const
75 DistType d = p[0] - v[0], di;
77 for (
unsigned int i = 1; i < VectorKernelT::m_dim; ++i)
85 template <
class Po
intAT,
class Po
intBT>
86 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
93 DistType d = p[0] - v[0], di;
95 for (
unsigned int i = 1; i < VectorKernelT::m_dim; ++i)
103 template <
class Po
intAT,
class Po
intBT>
104 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
115 DistType d = p[0] - v[0], di;
117 for (
unsigned int i = 1; i < VectorKernelT::m_dim && d < abortDist; ++i)
125 template <
class Po
intAT,
class Po
intBT,
class MaskAT,
class MaskBT>
126 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
128 SqrDistance(
const PointAT& p,
const MaskAT& ma,
const PointBT& v,
const MaskBT& mb)
const
134 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
136 if (!(ma[i] && mb[i]))
140 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
142 dj = p[i * MaskElemSizeT::m_maskElemSize + j] -
143 v[i * MaskElemSizeT::m_maskElemSize + j];
150 template <
class Po
intAT,
class Po
intBT,
class MaskAT,
class MaskBT>
151 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
165 for (
unsigned int i = 0;
166 i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize && d < abortDist;
169 if (!(ma[i] && mb[i]))
173 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize && d < abortDist; ++j)
175 dj = p[i * MaskElemSizeT::m_maskElemSize + j] -
176 v[i * MaskElemSizeT::m_maskElemSize + j];
183 template <
class Po
intAT,
class Po
intBT,
class MaskBT>
184 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
186 SqrDistance(
const PointAT& p,
const PointBT& v,
const MaskBT& mb)
const
192 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
198 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
200 dj = p[i * MaskElemSizeT::m_maskElemSize + j] -
201 v[i * MaskElemSizeT::m_maskElemSize + j];
208 template <
class Po
intAT,
class Po
intBT,
class MaskBT>
209 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
222 for (
unsigned int i = 0;
223 i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize && d < abortDist;
230 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize && d < abortDist; ++j)
232 dj = p[i * MaskElemSizeT::m_maskElemSize + j] -
233 v[i * MaskElemSizeT::m_maskElemSize + j];
240 template <
class Po
intAT,
class Po
intBT,
class MaskAT,
class MaskBT>
241 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
243 Distance(
const PointAT& p,
const PointBT& v,
const MaskAT& ma,
const MaskBT& mb)
const
248 template <
class ScalarT>
252 return std::sqrt(sqrDistance);
255 template <
class DistScalarT,
class DiffScalarT>
259 DiffScalarT cutDiff)
const
261 return boxSqrDist - ((DistScalarT)boxDiff * (DistScalarT)boxDiff) +
262 ((DistScalarT)cutDiff * (DistScalarT)cutDiff);
265 template <
class Po
intAT,
class Po
intBT>
266 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
274 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
281 else if (a[i] >
max[i])
290 template <
class Po
intAT,
class Po
intBT>
291 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
298 DistType sqrDist = 0, t;
299 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
306 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
307 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
312 const PointBT&
max)
const
318 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
324 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
326 if (
min[i * MaskElemSizeT::m_maskElemSize + j] >
327 max[i * MaskElemSizeT::m_maskElemSize + j])
331 if (a[i * MaskElemSizeT::m_maskElemSize + j] <
332 min[i * MaskElemSizeT::m_maskElemSize + j])
334 t =
min[i * MaskElemSizeT::m_maskElemSize + j] -
335 a[i * MaskElemSizeT::m_maskElemSize + j];
338 else if (a[i * MaskElemSizeT::m_maskElemSize + j] >
339 max[i * MaskElemSizeT::m_maskElemSize + j])
341 t = a[i * MaskElemSizeT::m_maskElemSize + j] -
342 max[i * MaskElemSizeT::m_maskElemSize + j];
350 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
351 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType,
356 const PointBT&
max)
const
361 DistType sqrDist = 0, t;
362 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
368 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
370 if (
min[i * MaskElemSizeT::m_maskElemSize + j] >
371 max[i * MaskElemSizeT::m_maskElemSize + j])
378 a[i * MaskElemSizeT::m_maskElemSize + j]),
380 a[i * MaskElemSizeT::m_maskElemSize + j]))) *
387 template <
class Po
intAT,
class Po
intBT,
class W
idthT>
388 typename DistanceType<typename ScalarTypeDeferer<PointAT>::ScalarType, WidthT>::Type
394 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
401 else if (a[i] >
min[i] + width)
403 t = a[i] - (
min[i] + width);
418 template <
class Po
intAT,
class Po
intBT>
422 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
424 (*bboxMin)[i] = vec[i];
428 template <
class Po
intAT,
class Po
intBT>
432 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
434 (*bboxMax)[i] = vec[i];
438 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
443 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
445 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
447 (*bboxMin)[i * MaskElemSizeT::m_maskElemSize + j] =
448 vec[i * MaskElemSizeT::m_maskElemSize + j];
451 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
453 (*bboxMin)[i * MaskElemSizeT::m_maskElemSize + j] =
454 -std::numeric_limits<ScalarType>::infinity();
458 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
463 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
465 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
467 (*bboxMin)[i * MaskElemSizeT::m_maskElemSize + j] =
468 vec[i * MaskElemSizeT::m_maskElemSize + j];
471 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
473 (*bboxMin)[i * MaskElemSizeT::m_maskElemSize + j] =
474 std::numeric_limits<ScalarType>::infinity();
478 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
483 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
485 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
487 (*bboxMax)[i * MaskElemSizeT::m_maskElemSize + j] =
488 vec[i * MaskElemSizeT::m_maskElemSize + j];
491 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
493 (*bboxMax)[i * MaskElemSizeT::m_maskElemSize + j] =
494 std::numeric_limits<ScalarType>::infinity();
498 template <
class Po
intAT,
class MaskAT,
class Po
intBT>
503 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
505 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
507 (*bboxMax)[i * MaskElemSizeT::m_maskElemSize + j] =
508 vec[i * MaskElemSizeT::m_maskElemSize + j];
511 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
513 (*bboxMax)[i * MaskElemSizeT::m_maskElemSize + j] =
514 -std::numeric_limits<ScalarType>::infinity();
518 template <
class BoxPo
intT>
523 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
525 box[0][i] = std::numeric_limits<ScalarType>::min();
526 box[1][i] = std::numeric_limits<ScalarType>::max();
530 template <
class Po
intT,
class BoxPo
intT>
534 for (
unsigned int i = 0; i < VectorKernelT::m_dim; ++i)
536 if (box[0][i] > p[i])
540 else if (box[1][i] < p[i])
547 template <
class Po
intT,
class MaskT,
class BoxPo
intT>
552 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
555 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
557 if (box[0][i * MaskElemSizeT::m_maskElemSize + j] >
558 p[i * MaskElemSizeT::m_maskElemSize + j])
560 box[0][i * MaskElemSizeT::m_maskElemSize + j] =
561 p[i * MaskElemSizeT::m_maskElemSize + j];
563 else if (box[1][i * MaskElemSizeT::m_maskElemSize + j] <
564 p[i * MaskElemSizeT::m_maskElemSize + j])
566 box[1][i * MaskElemSizeT::m_maskElemSize + j] =
567 p[i * MaskElemSizeT::m_maskElemSize + j];
571 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
573 box[0][i * MaskElemSizeT::m_maskElemSize + j] =
574 -std::numeric_limits<ScalarType>::infinity();
575 box[1][i * MaskElemSizeT::m_maskElemSize + j] =
576 std::numeric_limits<ScalarType>::infinity();
581 template <
class Po
intT,
class MaskT,
class BoxPo
intT>
587 for (
unsigned int i = 0; i < VectorKernelT::m_dim / MaskElemSizeT::m_maskElemSize; ++i)
589 for (
unsigned int j = 0; j < MaskElemSizeT::m_maskElemSize; ++j)
591 if (box[0][i * MaskElemSizeT::m_maskElemSize + j] >
592 p[i * MaskElemSizeT::m_maskElemSize + j])
594 box[0][i * MaskElemSizeT::m_maskElemSize + j] =
595 p[i * MaskElemSizeT::m_maskElemSize + j];
597 else if (box[1][i * MaskElemSizeT::m_maskElemSize + j] <
598 p[i * MaskElemSizeT::m_maskElemSize + j])
600 box[1][i * MaskElemSizeT::m_maskElemSize + j] =
601 p[i * MaskElemSizeT::m_maskElemSize + j];
607 template <
class VectorKernelT>
612 template <
class MaskElemSizeT>
615 template <
class VectorKernelT>
static ScalarT Abs(ScalarT s)
MatrixXX< C, R, T > min(const MatrixXX< C, R, T > &a, const MatrixXX< C, R, T > &b)
MatrixXX< C, R, T > max(const MatrixXX< C, R, T > &a, const MatrixXX< C, R, T > &b)
void MaskElementSize(unsigned int s)
unsigned int m_maskElemSize
const unsigned int MaskElementSize() const
void MaskElementSize(unsigned int s)
const unsigned int MaskElementSize() const
ScalarTypeConversion< ScalarAT, ScalarBT >::DifferenceType Type
void AssignAsAABoxMinMaskIgnore(const PointAT &vec, const MaskAT &mask, PointBT *bboxMin) const
DistScalarT IncrementalBoxSqrDistance(DistScalarT boxSqrDist, DiffScalarT boxDiff, DiffScalarT cutDiff) const
void IncludeInAABoxMaskInfinity(const PointT &p, const MaskT &mask, BoxPointT box[2]) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type SqrDistance(const PointAT &p, const PointBT &v, const MaskBT &mb) const
void InitMaximalAABox(BoxPointT box[2]) const
void AssignAsAABoxMaxMaskIgnore(const PointAT &vec, const MaskAT &mask, PointBT *bboxMax) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type Distance(const PointAT &p, const PointBT &v, const MaskAT &ma, const MaskBT &mb) const
void AssignAsAABoxMin(const PointAT &vec, PointBT *bboxMin) const
void IncludeInAABox(const PointT &p, BoxPointT box[2]) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type BoxSqrDistance(const PointAT &a, const MaskAT &mask, const PointBT &min, const PointBT &max) const
void AssignAsAABoxMaxMaskInfinity(const PointAT &vec, const MaskAT &mask, PointBT *bboxMax) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type Distance(const PointAT &p, const PointBT &v) const
void AssignAsAABoxMax(const PointAT &vec, PointBT *bboxMax) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type SqrDistance(const PointAT &p, const PointBT &v, const MaskBT &mb, typename DistanceType< typename ScalarTypeDeferer< PointAT >::ScalarType, typename ScalarTypeDeferer< PointBT >::ScalarType >::Type abortDist) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type SqrDistance(const PointAT &p, const MaskAT &ma, const PointBT &v, const MaskBT &mb) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type MaxBoxSqrDistance(const PointAT &a, const MaskAT &mask, const PointBT &min, const PointBT &max) const
void AssignAsAABoxMinMaskInfinity(const PointAT &vec, const MaskAT &mask, PointBT *bboxMin) const
ScalarT RootOfDistance(ScalarT sqrDistance) const
VectorKernelT VectorKernelType
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type SqrDistance(const PointAT &p, const MaskAT &ma, const PointBT &v, const MaskBT &mb, typename DistanceType< typename ScalarTypeDeferer< PointAT >::ScalarType, typename ScalarTypeDeferer< PointBT >::ScalarType >::Type abortDist) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type SqrDistance(const PointAT &p, const PointBT &v) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type MaxBoxSqrDistance(const PointAT &a, const PointBT &min, const PointBT &max) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type BoxSqrDistance(const PointAT &a, const PointBT &min, const PointBT &max) const
MaskElemSizeT MaskElementSizeType
void IncludeInAABoxMaskIgnore(const PointT &p, const MaskT &mask, BoxPointT box[2]) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, WidthT >::Type AACubeSqrDistance(const PointAT &a, const PointBT &min, WidthT width) const
DistanceType< typenameScalarTypeDeferer< PointAT >::ScalarType, typenameScalarTypeDeferer< PointBT >::ScalarType >::Type SqrDistance(const PointAT &p, const PointBT &v, typename DistanceType< typename ScalarTypeDeferer< PointAT >::ScalarType, typename ScalarTypeDeferer< PointBT >::ScalarType >::Type abortDist) const
PointT::value_type ScalarType