INET Framework for OMNeT++/OMNEST
inet::SpatialGrid Class Reference

This class implements a spatial grid data structure using a 3 dimensional grid. More...

#include <SpatialGrid.h>

Classes

class  LineSegmentIterator
 
class  Triplet
 

Public Types

typedef std::list< const cObject * > Voxel
 
typedef std::vector< VoxelGrid
 

Public Member Functions

bool insertObject (const cObject *object, const Coord &pos, const Coord &boundingBoxSize)
 
bool insertPoint (const cObject *point, const Coord &pos)
 
bool removePoint (const cObject *point)
 
bool movePoint (const cObject *point, const Coord &newPos)
 
void clearGrid ()
 
void rangeQuery (const Coord &pos, double range, const IVisitor *visitor) const
 
void lineSegmentQuery (const LineSegment &lineSegment, const IVisitor *visitor) const
 
 SpatialGrid (const Coord &voxelSizes, const Coord &constraintAreaMin, const Coord &constraintAreaMax)
 

Protected Member Functions

Coord computeConstraintAreaSideLengths () const
 
Triplet< int > computeNumberOfVoxels () const
 
unsigned int computeGridVectorLength () const
 
Triplet< int > decodeRowMajorIndex (unsigned int ind) const
 
unsigned int rowMajorIndex (const Triplet< int > &indices) const
 
unsigned int coordToRowMajorIndex (const Coord &pos) const
 
Triplet< int > coordToMatrixIndices (const Coord &pos) const
 
void computeBoundingVoxels (const Coord &pos, const Triplet< double > &boundings, Triplet< int > &start, Triplet< int > &end) const
 

Protected Attributes

Grid grid
 
unsigned int gridVectorLength
 
Triplet< double > voxelSizes
 
Coord constraintAreaSideLengths
 
Coord constraintAreaMin
 
Coord constraintAreaMax
 
Triplet< int > numVoxels
 

Detailed Description

This class implements a spatial grid data structure using a 3 dimensional grid.

It can also be used with zero-length {X, Y, Z} sides, and then it operates in 1 or 2 dimensional mode.

NOTE: With minimal effort, it can be extended to work in arbitrary dimension spaces.

Member Typedef Documentation

◆ Grid

typedef std::vector<Voxel> inet::SpatialGrid::Grid

◆ Voxel

typedef std::list<const cObject *> inet::SpatialGrid::Voxel

Constructor & Destructor Documentation

◆ SpatialGrid()

inet::SpatialGrid::SpatialGrid ( const Coord voxelSizes,
const Coord constraintAreaMin,
const Coord constraintAreaMax 
)
48 {
49  this->voxelSizes = Triplet<double>(voxelSizes.x, voxelSizes.y, voxelSizes.z);
55  if (gridVectorLength <= 0)
56  throw cRuntimeError("Invalid gridVectorLength = %d", gridVectorLength);
57  grid.resize(gridVectorLength);
58 }

Member Function Documentation

◆ clearGrid()

void inet::SpatialGrid::clearGrid ( )
171 {
172  for (unsigned int i = 0; i < gridVectorLength; i++)
173  grid[i].clear();
174 }

◆ computeBoundingVoxels()

void inet::SpatialGrid::computeBoundingVoxels ( const Coord pos,
const Triplet< double > &  boundings,
Triplet< int > &  start,
Triplet< int > &  end 
) const
protected
31 {
32  int xVoxel = constraintAreaSideLengths.x == 0 ? 0 : ceil((boundings.x * numVoxels[0]) / constraintAreaSideLengths.x);
33  int yVoxel = constraintAreaSideLengths.y == 0 ? 0 : ceil((boundings.y * numVoxels[1]) / constraintAreaSideLengths.y);
34  int zVoxel = constraintAreaSideLengths.z == 0 ? 0 : ceil((boundings.z * numVoxels[2]) / constraintAreaSideLengths.z);
35  Triplet<int> voxels(xVoxel, yVoxel, zVoxel);
36  Triplet<int> matrixIndices = coordToMatrixIndices(pos);
37  for (unsigned int i = 0; i < 3; i++) {
38  start[i] = matrixIndices[i] - voxels[i] < 0 ? 0 : matrixIndices[i] - voxels[i];
39  int endCell = matrixIndices[i] + voxels[i] >= numVoxels[i] ? numVoxels[i] - 1 : matrixIndices[i] + voxels[i];
40  if (endCell < 0)
41  end[i] = 0;
42  else
43  end[i] = endCell;
44  }
45 }

Referenced by insertObject(), and rangeQuery().

◆ computeConstraintAreaSideLengths()

Coord inet::SpatialGrid::computeConstraintAreaSideLengths ( ) const
protected

◆ computeGridVectorLength()

unsigned int inet::SpatialGrid::computeGridVectorLength ( ) const
protected
130 {
131  unsigned int gridVectorLength = 1;
132  for (unsigned int i = 0; i < 3; i++)
133  if (numVoxels[i] != 0)
135  return gridVectorLength;
136 }

