8#ifndef META_OCEAN_GEOMETRY_SPATIAL_DISTRIBUTION_H
9#define META_OCEAN_GEOMETRY_SPATIAL_DISTRIBUTION_H
36 class OCEAN_GEOMETRY_EXPORT
Array
44 inline Scalar left()
const;
56 inline Scalar width()
const;
62 inline Scalar height()
const;
68 inline unsigned int horizontalBins()
const;
74 inline unsigned int verticalBins()
const;
80 inline unsigned int bins()
const;
89 inline unsigned int index(
const Scalar x,
const Scalar y)
const;
98 inline int horizontalBin(
const Scalar x)
const;
107 inline int verticalBin(
const Scalar y)
const;
116 inline int clampedHorizontalBin(
const Scalar x)
const;
125 inline int clampedVerticalBin(
const Scalar y)
const;
131 inline bool isValid()
const;
138 inline bool operator==(
const Array& right)
const;
145 inline bool operator!=(
const Array& right)
const;
151 explicit inline operator bool()
const;
181 inline Array(
const Scalar left,
const Scalar top,
const Scalar width,
const Scalar height,
const unsigned int horizontalBins,
const unsigned int verticalBins);
195 inline Array& operator=(
Array&&
object)
noexcept;
212 unsigned int horizontalBins_ = 0u;
215 unsigned int verticalBins_ = 0u;
291 inline bool hasCopiedNeighborhood8()
const;
304 inline const Indices32& operator()(
const unsigned int horizontal,
const unsigned int vertical)
const;
312 inline Indices32& operator()(
const unsigned int horizontal,
const unsigned int vertical);
320 inline const Indices32& operator[](
const unsigned int index)
const;
328 inline Indices32& operator[](
const unsigned int index);
363 bool hasCopiedNeighborhood8_ =
false;
397 inline OccupancyArray(
const Box2& boundingBox,
const unsigned int horizontalBins,
const unsigned int verticalBins,
const bool allFree =
true);
409 inline OccupancyArray(
const Scalar left,
const Scalar top,
const Scalar width,
const Scalar height,
const unsigned int horizontalBins,
const unsigned int verticalBins,
const bool allFree =
true);
417 inline bool isOccupiedNeighborhood9(
const unsigned int horizontal,
const unsigned int vertical)
const;
424 inline bool isOccupiedNeighborhood9(
const Vector2& point)
const;
432 inline bool isNotOccupiedNeighborhood9(
const unsigned int horizontal,
const unsigned int vertical)
const;
439 inline bool isNotOccupiedNeighborhood9(
const Vector2& point)
const;
447 inline unsigned int countOccupiedNeighborhood9(
const unsigned int horizontal,
const unsigned int vertical)
const;
453 inline unsigned int occupiedBins()
const;
459 inline unsigned int freeBins()
const;
467 inline bool addPoint(
const Vector2& point);
478 inline bool addPointWithCounter(
const Vector2& point,
const unsigned int maximalOccupancyCounter);
487 inline bool removePoint(
const Vector2& point);
515 inline bool operator()(
const unsigned int horizontal,
const unsigned int vertical)
const;
522 inline bool operator()(
const Vector2& point)
const;
530 inline unsigned int& operator()(
const unsigned int horizontal,
const unsigned int vertical);
537 inline bool operator[](
const unsigned int index)
const;
544 inline unsigned int& operator[](
const unsigned int index);
565 inline bool operator==(
const OccupancyArray& occupancyArray)
const;
572 inline bool operator!=(
const OccupancyArray& occupancyArray)
const;
593 inline DistanceElement(
const unsigned int index,
const unsigned int candidateIndex,
const Scalar distance);
599 inline unsigned int index()
const;
605 inline unsigned int candidateIndex()
const;
611 inline Scalar distance()
const;
638 unsigned int index_ = 0u;
641 unsigned int candidateIndex_ = 0u;
665 static void idealBins(
const unsigned int width,
const unsigned int height,
const size_t numberBins,
unsigned int& horizontalBins,
unsigned int& verticalBins,
const unsigned int minimalHorizontalBins = 2u,
const unsigned int minimalVerticalBins = 2u);
680 static void idealBinsNeighborhood9(
const unsigned int width,
const unsigned int height,
const Scalar distance,
unsigned int& horizontalBins,
unsigned int& verticalBins,
const unsigned int minimalHorizontalBins = 2u,
const unsigned int minimalVerticalBins = 2u,
const unsigned int maximalHorizontalBins = 20u,
const unsigned int maximalVerticalBins = 20u);
700 static inline DistributionArray distributeToArray(
const ImagePoint* imagePoints,
const size_t number,
const Scalar left,
const Scalar top,
const Scalar width,
const Scalar height,
const unsigned int averagePointsPerBin,
const unsigned int maxHorizontalBins,
const unsigned int maxVerticalBins,
unsigned int& horizontalBins,
unsigned int& verticalBins);
732 template <
typename T, const Vector2& (*tFunction)(const T&)>
733 static DistributionArray distributeToArray(
const T* elements,
const size_t number,
const Scalar left,
const Scalar top,
const Scalar width,
const Scalar height,
const unsigned int horizontalBins,
const unsigned int verticalBins);
749 template <
unsigned int tMaximalBins>
792 static void filterCandidatePoint(
const ImagePoint* imagePoints,
const size_t numberImagePoints,
const ImagePoint* candidatePoints,
const size_t numberCandidatePoints,
const unsigned int width,
const unsigned int height,
const Scalar filterDistance,
const unsigned int filterSize,
Indices32* filteredIndices =
nullptr,
ImagePoints* filteredCandidates =
nullptr);
884 static void determineMinimalSqrDistances(
const ImagePoint* imagePoints,
const size_t numberImagePoints,
const unsigned int* interestIndices,
const size_t numberInterestIndices,
const unsigned int width,
const unsigned int height,
const unsigned int bins,
Scalar* sqrDistances);
921 static inline ImagePoints distributeAndFilter(
const ImagePoint* imagePoints,
const size_t numberImagePoints,
const Scalar left,
const Scalar top,
const Scalar width,
const Scalar height,
const unsigned int horizontalBins,
const unsigned int verticalBins);
952 template <
typename TIndex>
953 static inline std::vector<TIndex> distributeAndFilterIndices(
const ImagePoint* imagePoints,
const size_t numberImagePoints,
const Scalar left,
const Scalar top,
const Scalar width,
const Scalar height,
const unsigned int horizontalBins,
const unsigned int verticalBins);
969 template <
typename T, Vector2 (*tFunction)(const T&)>
970 static std::vector<T> distributeAndFilter(
const T* elements,
const size_t numberElements,
const Scalar left,
const Scalar top,
const Scalar width,
const Scalar height,
const unsigned int horizontalBins,
const unsigned int verticalBins);
991 template <
typename T, Vector2 (*tFunction)(const T&)>
992 static std::vector<T> distributeAndFilter(
const T* elements,
const size_t numberElements,
const Scalar left,
const Scalar top,
const Scalar width,
const Scalar height,
const unsigned int horizontalBins,
const unsigned int verticalBins,
const size_t numberDesiredFilteredElements,
Indices32 *indices =
nullptr);
1010 template <
typename T,
typename TIndex, Vector2 (*tFunction)(const T&)>
1011 static std::vector<TIndex> distributeAndFilterIndices(
const T* elements,
const size_t numberElements,
const Scalar left,
const Scalar top,
const Scalar width,
const Scalar height,
const unsigned int horizontalBins,
const unsigned int verticalBins);
1021 template <
typename T>
1022 static inline T identity(
const T& value);
1026 areaLeft_(
object.areaLeft_),
1027 areaTop_(
object.areaTop_),
1028 areaWidth_(
object.areaWidth_),
1029 areaHeight_(
object.areaHeight_),
1030 horizontalBins_(
object.horizontalBins_),
1031 verticalBins_(
object.verticalBins_),
1032 horizontalPoint2Bin_(
object.horizontalPoint2Bin_),
1033 verticalPoint2Bin_(
object.verticalPoint2Bin_)
1035 object.areaLeft_ =
Scalar(0);
1036 object.areaTop_ =
Scalar(0);
1037 object.areaWidth_ =
Scalar(0);
1038 object.areaHeight_ =
Scalar(0);
1039 object.horizontalBins_ = 0u;
1040 object.verticalBins_ = 0u;
1041 object.horizontalPoint2Bin_ =
Scalar(0);
1042 object.verticalPoint2Bin_ =
Scalar(0);
1049 areaHeight_(height),
1050 horizontalBins_(horizontalBins),
1051 verticalBins_(verticalBins),
1080 return horizontalBins_;
1085 return verticalBins_;
1090 return horizontalBins_ * verticalBins_;
1095 const int xBin = horizontalBin(x);
1096 const int yBin = verticalBin(y);
1098 ocean_assert(xBin >= 0 && xBin <
int(horizontalBins_));
1099 ocean_assert(yBin >= 0 && yBin <
int(verticalBins_));
1101 return yBin * horizontalBins_ + xBin;
1107 return int(
Numeric::floor((x - areaLeft_) * horizontalPoint2Bin_));
1118 ocean_assert(isValid());
1119 return minmax<int>(0, horizontalBin(x), horizontalBins_ - 1);
1124 ocean_assert(isValid());
1125 return minmax<int>(0, verticalBin(y), verticalBins_ - 1);
1130 return horizontalBins_ != 0u && verticalBins_ != 0u;
1147 return !(*
this == right);
1150inline SpatialDistribution::Array::operator bool()
const
1157 if (
this != &
object)
1160 areaTop_ =
object.areaTop_;
1161 areaWidth_ =
object.areaWidth_;
1162 areaHeight_ =
object.areaHeight_;
1163 horizontalBins_ =
object.horizontalBins_;
1164 verticalBins_ =
object.verticalBins_;
1165 horizontalPoint2Bin_ =
object.horizontalPoint2Bin_;
1166 verticalPoint2Bin_ =
object.verticalPoint2Bin_;
1174 if (
this != &
object)
1177 areaTop_ =
object.areaTop_;
1178 areaWidth_ =
object.areaWidth_;
1179 areaHeight_ =
object.areaHeight_;
1180 horizontalBins_ =
object.horizontalBins_;
1181 verticalBins_ =
object.verticalBins_;
1182 horizontalPoint2Bin_ =
object.horizontalPoint2Bin_;
1183 verticalPoint2Bin_ =
object.verticalPoint2Bin_;
1185 object.areaLeft_ =
Scalar(0);
1186 object.areaTop_ =
Scalar(0);
1187 object.areaWidth_ =
Scalar(0);
1188 object.areaHeight_ =
Scalar(0);
1189 object.horizontalBins_ = 0u;
1190 object.verticalBins_ = 0u;
1191 object.horizontalPoint2Bin_ =
Scalar(0);
1192 object.verticalPoint2Bin_ =
Scalar(0);
1200 indexGroups_(std::move(
object.indexGroups_)),
1201 hasCopiedNeighborhood8_(
object.hasCopiedNeighborhood8_)
1207 Array(left, top, width, height, horizontalBins, verticalBins),
1208 indexGroups_(horizontalBins * verticalBins),
1209 hasCopiedNeighborhood8_(false)
1216 return hasCopiedNeighborhood8_;
1221 ocean_assert(horizontal < horizontalBins_);
1222 ocean_assert(vertical < verticalBins_);
1224 return indexGroups_[vertical * horizontalBins_ + horizontal];
1229 ocean_assert(horizontal < horizontalBins_);
1230 ocean_assert(vertical < verticalBins_);
1232 return indexGroups_[vertical * horizontalBins_ + horizontal];
1237 ocean_assert(index < horizontalBins_ * verticalBins_);
1238 return indexGroups_[index];
1243 ocean_assert(index < horizontalBins_ * verticalBins_);
1244 return indexGroups_[index];
1250 indexGroups_ =
object.indexGroups_;
1251 hasCopiedNeighborhood8_ =
object.hasCopiedNeighborhood8_;
1258 if (
this != &
object)
1261 indexGroups_ = std::move(
object.indexGroups_);
1262 hasCopiedNeighborhood8_ =
object.hasCopiedNeighborhood8_;
1264 object.hasCopiedNeighborhood8_ =
false;
1272 if (!Array::operator==(distributionArray))
1282 return !(*
this == distributionArray);
1287 occupancy_(std::move(
object.occupancy_))
1293 Array(boundingBox.left(), boundingBox.top(), boundingBox.width(), boundingBox.height(), horizontalBins, verticalBins),
1294 occupancy_(horizontalBins * verticalBins, allFree ? 0u : 1u)
1300 Array(left, top, width, height, horizontalBins, verticalBins),
1301 occupancy_(horizontalBins * verticalBins, allFree ? 0u : 1u)
1308 ocean_assert(horizontal < horizontalBins_);
1309 ocean_assert(vertical < verticalBins_);
1311 unsigned int number = 0u;
1313 for (
unsigned int y = max(0,
int(vertical) - 1); y < min(vertical + 2u, verticalBins_); ++y)
1315 for (
unsigned int x = max(0,
int(horizontal) - 1); x < min(horizontal + 2u, horizontalBins_); ++x)
1329 ocean_assert(horizontal < horizontalBins_);
1330 ocean_assert(vertical < verticalBins_);
1332 for (
unsigned int y = max(0,
int(vertical) - 1); y < min(vertical + 2u, verticalBins_); ++y)
1334 for (
unsigned int x = max(0,
int(horizontal) - 1); x < min(horizontal + 2u, horizontalBins_); ++x)
1348 const unsigned int horizontal = horizontalBin(point.
x());
1349 const unsigned int vertical = verticalBin(point.
y());
1351 if (horizontal < horizontalBins_ && vertical < verticalBins_)
1353 for (
unsigned int y = max(0,
int(vertical) - 1); y < min(vertical + 2u, verticalBins_); ++y)
1355 for (
unsigned int x = max(0,
int(horizontal) - 1); x < min(horizontal + 2u, horizontalBins_); ++x)
1370 ocean_assert(horizontal < horizontalBins_);
1371 ocean_assert(vertical < verticalBins_);
1373 for (
unsigned int y = max(0,
int(vertical) - 1); y < min(vertical + 2u, verticalBins_); ++y)
1375 for (
unsigned int x = max(0,
int(horizontal) - 1); x < min(horizontal + 2u, horizontalBins_); ++x)
1389 const unsigned int horizontal = horizontalBin(point.
x());
1390 const unsigned int vertical = verticalBin(point.
y());
1392 if (horizontal < horizontalBins_ && vertical < verticalBins_)
1394 for (
unsigned int y = max(0,
int(vertical) - 1); y < min(vertical + 2u, verticalBins_); ++y)
1396 for (
unsigned int x = max(0,
int(horizontal) - 1); x < min(horizontal + 2u, horizontalBins_); ++x)
1411 unsigned int count = 0u;
1413 for (
const Index32& bin : occupancy_)
1426 unsigned int count = 0u;
1428 for (
const Index32& bin : occupancy_)
1441 const unsigned int horizontal = (
unsigned int)(horizontalBin(point.
x()));
1442 const unsigned int vertical = (
unsigned int)(verticalBin(point.
y()));
1444 if (horizontal < horizontalBins_ && vertical < verticalBins_)
1446 const unsigned int index = vertical * horizontalBins_ + horizontal;
1448 if (!occupancy_[index])
1450 occupancy_[index] = 1u;
1460 const unsigned int horizontal = (
unsigned int)(horizontalBin(point.
x()));
1461 const unsigned int vertical = (
unsigned int)(verticalBin(point.
y()));
1463 if (horizontal < horizontalBins_ && vertical < verticalBins_)
1465 const unsigned int index = vertical * horizontalBins_ + horizontal;
1467 if (occupancy_[index] <= maximalOccupancyCounter)
1469 occupancy_[index]++;
1479 const unsigned int horizontal = (
unsigned int)(horizontalBin(point.
x()));
1480 const unsigned int vertical = (
unsigned int)(verticalBin(point.
y()));
1482 if (horizontal < horizontalBins_ && vertical < verticalBins_)
1484 const unsigned int index = vertical * horizontalBins_ + horizontal;
1486 if (occupancy_[index])
1488 occupancy_[index] = 0u;
1498 for (
size_t n = 0; n < occupancy_.size(); ++n)
1506 const unsigned int horizontal = (
unsigned int)(horizontalBin(point.
x()));
1507 const unsigned int vertical = (
unsigned int)(verticalBin(point.
y()));
1509 if (horizontal < horizontalBins_ && vertical < verticalBins_)
1511 occupancy_[vertical * horizontalBins_ + horizontal] = 1u;
1519 const unsigned int horizontal = (
unsigned int)(horizontalBin(point.
x()));
1520 const unsigned int vertical = (
unsigned int)(verticalBin(point.
y()));
1522 if (horizontal < horizontalBins_ && vertical < verticalBins_)
1524 occupancy_[vertical * horizontalBins_ + horizontal] = 0u;
1532 ocean_assert(horizontal < horizontalBins_);
1533 ocean_assert(vertical < verticalBins_);
1535 return occupancy_[vertical * horizontalBins_ + horizontal] != 0u;
1540 ocean_assert(horizontal < horizontalBins_);
1541 ocean_assert(vertical < verticalBins_);
1543 return occupancy_[vertical * horizontalBins_ + horizontal];
1548 const unsigned int xBin = horizontalBin(point.
x());
1549 const unsigned int yBin = verticalBin(point.
y());
1551 return xBin < horizontalBins_ && yBin < horizontalBins_ && occupancy_[yBin * horizontalBins_ + xBin] != 0u;
1556 ocean_assert(index < horizontalBins_ * verticalBins_);
1557 return occupancy_[index] != 0u;
1562 ocean_assert(index < horizontalBins_ * verticalBins_);
1563 return occupancy_[index];
1569 occupancy_ =
object.occupancy_;
1576 if (
this != &
object)
1579 occupancy_ = std::move(
object.occupancy_);
1587 if (!Array::operator==(occupancyArray))
1592 return occupancy_ == occupancyArray.
occupancy_;
1597 return !(*
this == occupancyArray);
1602 candidateIndex_(candidateIndex),
1615 return candidateIndex_;
1640template <
unsigned int tMaximalBins>
1643 static_assert(tMaximalBins > 0u,
"Invalid maximal bin parameter!");
1645 const unsigned int horizontalBins = min(tMaximalBins, (
unsigned int)
Numeric::ceil(width / max(searchDistance,
Scalar(2))));
1646 const unsigned int verticalBins = min(tMaximalBins, (
unsigned int)
Numeric::ceil(height / max(searchDistance,
Scalar(2))));
1648 return distributeToArray(imagePoints, number, left, top, width, height, horizontalBins, verticalBins);
1651template <
typename T, const Vector2& (*tFunction)(const T&)>
1654 ocean_assert(elements);
1655 ocean_assert(width > 0 && height > 0);
1657 ocean_assert(horizontalBins > 0);
1658 ocean_assert(verticalBins > 0);
1660 ocean_assert(
Scalar(horizontalBins) <= width);
1661 ocean_assert(
Scalar(verticalBins) <= width);
1664 DistributionArray indexArray(left, top, width, height, horizontalBins, verticalBins);
1666 for (
size_t n = 0; n < number; ++n)
1668 const Vector2& point = tFunction(*elements);
1670 const unsigned int horizontal = (
unsigned int)(indexArray.
horizontalBin(point.
x()));
1671 const unsigned int vertical = (
unsigned int)(indexArray.
verticalBin(point.
y()));
1676 indexArray(horizontal, vertical).push_back((
unsigned int)n);
1685inline SpatialDistribution::DistributionArray SpatialDistribution::distributeToArray(
const ImagePoint* imagePoints,
const size_t number,
const Scalar left,
const Scalar top,
const Scalar width,
const Scalar height,
const unsigned int averagePointsPerBin,
const unsigned int maxHorizontalBins,
const unsigned int maxVerticalBins,
unsigned int& horizontalBins,
unsigned int& verticalBins)
1687 ocean_assert(imagePoints || number == 0);
1689 ocean_assert(width > 0 && height > 0);
1690 ocean_assert(averagePointsPerBin > 0);
1692 ocean_assert(maxHorizontalBins >= 1u);
1693 ocean_assert(maxVerticalBins >= 1u);
1697 return DistributionArray(left, top, width, height, horizontalBins, verticalBins);
1707 horizontalBins = min(maxHorizontalBins, max(1u, (
unsigned int)(
Numeric::sqrt(
sqr))));
1708 verticalBins = min(maxVerticalBins, max(1u, (
unsigned int)(
Scalar(horizontalBins) * height / width)));
1710 return distributeToArray(imagePoints, number, left, top, width, height, horizontalBins, verticalBins);
1715 return distributeAndFilter<ImagePoint, &SpatialDistribution::identity>(imagePoints, numberImagePoints, left, top, width, height, horizontalBins, verticalBins);
1718template <
typename TIndex>
1721 return distributeAndFilterIndices<ImagePoint, TIndex, &SpatialDistribution::identity>(imagePoints, numberImagePoints, left, top, width, height, horizontalBins, verticalBins);
1724template <
typename T, Vector2 (*tFunction)(const T&)>
1727 ocean_assert(elements || numberElements == 0);
1728 ocean_assert(width >= 0 && height >= 0);
1729 ocean_assert(horizontalBins >= 1u && verticalBins >= 1u);
1731 if (numberElements == 0)
1733 return std::vector<T>();
1736 OccupancyArray occupancyArray(left, top, width, height, horizontalBins, verticalBins);
1738 const size_t bins = occupancyArray.
bins();
1740 std::vector<T> result;
1741 result.reserve(bins);
1743 for (
size_t n = 0; n < numberElements && result.size() < bins; ++n)
1745 if (occupancyArray.
addPoint(tFunction(elements[n])))
1747 result.push_back(elements[n]);
1754template <
typename T, Vector2 (*tFunction)(const T&)>
1757 ocean_assert(elements !=
nullptr || numberElements == 0);
1758 ocean_assert(width >= 0 && height >= 0);
1759 ocean_assert(horizontalBins >= 1u && verticalBins >= 1u);
1760 ocean_assert(numberDesiredFilteredElements <= numberElements);
1762 if (numberElements == 0 || numberDesiredFilteredElements == 0)
1764 return std::vector<T>();
1767 OccupancyArray occupancyArray(left, top, width, height, horizontalBins, verticalBins);
1769 std::vector<unsigned char> usedElements(numberElements, 0u);
1771 const size_t bins = occupancyArray.
bins();
1773 std::vector<T> result;
1774 result.reserve(bins);
1776 unsigned int filterIteration = 0u;
1778 while (result.size() < numberDesiredFilteredElements && filterIteration < (
unsigned int)numberDesiredFilteredElements)
1780 for (
size_t n = 0; n < numberElements && result.size() < numberDesiredFilteredElements; ++n)
1782 if (usedElements[n] == 0u && occupancyArray.
addPointWithCounter(tFunction(elements[n]), filterIteration))
1784 result.push_back(elements[n]);
1785 usedElements[n] = 1u;
1794 for (
size_t n = 0; n < numberElements; ++n)
1798 indices->push_back(
Index32(n));
1806template <
typename T,
typename TIndex, Vector2 (*tFunction)(const T&)>
1809 ocean_assert(elements || numberElements == 0);
1810 ocean_assert(width >= 0 && height >= 0);
1811 ocean_assert(horizontalBins >= 1u && verticalBins >= 1u);
1813 if (numberElements == 0)
1815 return std::vector<TIndex>();
1820 OccupancyArray occupancyArray(left, top, width, height, horizontalBins, verticalBins);
1822 const size_t bins = occupancyArray.
bins();
1824 std::vector<TIndex> result;
1825 result.reserve(bins);
1827 for (
size_t n = 0; n < numberElements && result.size() < bins; ++n)
1829 if (occupancyArray.
addPoint(tFunction(elements[n])))
1831 result.push_back(TIndex(n));
1838template <
typename T>
This class implements a base class for data arrays.
Definition SpatialDistribution.h:37
unsigned int horizontalBins() const
Returns the number of horizontal distribution bins.
Definition SpatialDistribution.h:1078
Scalar width() const
Returns the width of the distribution area.
Definition SpatialDistribution.h:1068
int horizontalBin(const Scalar x) const
Returns the horizontal bin of a given horizontal position.
Definition SpatialDistribution.h:1104
int verticalBin(const Scalar y) const
Returns the vertical bin of a given vertical position.
Definition SpatialDistribution.h:1110
Scalar horizontalPoint2Bin_
Horizontal position to bin factor.
Definition SpatialDistribution.h:218
Array & operator=(const Array &object)
Assign operator.
Definition SpatialDistribution.h:1155
Scalar areaTop_
Top position of the distribution area.
Definition SpatialDistribution.h:203
Scalar top() const
Returns the top position of the distribution area.
Definition SpatialDistribution.h:1063
unsigned int verticalBins() const
Returns the number of vertical distribution bins.
Definition SpatialDistribution.h:1083
int clampedVerticalBin(const Scalar y) const
Returns the vertical bin of a given vertical position.
Definition SpatialDistribution.h:1122
Scalar areaLeft_
Left position of the distribution area.
Definition SpatialDistribution.h:200
Scalar areaHeight_
Height of the distribution area.
Definition SpatialDistribution.h:209
Array()=default
Creates an empty array object.
int clampedHorizontalBin(const Scalar x) const
Returns the horizontal bin of a given horizontal position.
Definition SpatialDistribution.h:1116
bool isValid() const
Returns whether this object holds a valid distribution.
Definition SpatialDistribution.h:1128
Scalar height() const
Returns the height of the distribution area.
Definition SpatialDistribution.h:1073
Scalar verticalPoint2Bin_
Vertical position to bin factor.
Definition SpatialDistribution.h:221
bool operator==(const Array &right) const
Returns whether two Array objects are identical.
Definition SpatialDistribution.h:1133
bool operator!=(const Array &right) const
Returns whether two Array objects are not identical.
Definition SpatialDistribution.h:1145
Scalar areaWidth_
Width of the distribution area.
Definition SpatialDistribution.h:206
unsigned int verticalBins_
Number of vertical distribution bins.
Definition SpatialDistribution.h:215
Array(const Array &object)=default
Copy constructor.
unsigned int horizontalBins_
Number of horizontal distribution bins.
Definition SpatialDistribution.h:212
Scalar left() const
Returns the left position of the distribution area.
Definition SpatialDistribution.h:1058
unsigned int index(const Scalar x, const Scalar y) const
Returns the bin index for a given position.
Definition SpatialDistribution.h:1093
unsigned int bins() const
Returns the number of bins this distribution holds.
Definition SpatialDistribution.h:1088
Definition of a class holding an index and a distance.
Definition SpatialDistribution.h:584
Scalar distance_
Distance value.
Definition SpatialDistribution.h:644
unsigned int candidateIndex() const
Returns the candidate index of this element.
Definition SpatialDistribution.h:1613
static bool compareLeftSmaller(const DistanceElement &left, const DistanceElement &right)
Compares two distance elements.
Definition SpatialDistribution.h:1623
unsigned int index() const
Returns the interest index of this element.
Definition SpatialDistribution.h:1608
static bool compareLeftHigher(const DistanceElement &left, const DistanceElement &right)
Compares two distance elements.
Definition SpatialDistribution.h:1628
DistanceElement(const unsigned int index, const unsigned int candidateIndex, const Scalar distance)
Creates a new distance element.
Definition SpatialDistribution.h:1600
bool operator<(const DistanceElement &element) const
Returns whether the left element holds a higher distance than the right one.
Definition SpatialDistribution.h:1633
Scalar distance() const
Returns the distance of this element.
Definition SpatialDistribution.h:1618
This class implements a distribution array.
Definition SpatialDistribution.h:228
DistributionArray()=default
Creates an empty distribution array object.
bool hasCopiedNeighborhood8() const
Returns whether this distribution array contains copies of indices within the 8-neighborhood of each ...
Definition SpatialDistribution.h:1214
DistributionArray & operator=(const DistributionArray &object)
Assign operator.
Definition SpatialDistribution.h:1247
bool hasCopiedNeighborhood8_
True, if the array contains copies of indices within the 8-neighborhood of each individual bin; False...
Definition SpatialDistribution.h:363
void clear()
Removes all elements form this array.
DistributionArray(const DistributionArray &object)=default
Copy constructor.
const Indices32 & operator()(const unsigned int horizontal, const unsigned int vertical) const
Returns the distribution indices of a specified bin.
Definition SpatialDistribution.h:1219
IndexGroups32 indexGroups_
Distribution array with point indices.
Definition SpatialDistribution.h:360
const Indices32 & operator[](const unsigned int index) const
Returns the distribution indices of a specified bin.
Definition SpatialDistribution.h:1235
DistributionArray(const DistributionArray &distributionArray, const bool copyNeighborhood8)
Copies a given distribution array and optional copies the indices from the 8-neighborhood of each ind...
bool operator!=(const DistributionArray &distributionArray) const
Returns whether two DistributionArray objects are not identical.
Definition SpatialDistribution.h:1280
bool operator==(const DistributionArray &distributionArray) const
Returns whether two DistributionArray objects are identical.
Definition SpatialDistribution.h:1270
void indicesNeighborhood9(const unsigned int horizontal, const unsigned int vertical, Indices32 &indices) const
Returns the indices of the 8-neighborhood and the specified bin itself.
Indices32 indicesNeighborhood9(const unsigned int horizontal, const unsigned int vertical) const
Returns the indices of the 8-neighborhood and the specified bin itself.
This class implements an occupancy array.
Definition SpatialDistribution.h:370
OccupancyArray & operator+=(const Vector2 &point)
Adds an image point to this occupancy array.
Definition SpatialDistribution.h:1504
bool operator!=(const OccupancyArray &occupancyArray) const
Returns whether two OccupancyArray objects are not identical.
Definition SpatialDistribution.h:1595
unsigned int freeBins() const
Returns the number of free bins.
Definition SpatialDistribution.h:1424
bool isNotOccupiedNeighborhood9(const unsigned int horizontal, const unsigned int vertical) const
Returns whether at least one bin in the 8-neighborhood or the specified bin itself is not occupied.
Definition SpatialDistribution.h:1368
OccupancyArray & operator-=(const Vector2 &point)
Removes an image point from this occupancy array.
Definition SpatialDistribution.h:1517
unsigned int occupiedBins() const
Returns the number of occupied bins.
Definition SpatialDistribution.h:1409
unsigned int countOccupiedNeighborhood9(const unsigned int horizontal, const unsigned int vertical) const
Returns the number of occupied bins in the 9-neighborhood (so the specified bin is included).
Definition SpatialDistribution.h:1306
OccupancyArray()=default
Creates an empty distribution array object.
OccupancyArray & operator=(const OccupancyArray &object)
Assign operator.
Definition SpatialDistribution.h:1566
bool isOccupiedNeighborhood9(const unsigned int horizontal, const unsigned int vertical) const
Returns whether at least one bin in the 8-neighborhood or the specified bin itself is occupied.
Definition SpatialDistribution.h:1327
void reset()
Resets all occupied bins so that all bins a free afterwards.
Definition SpatialDistribution.h:1496
bool removePoint(const Vector2 &point)
Removes an image point and returns whether the corresponding bin was occupied before.
Definition SpatialDistribution.h:1477
bool addPointWithCounter(const Vector2 &point, const unsigned int maximalOccupancyCounter)
Adds an image point and returns whether the occupancy counter of the corresponding bin was equal or b...
Definition SpatialDistribution.h:1458
bool addPoint(const Vector2 &point)
Adds an image point and returns whether the corresponding bin was not occupied before (was free befor...
Definition SpatialDistribution.h:1439
OccupancyArray(const OccupancyArray &object)=default
Copy constructor.
bool operator()(const unsigned int horizontal, const unsigned int vertical) const
Returns whether a specified bin is occupied.
Definition SpatialDistribution.h:1530
bool operator==(const OccupancyArray &occupancyArray) const
Returns whether two OccupancyArray objects are identical.
Definition SpatialDistribution.h:1585
Indices32 occupancy_
Occupancy array.
Definition SpatialDistribution.h:577
bool operator[](const unsigned int index) const
Returns whether a specified bin is occupied.
Definition SpatialDistribution.h:1554
This class implements spatial distribution function for 2D geometric data.
Definition SpatialDistribution.h:30
static void determineMinimalSqrDistances(const ImagePoint *imagePoints, const size_t numberImagePoints, const unsigned int width, const unsigned int height, const unsigned int bins, Scalar *sqrDistances)
Determines the minimal square distances for each given 2D image point to all other points in the same...
static Index32 determineNearestNeighbor(const ImagePoint &interestPoint, const ImagePoint *imagePoints, const size_t numberImagePoints, const Scalar radius, const DistributionArray &distributionImagePoints, Scalar *sqrDistance=nullptr)
Determines the nearest image point between an interest point and a set of given image point lying ins...
static DistributionArray distributeToArray(const ImagePoint *imagePoints, const size_t number, const Scalar left, const Scalar top, const Scalar width, const Scalar height, const unsigned int averagePointsPerBin, const unsigned int maxHorizontalBins, const unsigned int maxVerticalBins, unsigned int &horizontalBins, unsigned int &verticalBins)
Distributes the given 2D image points into a spatial array.
Definition SpatialDistribution.h:1685
static ImagePoints distributeAndFilter(const ImagePoint *imagePoints, const size_t numberImagePoints, const Scalar left, const Scalar top, const Scalar width, const Scalar height, const unsigned int horizontalBins, const unsigned int verticalBins, const size_t size)
Distributes the given image points into an array of specified size and returns as much points as requ...
static OccupancyArray createOccupancyArray(const ImagePoint *imagePoints, const size_t number, const Scalar left, const Scalar top, const Scalar width, const Scalar height, const unsigned int horizontalBins, const unsigned int verticalBins)
Distributes the given 2D image points into a spatial array.
static void idealBins(const unsigned int width, const unsigned int height, const size_t numberBins, unsigned int &horizontalBins, unsigned int &verticalBins, const unsigned int minimalHorizontalBins=2u, const unsigned int minimalVerticalBins=2u)
Calculates the ideal number of horizontal and vertical bins for an array if the overall number of bin...
std::vector< DistanceElement > DistanceElements
Definition of a vector holding distance elements.
Definition SpatialDistribution.h:650
static DistributionArray distributeToArray(const ImagePoint *imagePoints, const size_t number, const Scalar left, const Scalar top, const Scalar width, const Scalar height, const unsigned int horizontalBins, const unsigned int verticalBins)
Distributes a set of given 2D image points into a spatial array.
static Indices32 filterAccordingDistance(const ImagePoint *imagePoints, const size_t number, const unsigned int width, const unsigned int height, const Scalar distance)
Filters the given 2D image points according to their distance to neighboring image points.
static void determineMinimalSqrDistances(const ImagePoint *imagePoints, const size_t numberImagePoints, const ImagePoint *candidates, const size_t numberCandidates, const unsigned int width, const unsigned int height, const unsigned int bins, Scalar *sqrDistances)
Determines the minimal square distances for each given 2D image point to another given set of 2D imag...
static DistanceElements sortAccordingDistance(const ImagePoint *imagePoints, const size_t number, const unsigned int width, const unsigned int height, const unsigned int bins, const bool minimalDistanceFirst)
Sorts the given 2D image points according to their minimal distance to neighboring image points.
static std::vector< TIndex > distributeAndFilterIndices(const ImagePoint *imagePoints, const size_t numberImagePoints, const Scalar left, const Scalar top, const Scalar width, const Scalar height, const unsigned int horizontalBins, const unsigned int verticalBins)
Distributes the given image points into an array of specified size and returns (at most) one point in...
Definition SpatialDistribution.h:1719
static void determineMinimalSqrDistances(const ImagePoint *imagePoints, const size_t numberImagePoints, const ImagePoint *candidates, const size_t numberCandidates, const DistributionArray &distributionCandidates, Scalar *sqrDistances, unsigned int *candidateIndices=nullptr)
Determines the minimal square distances for each given image point to another given set of image poin...
static Scalar determineMinimalSqrDistance(const ImagePoint *imagePoints, const size_t numberImagePoints, const unsigned int index, const DistributionArray &distributionImagePoints)
Determines the minimal square distance for one given 2D image point to all other points in the same s...
static DistanceElements sortAccordingDistance(const ImagePoint *imagePoints, const size_t number, const bool minimalDistanceFirst)
Sorts the given 2D image points according to their minimal distance to neighboring image points.
static Indices32 determineNeighbors(const ImagePoint &imagePoint, const ImagePoint *candidatePoints, const size_t numberCandidatePoints, const Scalar radius, const DistributionArray &distributionCandidatePoints)
Determines all candidate points for a given image point (interest point) lying inside a specified cir...
static void idealBinsNeighborhood9(const unsigned int width, const unsigned int height, const Scalar distance, unsigned int &horizontalBins, unsigned int &verticalBins, const unsigned int minimalHorizontalBins=2u, const unsigned int minimalVerticalBins=2u, const unsigned int maximalHorizontalBins=20u, const unsigned int maximalVerticalBins=20u)
Calculates the ideal number of horizontal and vertical bins for an array if bin elements within a cer...
static T identity(const T &value)
This function simply returns the given object (actually a copy of the object).
Definition SpatialDistribution.h:1839
static ImagePoints distributeAndFilter(const ImagePoint *imagePoints, const size_t numberImagePoints, const Scalar left, const Scalar top, const Scalar width, const Scalar height, const unsigned int horizontalBins, const unsigned int verticalBins)
Distributes the given image points into an array of specified size and returns (at most) one point fr...
Definition SpatialDistribution.h:1713
static void filterCandidatePoint(const ImagePoint *imagePoints, const size_t numberImagePoints, const ImagePoint *candidatePoints, const size_t numberCandidatePoints, const unsigned int width, const unsigned int height, const Scalar filterDistance, const unsigned int filterSize, Indices32 *filteredIndices=nullptr, ImagePoints *filteredCandidates=nullptr)
Filters the given 2D candidate points according to the distance to the given image points.
static void determineMinimalSqrDistances(const ImagePoint *imagePoints, const size_t numberImagePoints, const unsigned int *interestIndices, const size_t numberInterestIndices, const unsigned int width, const unsigned int height, const unsigned int bins, Scalar *sqrDistances)
Determines the minimal square distances for each specified image point inside their neighborhood.
This class provides basic numeric functionalities.
Definition Numeric.h:57
static T sqrt(const T value)
Returns the square root of a given value.
Definition Numeric.h:1533
static constexpr T eps()
Returns a small epsilon.
static T floor(const T value)
Returns the largest integer value that is not greater than the given value.
Definition Numeric.h:2029
static T ceil(const T value)
Returns the smallest integer value that is not less than the given value.
Definition Numeric.h:1991
const T & x() const noexcept
Returns the x value.
Definition Vector2.h:710
const T & y() const noexcept
Returns the y value.
Definition Vector2.h:722
std::vector< Indices32 > IndexGroups32
Definition of a vector holding 32 bit indices, so we have groups of indices.
Definition Base.h:102
std::vector< Index32 > Indices32
Definition of a vector holding 32 bit index values.
Definition Base.h:96
unsigned int sqr(const char value)
Returns the square value of a given value.
Definition base/Utilities.h:1053
uint32_t Index32
Definition of a 32 bit index value.
Definition Base.h:84
std::vector< ImagePoint > ImagePoints
Definition of a vector holding 2D image points.
Definition geometry/Geometry.h:123
float Scalar
Definition of a scalar type.
Definition Math.h:129
The namespace covering the entire Ocean framework.
Definition Accessor.h:15