31#if defined(CellGeometry_RECURSES)
32#error Recursive header files inclusion detected in CellGeometry.h
35#define CellGeometry_RECURSES
37#if !defined CellGeometry_h
47#include <unordered_set>
48#include "DGtal/base/Common.h"
49#include "DGtal/kernel/UnorderedSetByBlock.h"
50#include "DGtal/kernel/PointHashFunctions.h"
51#include "DGtal/topology/CCellularGridSpaceND.h"
52#include "DGtal/topology/KhalimskySpaceND.h"
53#include "DGtal/topology/KhalimskyCellHashFunctions.h"
54#include "DGtal/geometry/volumes/BoundedLatticePolytope.h"
55#include "DGtal/geometry/volumes/BoundedRationalPolytope.h"
73 template <
typename TKSpace >
134 bool verbose =
false );
153 bool verbose =
false );
188 template <
typename Po
intIterator>
193 template <
typename Po
intelIterator>
402 template <
typename RandomIterator>
404 bool includes( RandomIterator it2, RandomIterator itE2,
405 RandomIterator it1, RandomIterator itE1 );
418 template <
typename TKSpace>
432 template <
typename TKSpace,
int i,
int N>
447 template <
typename Po
intelIterator>
449 std::unordered_set<typename KSpace::Cell>
451 PointelIterator itB, PointelIterator itE )
453 std::unordered_set<typename KSpace::Cell> cells;
455 for (
auto it = itB; it != itE; ++it )
458 for (
auto it = itB; it != itE; ++it )
461 auto cofaces =
K.uCoFaces( pointel );
462 for (
auto&& f : cofaces )
463 if (
K.uDim( f ) == i ) cells.insert( f );
474 template <
typename Po
intIterator>
476 std::unordered_set<typename KSpace::Cell>
478 PointIterator itB, PointIterator itE )
480 std::unordered_set<typename KSpace::Cell> cells;
482 for (
auto it = itB; it != itE; ++it )
483 cells.insert(
K.uPointel( *it ) );
485 for (
auto it = itB; it != itE; ++it )
487 auto pointel =
K.uPointel( *it );
488 auto cofaces =
K.uCoFaces( pointel );
489 for (
auto&& f : cofaces )
490 if (
K.uDim( f ) == i ) cells.insert( f );
501 template <
typename Po
intIterator>
506 PointIterator itB, PointIterator itE )
511 for (
auto it = itB; it != itE; ++it )
512 kpoints.insert(
K.uKCoords(
K.uPointel( *it ) ) );
514 for (
auto it = itB; it != itE; ++it )
516 auto pointel =
K.uPointel( *it );
517 auto cofaces =
K.uCoFaces( pointel );
518 for (
auto&& f : cofaces )
519 if (
K.uDim( f ) == i ) kpoints.insert(
K.uKCoords( f ) );
529 template <
typename TKSpace>
543 template <
typename Po
intelIterator>
545 std::unordered_set<typename KSpace::Cell>
547 PointelIterator itB, PointelIterator itE )
549 std::unordered_set<typename KSpace::Cell> cells;
550 for (
auto it = itB; it != itE; ++it )
553 cells.insert(
K.uIncident( pointel, 0,
true ) );
554 cells.insert(
K.uIncident( pointel, 0,
false ) );
555 cells.insert(
K.uIncident( pointel, 1,
true ) );
556 cells.insert(
K.uIncident( pointel, 1,
false ) );
566 template <
typename Po
intIterator>
568 std::unordered_set<typename KSpace::Cell>
570 PointIterator itB, PointIterator itE )
572 std::unordered_set<typename KSpace::Cell> cells;
573 for (
auto it = itB; it != itE; ++it )
575 auto pointel =
K.uPointel( *it );
576 cells.insert(
K.uIncident( pointel, 0,
true ) );
577 cells.insert(
K.uIncident( pointel, 0,
false ) );
578 cells.insert(
K.uIncident( pointel, 1,
true ) );
579 cells.insert(
K.uIncident( pointel, 1,
false ) );
589 template <
typename Po
intIterator>
594 PointIterator itB, PointIterator itE )
598 for (
auto it = itB; it != itE; ++it )
600 auto kp =
K.uKCoords(
K.uPointel( *it ) );
601 kpoints.emplace( kp[ 0 ] , kp[ 1 ] - 1 );
602 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] );
603 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] );
604 kpoints.emplace( kp[ 0 ] , kp[ 1 ] + 1 );
613 template <
typename TKSpace>
627 template <
typename Po
intelIterator>
629 std::unordered_set<typename KSpace::Cell>
631 PointelIterator itB, PointelIterator itE )
633 std::unordered_set<typename KSpace::Cell> cells;
634 for (
auto it = itB; it != itE; ++it )
637 cells.insert(
K.uIncident( pointel, 0,
true ) );
638 cells.insert(
K.uIncident( pointel, 0,
false ) );
639 cells.insert(
K.uIncident( pointel, 1,
true ) );
640 cells.insert(
K.uIncident( pointel, 1,
false ) );
641 cells.insert(
K.uIncident( pointel, 2,
true ) );
642 cells.insert(
K.uIncident( pointel, 2,
false ) );
653 template <
typename Po
intIterator>
655 std::unordered_set<typename KSpace::Cell>
657 PointIterator itB, PointIterator itE )
659 std::cout <<
"<1,3> specialization" << std::endl;
660 std::unordered_set<typename KSpace::Cell> cells;
661 for (
auto it = itB; it != itE; ++it )
663 auto pointel =
K.uPointel( *it );
664 cells.insert(
K.uIncident( pointel, 0,
true ) );
665 cells.insert(
K.uIncident( pointel, 0,
false ) );
666 cells.insert(
K.uIncident( pointel, 1,
true ) );
667 cells.insert(
K.uIncident( pointel, 1,
false ) );
668 cells.insert(
K.uIncident( pointel, 2,
true ) );
669 cells.insert(
K.uIncident( pointel, 2,
false ) );
679 template <
typename Po
intIterator>
684 PointIterator itB, PointIterator itE )
688 for (
auto it = itB; it != itE; ++it )
690 auto kp =
K.uKCoords(
K.uPointel( *it ) );
691 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] , kp[ 2 ] );
692 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] , kp[ 2 ] );
693 kpoints.emplace( kp[ 0 ] , kp[ 1 ] - 1, kp[ 2 ] );
694 kpoints.emplace( kp[ 0 ] , kp[ 1 ] + 1, kp[ 2 ] );
695 kpoints.emplace( kp[ 0 ] , kp[ 1 ] , kp[ 2 ] - 1 );
696 kpoints.emplace( kp[ 0 ] , kp[ 1 ] , kp[ 2 ] + 1 );
705 template <
typename TKSpace>
719 template <
typename Po
intelIterator>
721 std::unordered_set<typename KSpace::Cell>
723 PointelIterator itB, PointelIterator itE )
725 std::unordered_set<typename KSpace::Cell> cells;
726 for (
auto it = itB; it != itE; ++it )
729 auto linelxp =
K.uIncident( pointel, 0,
true );
730 auto linelxm =
K.uIncident( pointel, 0,
false );
731 cells.insert(
K.uIncident( linelxp, 1,
true ) );
732 cells.insert(
K.uIncident( linelxp, 1,
false ) );
733 cells.insert(
K.uIncident( linelxm, 1,
true ) );
734 cells.insert(
K.uIncident( linelxm, 1,
false ) );
745 template <
typename Po
intIterator>
747 std::unordered_set<typename KSpace::Cell>
749 PointIterator itB, PointIterator itE )
751 std::cout <<
"<2,2> specialization" << std::endl;
752 std::unordered_set<typename KSpace::Cell> cells;
753 for (
auto it = itB; it != itE; ++it )
755 auto pointel =
K.uPointel( *it );
756 auto linelxp =
K.uIncident( pointel, 0,
true );
757 auto linelxm =
K.uIncident( pointel, 0,
false );
758 cells.insert(
K.uIncident( linelxp, 1,
true ) );
759 cells.insert(
K.uIncident( linelxp, 1,
false ) );
760 cells.insert(
K.uIncident( linelxm, 1,
true ) );
761 cells.insert(
K.uIncident( linelxm, 1,
false ) );
771 template <
typename Po
intIterator>
776 PointIterator itB, PointIterator itE )
780 for (
auto it = itB; it != itE; ++it )
782 auto kp =
K.uKCoords(
K.uPointel( *it ) );
783 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] - 1 );
784 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] - 1 );
785 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] + 1 );
786 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] + 1 );
795 template <
typename TKSpace>
809 template <
typename Po
intelIterator>
811 std::unordered_set<typename KSpace::Cell>
813 PointelIterator itB, PointelIterator itE )
815 std::unordered_set<typename KSpace::Cell> cells;
816 for (
auto it = itB; it != itE; ++it )
819 auto linelxp =
K.uIncident( pointel, 0,
true );
820 auto linelxm =
K.uIncident( pointel, 0,
false );
821 auto linelyp =
K.uIncident( pointel, 1,
true );
822 auto linelym =
K.uIncident( pointel, 1,
false );
823 cells.insert(
K.uIncident( linelxp, 1,
true ) );
824 cells.insert(
K.uIncident( linelxp, 1,
false ) );
825 cells.insert(
K.uIncident( linelxp, 2,
true ) );
826 cells.insert(
K.uIncident( linelxp, 2,
false ) );
827 cells.insert(
K.uIncident( linelxm, 1,
true ) );
828 cells.insert(
K.uIncident( linelxm, 1,
false ) );
829 cells.insert(
K.uIncident( linelxm, 2,
true ) );
830 cells.insert(
K.uIncident( linelxm, 2,
false ) );
831 cells.insert(
K.uIncident( linelyp, 2,
true ) );
832 cells.insert(
K.uIncident( linelyp, 2,
false ) );
833 cells.insert(
K.uIncident( linelym, 2,
true ) );
834 cells.insert(
K.uIncident( linelym, 2,
false ) );
845 template <
typename Po
intIterator>
847 std::unordered_set<typename KSpace::Cell>
849 PointIterator itB, PointIterator itE )
851 std::cout <<
"<2,3> specialization" << std::endl;
852 std::unordered_set<typename KSpace::Cell> cells;
853 for (
auto it = itB; it != itE; ++it )
855 auto pointel =
K.uPointel( *it );
856 auto linelxp =
K.uIncident( pointel, 0,
true );
857 auto linelxm =
K.uIncident( pointel, 0,
false );
858 auto linelyp =
K.uIncident( pointel, 1,
true );
859 auto linelym =
K.uIncident( pointel, 1,
false );
860 cells.insert(
K.uIncident( linelxp, 1,
true ) );
861 cells.insert(
K.uIncident( linelxp, 1,
false ) );
862 cells.insert(
K.uIncident( linelxp, 2,
true ) );
863 cells.insert(
K.uIncident( linelxp, 2,
false ) );
864 cells.insert(
K.uIncident( linelxm, 1,
true ) );
865 cells.insert(
K.uIncident( linelxm, 1,
false ) );
866 cells.insert(
K.uIncident( linelxm, 2,
true ) );
867 cells.insert(
K.uIncident( linelxm, 2,
false ) );
868 cells.insert(
K.uIncident( linelyp, 2,
true ) );
869 cells.insert(
K.uIncident( linelyp, 2,
false ) );
870 cells.insert(
K.uIncident( linelym, 2,
true ) );
871 cells.insert(
K.uIncident( linelym, 2,
false ) );
881 template <
typename Po
intIterator>
886 PointIterator itB, PointIterator itE )
890 for (
auto it = itB; it != itE; ++it )
892 auto kp =
K.uKCoords(
K.uPointel( *it ) );
893 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] - 1, kp[ 2 ] );
894 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] - 1, kp[ 2 ] );
895 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] + 1, kp[ 2 ] );
896 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] + 1, kp[ 2 ] );
897 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] , kp[ 2 ] - 1 );
898 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] , kp[ 2 ] - 1 );
899 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] , kp[ 2 ] + 1 );
900 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] , kp[ 2 ] + 1 );
901 kpoints.emplace( kp[ 0 ] , kp[ 1 ] - 1, kp[ 2 ] - 1 );
902 kpoints.emplace( kp[ 0 ] , kp[ 1 ] + 1, kp[ 2 ] - 1 );
903 kpoints.emplace( kp[ 0 ] , kp[ 1 ] - 1, kp[ 2 ] + 1 );
904 kpoints.emplace( kp[ 0 ] , kp[ 1 ] + 1, kp[ 2 ] + 1 );
913 template <
typename TKSpace>
927 template <
typename Po
intelIterator>
929 std::unordered_set<typename KSpace::Cell>
931 PointelIterator itB, PointelIterator itE )
933 std::unordered_set<typename KSpace::Cell> cells;
934 for (
auto it = itB; it != itE; ++it )
937 auto linelxp =
K.uIncident( pointel, 0,
true );
938 auto linelxm =
K.uIncident( pointel, 0,
false );
939 auto surfxpyp =
K.uIncident( linelxp, 1,
true );
940 auto surfxpym =
K.uIncident( linelxp, 1,
false );
941 auto surfxmyp =
K.uIncident( linelxm, 1,
true );
942 auto surfxmym =
K.uIncident( linelxm, 1,
false );
943 cells.insert(
K.uIncident( surfxpyp, 2,
true ) );
944 cells.insert(
K.uIncident( surfxpyp, 2,
false ) );
945 cells.insert(
K.uIncident( surfxpym, 2,
true ) );
946 cells.insert(
K.uIncident( surfxpym, 2,
false ) );
947 cells.insert(
K.uIncident( surfxmyp, 2,
true ) );
948 cells.insert(
K.uIncident( surfxmyp, 2,
false ) );
949 cells.insert(
K.uIncident( surfxmym, 2,
true ) );
950 cells.insert(
K.uIncident( surfxmym, 2,
false ) );
961 template <
typename Po
intIterator>
963 std::unordered_set<typename KSpace::Cell>
965 PointIterator itB, PointIterator itE )
967 std::unordered_set<typename KSpace::Cell> cells;
968 for (
auto it = itB; it != itE; ++it )
970 auto pointel =
K.uPointel( *it );
971 auto linelxp =
K.uIncident( pointel, 0,
true );
972 auto linelxm =
K.uIncident( pointel, 0,
false );
973 auto surfxpyp =
K.uIncident( linelxp, 1,
true );
974 auto surfxpym =
K.uIncident( linelxp, 1,
false );
975 auto surfxmyp =
K.uIncident( linelxm, 1,
true );
976 auto surfxmym =
K.uIncident( linelxm, 1,
false );
977 cells.insert(
K.uIncident( surfxpyp, 2,
true ) );
978 cells.insert(
K.uIncident( surfxpyp, 2,
false ) );
979 cells.insert(
K.uIncident( surfxpym, 2,
true ) );
980 cells.insert(
K.uIncident( surfxpym, 2,
false ) );
981 cells.insert(
K.uIncident( surfxmyp, 2,
true ) );
982 cells.insert(
K.uIncident( surfxmyp, 2,
false ) );
983 cells.insert(
K.uIncident( surfxmym, 2,
true ) );
984 cells.insert(
K.uIncident( surfxmym, 2,
false ) );
994 template <
typename Po
intIterator>
999 PointIterator itB, PointIterator itE )
1003 for (
auto it = itB; it != itE; ++it )
1005 auto kp =
K.uKCoords(
K.uPointel( *it ) );
1006 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] - 1, kp[ 2 ] - 1 );
1007 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] - 1, kp[ 2 ] - 1 );
1008 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] + 1, kp[ 2 ] - 1 );
1009 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] + 1, kp[ 2 ] - 1 );
1010 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] - 1, kp[ 2 ] + 1 );
1011 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] - 1, kp[ 2 ] + 1 );
1012 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] + 1, kp[ 2 ] + 1 );
1013 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] + 1, kp[ 2 ] + 1 );
1026#include "CellGeometry.ih"
1033#undef CellGeometry_RECURSES
Aim: Represents an nD lattice polytope, i.e. a convex polyhedron bounded with vertices with integer c...
Aim: Represents an nD rational polytope, i.e. a convex polyhedron bounded by vertices with rational c...
Aim: Computes and stores sets of cells and provides methods to compute intersections of lattice and r...
static const Dimension dimension
Self & operator=(const Self &other)=default
UnorderedSetByBlock< Point, Splitter< Point, uint64_t > > myKPoints
The unordered set that stores cells.
CellGeometry & operator+=(const CellGeometry &other)
static bool includes(RandomIterator it2, RandomIterator itE2, RandomIterator it1, RandomIterator itE1)
bool subset(const CellGeometry &other) const
static Dimension dim(const Point &kp)
void addCellsTouchingPolytopePoints(const RationalPolytope &polytope)
Dimension maxCellDim() const
std::vector< Cell > getTouchedCells(const std::vector< Point > &points, const Dimension i) const
Dimension myMinCellDim
The minimum cell dimension.
CellGeometry(const KSpace &K, Dimension min_cell_dim=0, Dimension max_cell_dim=KSpace::dimension, bool verbose=false)
std::vector< Point > getKPoints(const Dimension k) const
void addCellsTouchingPointels(PointelIterator itB, PointelIterator itE)
CellGeometry(Self &&other)=default
void init(const KSpace &K, Dimension min_cell_dim=0, Dimension max_cell_dim=KSpace::dimension, bool verbose=false)
std::vector< Point > getTouchedKPoints(const std::vector< Point > &points, const Dimension i) const
void addCellsTouchingPoints(PointIterator itB, PointIterator itE)
CellGeometry(const Self &other)=default
std::vector< Cell > getIntersectedCells(const LatticePolytope &polytope, const Dimension i) const
bool subset(const CellGeometry &other, const Dimension k) const
std::string className() const
Dimension minCellDim() const
DGtal::BigInteger BigInteger
DGtal::BoundedLatticePolytope< Space > Polytope
DGtal::BoundedLatticePolytope< Space > LatticePolytope
void addCellsTouchingPoint(const Point &p)
std::vector< Cell > getIntersectedCells(const RationalPolytope &polytope, const Dimension i) const
void addCellsTouchingPolytope(const LatticePolytope &polytope)
CellGeometry< TKSpace > Self
void addCellsTouchingPolytope(const RationalPolytope &polytope)
std::vector< Point > getIntersectedKPoints(const RationalPolytope &polytope, const Dimension i) const
bool myVerbose
Tells if verbose mode.
KSpace myK
The cellular space for cells.
DGtal::BoundedRationalPolytope< Space > RationalPolytope
std::vector< Point > getIntersectedKPoints(const LatticePolytope &polytope, const Dimension i) const
Size computeNbCells(const Dimension k) const
Dimension myMaxCellDim
The maximal cell dimension.
void addCellsTouchingPointel(const Cell &pointel)
void addCellsTouchingSegment(const Point &a, const Point &b)
void addCellsTouchingPolytopePoints(const LatticePolytope &polytope)
void addCellsTouchingCell(const Cell &c)
BOOST_CONCEPT_ASSERT((concepts::CCellularGridSpaceND< TKSpace >))
Integer computeEuler() const
void selfDisplay(std::ostream &out) const
TInteger Integer
Arithmetic ring induced by (+,-,*) and Integer numbers.
PointVector< dim, Integer > Point
NumberTraits< Integer >::UnsignedVersion Size
Type used to represent sizes in the digital space.
static const constexpr Dimension dimension
DGtal is the top-level namespace which contains all DGtal functions and types.
boost::int64_t int64_t
signed 94-bit integer.
std::ostream & operator<<(std::ostream &out, const ClosedIntegerHalfPlane< TSpace > &object)
DGtal::uint32_t Dimension
mpz_class BigInteger
Multi-precision integer with GMP implementation.
static UnorderedSetByBlock< typename KSpace::Point, Splitter< typename KSpace::Point, uint64_t > > getIncidentKPointsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
BOOST_CONCEPT_ASSERT((concepts::CCellularGridSpaceND< TKSpace >))
BOOST_STATIC_ASSERT(TKSpace::dimension==2)
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPointels(const KSpace &K, PointelIterator itB, PointelIterator itE)
static UnorderedSetByBlock< typename KSpace::Point, Splitter< typename KSpace::Point, uint64_t > > getIncidentKPointsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPointels(const KSpace &K, PointelIterator itB, PointelIterator itE)
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
BOOST_CONCEPT_ASSERT((concepts::CCellularGridSpaceND< TKSpace >))
BOOST_STATIC_ASSERT(TKSpace::dimension==3)
static UnorderedSetByBlock< typename KSpace::Point, Splitter< typename KSpace::Point, uint64_t > > getIncidentKPointsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
BOOST_CONCEPT_ASSERT((concepts::CCellularGridSpaceND< TKSpace >))
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
BOOST_STATIC_ASSERT(TKSpace::dimension==2)
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPointels(const KSpace &K, PointelIterator itB, PointelIterator itE)
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
BOOST_CONCEPT_ASSERT((concepts::CCellularGridSpaceND< TKSpace >))
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPointels(const KSpace &K, PointelIterator itB, PointelIterator itE)
BOOST_STATIC_ASSERT(TKSpace::dimension==2)
static UnorderedSetByBlock< typename KSpace::Point, Splitter< typename KSpace::Point, uint64_t > > getIncidentKPointsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
BOOST_CONCEPT_ASSERT((concepts::CCellularGridSpaceND< TKSpace >))
BOOST_STATIC_ASSERT(TKSpace::dimension==3)
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPointels(const KSpace &K, PointelIterator itB, PointelIterator itE)
static UnorderedSetByBlock< typename KSpace::Point, Splitter< typename KSpace::Point, uint64_t > > getIncidentKPointsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPointels(const KSpace &K, PointelIterator itB, PointelIterator itE)
BOOST_CONCEPT_ASSERT((concepts::CCellularGridSpaceND< TKSpace >))
static std::unordered_set< typename KSpace::Cell > getIncidentCellsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
static UnorderedSetByBlock< typename KSpace::Point, Splitter< typename KSpace::Point, uint64_t > > getIncidentKPointsToPoints(const KSpace &K, PointIterator itB, PointIterator itE)
Aim: This concept describes a cellular grid space in nD. In these spaces obtained by cartesian produc...