Referenced by SpatialGrid().

◆ computeNumberOfVoxels()

SpatialGrid::Triplet< int > inet::SpatialGrid::computeNumberOfVoxels ( ) const
protected
122 {
123  return Triplet<int>(
127 }

Referenced by SpatialGrid().

◆ coordToMatrixIndices()

SpatialGrid::Triplet< int > inet::SpatialGrid::coordToMatrixIndices ( const Coord pos) const
protected
177 {
178  int xCoord = numVoxels[0] == 0 ? 0 : std::min((int)floor((pos.x - constraintAreaMin.x) / voxelSizes.x), numVoxels[0] - 1);
179  int yCoord = numVoxels[1] == 0 ? 0 : std::min((int)floor((pos.y - constraintAreaMin.y) / voxelSizes.y), numVoxels[1] - 1);
180  int zCoord = numVoxels[2] == 0 ? 0 : std::min((int)floor((pos.z - constraintAreaMin.z) / voxelSizes.z), numVoxels[2] - 1);
181  return Triplet<int>(xCoord, yCoord, zCoord);
182 }

Referenced by computeBoundingVoxels(), coordToRowMajorIndex(), and inet::SpatialGrid::LineSegmentIterator::LineSegmentIterator().

◆ coordToRowMajorIndex()

unsigned int inet::SpatialGrid::coordToRowMajorIndex ( const Coord pos) const
protected
166 {
167  return rowMajorIndex(coordToMatrixIndices(pos));
168 }

Referenced by insertPoint().

◆ decodeRowMajorIndex()

SpatialGrid::Triplet< int > inet::SpatialGrid::decodeRowMajorIndex ( unsigned int  ind) const
protected
139 {
140  Triplet<int> indices;
141  for (unsigned int k = 0; k < 3; k++) {
142  unsigned int prodDim = 1;
143  for (unsigned int l = k + 1; l < 3; l++)
144  if (numVoxels[l] > 0)
145  prodDim *= numVoxels[l];
146  indices[k] = ind / prodDim;
147  ind %= prodDim;
148  }
149  return indices;
150 }

◆ insertObject()

bool inet::SpatialGrid::insertObject ( const cObject *  object,
const Coord pos,
const Coord boundingBoxSize 
)
15 {
16  Triplet<int> start, end;
17  computeBoundingVoxels(pos, Triplet<double>(boundingBoxSize.x / 2, boundingBoxSize.y / 2, boundingBoxSize.z / 2), start, end);
18  for (int i = start[0]; i <= end[0]; i++) {
19  for (int j = start[1]; j <= end[1]; j++) {
20  for (int k = start[2]; k <= end[2]; k++) {
21  int voxelIndex = rowMajorIndex(Triplet<int>(i, j, k));
22  Voxel& neighborVoxel = grid[voxelIndex];
23  neighborVoxel.push_back(check_and_cast<const cObject *>(object));
24  }
25  }
26  }
27  return true;
28 }

Referenced by inet::physicalenvironment::GridObjectCache::insertObject().

◆ insertPoint()

bool inet::SpatialGrid::insertPoint ( const cObject *  point,
const Coord pos 
)
61 {
62  unsigned int ind = coordToRowMajorIndex(pos);
63  if (ind >= gridVectorLength) {
64  throw cRuntimeError("Out of range with index: %d", ind);
65  return false;
66  }
67  grid[ind].push_back(point);
68  return true;
69 }

Referenced by inet::physicallayer::GridNeighborCache::addRadio(), and inet::physicallayer::GridNeighborCache::fillCubeVector().

◆ lineSegmentQuery()

void inet::SpatialGrid::lineSegmentQuery ( const LineSegment lineSegment,
const IVisitor visitor 
) const
98 {
99  std::set<const cObject *> visited;
100  for (LineSegmentIterator it(this, lineSegment, voxelSizes, numVoxels); !it.end(); ++it) {
101  Triplet<int> ind = it.getMatrixIndices();
102  unsigned int voxelIndex = rowMajorIndex(ind);
103  if (voxelIndex >= gridVectorLength)
104  throw cRuntimeError("Out of index, gridVectorLength = %d, voxelIndex = %d", gridVectorLength, voxelIndex);
105  const Voxel& intersectedVoxel = grid[voxelIndex];
106  for (const auto& elem : intersectedVoxel) {
107  if (!contains(visited, elem)) {
108  visitor->visit(elem);
109  visited.insert(elem);
110  }
111  }
112  }
113 }

Referenced by inet::physicalenvironment::GridObjectCache::visitObjects().

◆ movePoint()

bool inet::SpatialGrid::movePoint ( const cObject *  point,
const Coord newPos 
)
77 {
78  throw cRuntimeError("Unimplemented");
79 }

◆ rangeQuery()

void inet::SpatialGrid::rangeQuery ( const Coord pos,
double  range,
const IVisitor visitor 
) const
82 {
83  Triplet<int> start, end;
84  computeBoundingVoxels(pos, Triplet<double>(range, range, range), start, end);
85  for (int i = start[0]; i <= end[0]; i++) {
86  for (int j = start[1]; j <= end[1]; j++) {
87  for (int k = start[2]; k <= end[2]; k++) {
88  int voxelIndex = rowMajorIndex(Triplet<int>(i, j, k));
89  const Voxel& neighborVoxel = grid[voxelIndex];
90  for (const auto& elem : neighborVoxel)
91  visitor->visit(elem);
92  }
93  }
94  }
95 }

Referenced by inet::physicallayer::GridNeighborCache::sendToNeighbors().

◆ removePoint()

bool inet::SpatialGrid::removePoint ( const cObject *  point)
72 {
73  throw cRuntimeError("Unimplemented");
74 }

◆ rowMajorIndex()

unsigned int inet::SpatialGrid::rowMajorIndex ( const Triplet< int > &  indices) const
protected
153 {
154  int ind = 0;
155  for (unsigned int k = 0; k < 3; k++) {
156  unsigned int prodDim = 1;
157  for (unsigned int l = k + 1; l < 3; l++)
158  if (numVoxels[l] > 0)
159  prodDim *= numVoxels[l];
160  ind += prodDim * indices[k];
161  }
162  return ind;
163 }

Referenced by coordToRowMajorIndex(), insertObject(), lineSegmentQuery(), and rangeQuery().

Member Data Documentation

◆ constraintAreaMax

Coord inet::SpatialGrid::constraintAreaMax
protected

◆ constraintAreaMin

◆ constraintAreaSideLengths

Coord inet::SpatialGrid::constraintAreaSideLengths
protected

◆ grid

Grid inet::SpatialGrid::grid
protected

◆ gridVectorLength

unsigned int inet::SpatialGrid::gridVectorLength
protected

◆ numVoxels

◆ voxelSizes


The documentation for this class was generated from the following files:
inet::SpatialGrid::Triplet::y
T y
Definition: SpatialGrid.h:31
inet::sctp::min
double min(const double a, const double b)
Returns the minimum of a and b.
Definition: SctpAssociation.h:261
inet::Coord::x
double x
Definition: Coord.h:36
inet::SpatialGrid::constraintAreaMax
Coord constraintAreaMax
Definition: SpatialGrid.h:87
inet::SpatialGrid::rowMajorIndex
unsigned int rowMajorIndex(const Triplet< int > &indices) const
Definition: SpatialGrid.cc:152
inet::SpatialGrid::coordToRowMajorIndex
unsigned int coordToRowMajorIndex(const Coord &pos) const
Definition: SpatialGrid.cc:165
inet::SpatialGrid::grid
Grid grid
Definition: SpatialGrid.h:83
inet::SpatialGrid::voxelSizes
Triplet< double > voxelSizes
Definition: SpatialGrid.h:85
inet::SpatialGrid::constraintAreaMin
Coord constraintAreaMin
Definition: SpatialGrid.h:87
inet::contains
bool contains(const std::vector< T > &v, const Tk &a)
Definition: stlutils.h:65
inet::Coord::z
double z
Definition: Coord.h:38
inet::SpatialGrid::computeNumberOfVoxels
Triplet< int > computeNumberOfVoxels() const
Definition: SpatialGrid.cc:121
inet::SpatialGrid::computeGridVectorLength
unsigned int computeGridVectorLength() const
Definition: SpatialGrid.cc:129
inet::SpatialGrid::constraintAreaSideLengths
Coord constraintAreaSideLengths
Definition: SpatialGrid.h:86
inet::SpatialGrid::Triplet::x
T x
Definition: SpatialGrid.h:30
inet::SpatialGrid::Voxel
std::list< const cObject * > Voxel
Definition: SpatialGrid.h:79
inet::physicallayer::k
const double k
Definition: Qam1024Modulation.cc:14
inet::SpatialGrid::numVoxels
Triplet< int > numVoxels
Definition: SpatialGrid.h:88
inet::SpatialGrid::computeConstraintAreaSideLengths
Coord computeConstraintAreaSideLengths() const
Definition: SpatialGrid.cc:115
inet::SpatialGrid::coordToMatrixIndices
Triplet< int > coordToMatrixIndices(const Coord &pos) const
Definition: SpatialGrid.cc:176
inet::SpatialGrid::Triplet::z
T z
Definition: SpatialGrid.h:32
inet::SpatialGrid::computeBoundingVoxels
void computeBoundingVoxels(const Coord &pos, const Triplet< double > &boundings, Triplet< int > &start, Triplet< int > &end) const
Definition: SpatialGrid.cc:30
inet::Coord::y
double y
Definition: Coord.h:37
inet::SpatialGrid::gridVectorLength
unsigned int gridVectorLength
Definition: SpatialGrid.h:84