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 >
130 bool verbose =
false );
149 bool verbose =
false );
184 template <
typename Po
intIterator>
189 template <
typename Po
intelIterator>
410 template <
typename RandomIterator>
412 bool includes( RandomIterator it2, RandomIterator itE2,
413 RandomIterator it1, RandomIterator itE1 );
426 template <
typename TKSpace>
440 template <
typename TKSpace,
int i,
int N>
455 template <
typename Po
intelIterator>
457 std::unordered_set<typename KSpace::Cell>
459 PointelIterator itB, PointelIterator itE )
461 std::unordered_set<typename KSpace::Cell> cells;
463 for (
auto it = itB; it != itE; ++it )
466 for (
auto it = itB; it != itE; ++it )
469 auto cofaces =
K.uCoFaces( pointel );
470 for (
auto&& f : cofaces )
471 if (
K.uDim( f ) == i ) cells.insert( f );
482 template <
typename Po
intIterator>
484 std::unordered_set<typename KSpace::Cell>
486 PointIterator itB, PointIterator itE )
488 std::unordered_set<typename KSpace::Cell> cells;
490 for (
auto it = itB; it != itE; ++it )
491 cells.insert(
K.uPointel( *it ) );
493 for (
auto it = itB; it != itE; ++it )
495 auto pointel =
K.uPointel( *it );
496 auto cofaces =
K.uCoFaces( pointel );
497 for (
auto&& f : cofaces )
498 if (
K.uDim( f ) == i ) cells.insert( f );
509 template <
typename Po
intIterator>
514 PointIterator itB, PointIterator itE )
519 for (
auto it = itB; it != itE; ++it )
520 kpoints.insert(
K.uKCoords(
K.uPointel( *it ) ) );
522 for (
auto it = itB; it != itE; ++it )
524 auto pointel =
K.uPointel( *it );
525 auto cofaces =
K.uCoFaces( pointel );
526 for (
auto&& f : cofaces )
527 if (
K.uDim( f ) == i ) kpoints.insert(
K.uKCoords( f ) );
537 template <
typename TKSpace>
551 template <
typename Po
intelIterator>
553 std::unordered_set<typename KSpace::Cell>
555 PointelIterator itB, PointelIterator itE )
557 std::unordered_set<typename KSpace::Cell> cells;
558 for (
auto it = itB; it != itE; ++it )
561 cells.insert(
K.uIncident( pointel, 0,
true ) );
562 cells.insert(
K.uIncident( pointel, 0,
false ) );
563 cells.insert(
K.uIncident( pointel, 1,
true ) );
564 cells.insert(
K.uIncident( pointel, 1,
false ) );
574 template <
typename Po
intIterator>
576 std::unordered_set<typename KSpace::Cell>
578 PointIterator itB, PointIterator itE )
580 std::unordered_set<typename KSpace::Cell> cells;
581 for (
auto it = itB; it != itE; ++it )
583 auto pointel =
K.uPointel( *it );
584 cells.insert(
K.uIncident( pointel, 0,
true ) );
585 cells.insert(
K.uIncident( pointel, 0,
false ) );
586 cells.insert(
K.uIncident( pointel, 1,
true ) );
587 cells.insert(
K.uIncident( pointel, 1,
false ) );
597 template <
typename Po
intIterator>
602 PointIterator itB, PointIterator itE )
606 for (
auto it = itB; it != itE; ++it )
608 auto kp =
K.uKCoords(
K.uPointel( *it ) );
609 kpoints.emplace( kp[ 0 ] , kp[ 1 ] - 1 );
610 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] );
611 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] );
612 kpoints.emplace( kp[ 0 ] , kp[ 1 ] + 1 );
621 template <
typename TKSpace>
635 template <
typename Po
intelIterator>
637 std::unordered_set<typename KSpace::Cell>
639 PointelIterator itB, PointelIterator itE )
641 std::unordered_set<typename KSpace::Cell> cells;
642 for (
auto it = itB; it != itE; ++it )
645 cells.insert(
K.uIncident( pointel, 0,
true ) );
646 cells.insert(
K.uIncident( pointel, 0,
false ) );
647 cells.insert(
K.uIncident( pointel, 1,
true ) );
648 cells.insert(
K.uIncident( pointel, 1,
false ) );
649 cells.insert(
K.uIncident( pointel, 2,
true ) );
650 cells.insert(
K.uIncident( pointel, 2,
false ) );
661 template <
typename Po
intIterator>
663 std::unordered_set<typename KSpace::Cell>
665 PointIterator itB, PointIterator itE )
667 std::cout <<
"<1,3> specialization" << std::endl;
668 std::unordered_set<typename KSpace::Cell> cells;
669 for (
auto it = itB; it != itE; ++it )
671 auto pointel =
K.uPointel( *it );
672 cells.insert(
K.uIncident( pointel, 0,
true ) );
673 cells.insert(
K.uIncident( pointel, 0,
false ) );
674 cells.insert(
K.uIncident( pointel, 1,
true ) );
675 cells.insert(
K.uIncident( pointel, 1,
false ) );
676 cells.insert(
K.uIncident( pointel, 2,
true ) );
677 cells.insert(
K.uIncident( pointel, 2,
false ) );
687 template <
typename Po
intIterator>
692 PointIterator itB, PointIterator itE )
696 for (
auto it = itB; it != itE; ++it )
698 auto kp =
K.uKCoords(
K.uPointel( *it ) );
699 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] , kp[ 2 ] );
700 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] , kp[ 2 ] );
701 kpoints.emplace( kp[ 0 ] , kp[ 1 ] - 1, kp[ 2 ] );
702 kpoints.emplace( kp[ 0 ] , kp[ 1 ] + 1, kp[ 2 ] );
703 kpoints.emplace( kp[ 0 ] , kp[ 1 ] , kp[ 2 ] - 1 );
704 kpoints.emplace( kp[ 0 ] , kp[ 1 ] , kp[ 2 ] + 1 );
713 template <
typename TKSpace>
727 template <
typename Po
intelIterator>
729 std::unordered_set<typename KSpace::Cell>
731 PointelIterator itB, PointelIterator itE )
733 std::unordered_set<typename KSpace::Cell> cells;
734 for (
auto it = itB; it != itE; ++it )
737 auto linelxp =
K.uIncident( pointel, 0,
true );
738 auto linelxm =
K.uIncident( pointel, 0,
false );
739 cells.insert(
K.uIncident( linelxp, 1,
true ) );
740 cells.insert(
K.uIncident( linelxp, 1,
false ) );
741 cells.insert(
K.uIncident( linelxm, 1,
true ) );
742 cells.insert(
K.uIncident( linelxm, 1,
false ) );
753 template <
typename Po
intIterator>
755 std::unordered_set<typename KSpace::Cell>
757 PointIterator itB, PointIterator itE )
759 std::cout <<
"<2,2> specialization" << std::endl;
760 std::unordered_set<typename KSpace::Cell> cells;
761 for (
auto it = itB; it != itE; ++it )
763 auto pointel =
K.uPointel( *it );
764 auto linelxp =
K.uIncident( pointel, 0,
true );
765 auto linelxm =
K.uIncident( pointel, 0,
false );
766 cells.insert(
K.uIncident( linelxp, 1,
true ) );
767 cells.insert(
K.uIncident( linelxp, 1,
false ) );
768 cells.insert(
K.uIncident( linelxm, 1,
true ) );
769 cells.insert(
K.uIncident( linelxm, 1,
false ) );
779 template <
typename Po
intIterator>
784 PointIterator itB, PointIterator itE )
788 for (
auto it = itB; it != itE; ++it )
790 auto kp =
K.uKCoords(
K.uPointel( *it ) );
791 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] - 1 );
792 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] - 1 );
793 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] + 1 );
794 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] + 1 );
803 template <
typename TKSpace>
817 template <
typename Po
intelIterator>
819 std::unordered_set<typename KSpace::Cell>
821 PointelIterator itB, PointelIterator itE )
823 std::unordered_set<typename KSpace::Cell> cells;
824 for (
auto it = itB; it != itE; ++it )
827 auto linelxp =
K.uIncident( pointel, 0,
true );
828 auto linelxm =
K.uIncident( pointel, 0,
false );
829 auto linelyp =
K.uIncident( pointel, 1,
true );
830 auto linelym =
K.uIncident( pointel, 1,
false );
831 cells.insert(
K.uIncident( linelxp, 1,
true ) );
832 cells.insert(
K.uIncident( linelxp, 1,
false ) );
833 cells.insert(
K.uIncident( linelxp, 2,
true ) );
834 cells.insert(
K.uIncident( linelxp, 2,
false ) );
835 cells.insert(
K.uIncident( linelxm, 1,
true ) );
836 cells.insert(
K.uIncident( linelxm, 1,
false ) );
837 cells.insert(
K.uIncident( linelxm, 2,
true ) );
838 cells.insert(
K.uIncident( linelxm, 2,
false ) );
839 cells.insert(
K.uIncident( linelyp, 2,
true ) );
840 cells.insert(
K.uIncident( linelyp, 2,
false ) );
841 cells.insert(
K.uIncident( linelym, 2,
true ) );
842 cells.insert(
K.uIncident( linelym, 2,
false ) );
853 template <
typename Po
intIterator>
855 std::unordered_set<typename KSpace::Cell>
857 PointIterator itB, PointIterator itE )
859 std::cout <<
"<2,3> specialization" << std::endl;
860 std::unordered_set<typename KSpace::Cell> cells;
861 for (
auto it = itB; it != itE; ++it )
863 auto pointel =
K.uPointel( *it );
864 auto linelxp =
K.uIncident( pointel, 0,
true );
865 auto linelxm =
K.uIncident( pointel, 0,
false );
866 auto linelyp =
K.uIncident( pointel, 1,
true );
867 auto linelym =
K.uIncident( pointel, 1,
false );
868 cells.insert(
K.uIncident( linelxp, 1,
true ) );
869 cells.insert(
K.uIncident( linelxp, 1,
false ) );
870 cells.insert(
K.uIncident( linelxp, 2,
true ) );
871 cells.insert(
K.uIncident( linelxp, 2,
false ) );
872 cells.insert(
K.uIncident( linelxm, 1,
true ) );
873 cells.insert(
K.uIncident( linelxm, 1,
false ) );
874 cells.insert(
K.uIncident( linelxm, 2,
true ) );
875 cells.insert(
K.uIncident( linelxm, 2,
false ) );
876 cells.insert(
K.uIncident( linelyp, 2,
true ) );
877 cells.insert(
K.uIncident( linelyp, 2,
false ) );
878 cells.insert(
K.uIncident( linelym, 2,
true ) );
879 cells.insert(
K.uIncident( linelym, 2,
false ) );
889 template <
typename Po
intIterator>
894 PointIterator itB, PointIterator itE )
898 for (
auto it = itB; it != itE; ++it )
900 auto kp =
K.uKCoords(
K.uPointel( *it ) );
901 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] - 1, kp[ 2 ] );
902 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] - 1, kp[ 2 ] );
903 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] + 1, kp[ 2 ] );
904 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] + 1, kp[ 2 ] );
905 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] , kp[ 2 ] - 1 );
906 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] , kp[ 2 ] - 1 );
907 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] , kp[ 2 ] + 1 );
908 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] , kp[ 2 ] + 1 );
909 kpoints.emplace( kp[ 0 ] , kp[ 1 ] - 1, kp[ 2 ] - 1 );
910 kpoints.emplace( kp[ 0 ] , kp[ 1 ] + 1, kp[ 2 ] - 1 );
911 kpoints.emplace( kp[ 0 ] , kp[ 1 ] - 1, kp[ 2 ] + 1 );
912 kpoints.emplace( kp[ 0 ] , kp[ 1 ] + 1, kp[ 2 ] + 1 );
921 template <
typename TKSpace>
935 template <
typename Po
intelIterator>
937 std::unordered_set<typename KSpace::Cell>
939 PointelIterator itB, PointelIterator itE )
941 std::unordered_set<typename KSpace::Cell> cells;
942 for (
auto it = itB; it != itE; ++it )
945 auto linelxp =
K.uIncident( pointel, 0,
true );
946 auto linelxm =
K.uIncident( pointel, 0,
false );
947 auto surfxpyp =
K.uIncident( linelxp, 1,
true );
948 auto surfxpym =
K.uIncident( linelxp, 1,
false );
949 auto surfxmyp =
K.uIncident( linelxm, 1,
true );
950 auto surfxmym =
K.uIncident( linelxm, 1,
false );
951 cells.insert(
K.uIncident( surfxpyp, 2,
true ) );
952 cells.insert(
K.uIncident( surfxpyp, 2,
false ) );
953 cells.insert(
K.uIncident( surfxpym, 2,
true ) );
954 cells.insert(
K.uIncident( surfxpym, 2,
false ) );
955 cells.insert(
K.uIncident( surfxmyp, 2,
true ) );
956 cells.insert(
K.uIncident( surfxmyp, 2,
false ) );
957 cells.insert(
K.uIncident( surfxmym, 2,
true ) );
958 cells.insert(
K.uIncident( surfxmym, 2,
false ) );
969 template <
typename Po
intIterator>
971 std::unordered_set<typename KSpace::Cell>
973 PointIterator itB, PointIterator itE )
975 std::unordered_set<typename KSpace::Cell> cells;
976 for (
auto it = itB; it != itE; ++it )
978 auto pointel =
K.uPointel( *it );
979 auto linelxp =
K.uIncident( pointel, 0,
true );
980 auto linelxm =
K.uIncident( pointel, 0,
false );
981 auto surfxpyp =
K.uIncident( linelxp, 1,
true );
982 auto surfxpym =
K.uIncident( linelxp, 1,
false );
983 auto surfxmyp =
K.uIncident( linelxm, 1,
true );
984 auto surfxmym =
K.uIncident( linelxm, 1,
false );
985 cells.insert(
K.uIncident( surfxpyp, 2,
true ) );
986 cells.insert(
K.uIncident( surfxpyp, 2,
false ) );
987 cells.insert(
K.uIncident( surfxpym, 2,
true ) );
988 cells.insert(
K.uIncident( surfxpym, 2,
false ) );
989 cells.insert(
K.uIncident( surfxmyp, 2,
true ) );
990 cells.insert(
K.uIncident( surfxmyp, 2,
false ) );
991 cells.insert(
K.uIncident( surfxmym, 2,
true ) );
992 cells.insert(
K.uIncident( surfxmym, 2,
false ) );
1002 template <
typename Po
intIterator>
1007 PointIterator itB, PointIterator itE )
1011 for (
auto it = itB; it != itE; ++it )
1013 auto kp =
K.uKCoords(
K.uPointel( *it ) );
1014 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] - 1, kp[ 2 ] - 1 );
1015 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] - 1, kp[ 2 ] - 1 );
1016 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] + 1, kp[ 2 ] - 1 );
1017 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] + 1, kp[ 2 ] - 1 );
1018 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] - 1, kp[ 2 ] + 1 );
1019 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] - 1, kp[ 2 ] + 1 );
1020 kpoints.emplace( kp[ 0 ] - 1, kp[ 1 ] + 1, kp[ 2 ] + 1 );
1021 kpoints.emplace( kp[ 0 ] + 1, kp[ 1 ] + 1, kp[ 2 ] + 1 );
1034#include "CellGeometry.ih"
1041#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.
std::ostream & operator<<(std::ostream &out, const ClosedIntegerHalfPlane< TSpace > &object)
DGtal::uint32_t Dimension
boost::multiprecision::number< boost::multiprecision::cpp_int_backend<>, boost::multiprecision::et_off > BigInteger
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...