8#ifndef META_OCEAN_CV_PIXEL_POSITION_H
9#define META_OCEAN_CV_PIXEL_POSITION_H
25template <
typename T>
class PixelPositionT;
250 inline T
index(
const unsigned int width)
const;
339 explicit inline operator bool()
const;
411 template <
typename TTarget>
489 static_assert(
sizeof(T) <=
sizeof(
int),
"Invalid template type T");
491 const int xd = int(x_) - int(position.
x_);
492 const int yd = int(y_) - int(position.
y_);
494 return xd * xd + yd * yd;
512 switch (pixelDirection)
540 ocean_assert(
false &&
"Invalid pixel direction!");
614 return x_ != (uint32_t)(-1) && y_ != (uint32_t)(-1);
620 return x_ != (uint64_t)(-1) && y_ != (uint64_t)(-1);
638 ocean_assert(isValid());
640 const T differenceX = x_ - position.
x_;
641 const T differenceY = y_ - position.
y_;
643 return (differenceX == T(1) || differenceX == T(0) || differenceX == T(-1))
644 && (differenceY == T(1) || differenceY == T(0) || differenceY == T(-1));
650 ocean_assert(isValid());
652 const T differenceX = x_ - position.
x_;
653 const T differenceY = y_ - position.
y_;
655 return (differenceX == T(0) && (differenceY == T(1) || differenceY == T(-1)))
656 || (differenceY == T(0) && (differenceX == T(1) || differenceX == T(-1)));
662 ocean_assert(isValid());
664 const T differenceX = x_ - position.
x_;
665 const T differenceY = y_ - position.
y_;
667 return (differenceX != T(0) || differenceY != T(0))
668 && (differenceX == T(1) || differenceX == T(0) || differenceX == T(-1))
669 && (differenceY == T(1) || differenceY == T(0) || differenceY == T(-1));
675 ocean_assert(isValid());
676 return y_ * T(width) + x_;
682 if (
this == &position)
696 ocean_assert(isValid() && position.
isValid());
704 ocean_assert(isValid() && position.
isValid());
714 ocean_assert(isValid() && position.
isValid());
722 ocean_assert(isValid() && position.
isValid());
732 ocean_assert(isValid());
740 ocean_assert(isValid());
751 ocean_assert(isValid());
752 ocean_assert(factor != T(0));
760 ocean_assert(isValid());
761 ocean_assert(factor != T(0));
772 return (y_ < position.
y_) || (y_ == position.
y_ && x_ < position.
x_);
778 return x_ == position.
x_ && y_ == position.
y_;
784 return !(*
this == position);
796 size_t seed = std::hash<T>{}(pixelPosition.
x());
797 seed ^= std::hash<T>{}(pixelPosition.
y()) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
808 const unsigned int parameter = (0x0000FFFFu & (pixel1.
x() - pixel0.
x())) | ((pixel1.
y() - pixel0.
y()) << 16u);
817 ocean_assert(pixel0.
north() == pixel1);
822 ocean_assert(pixel0.
northWest() == pixel1);
827 ocean_assert(pixel0.
west() == pixel1);
832 ocean_assert(pixel0.
southWest() == pixel1);
837 ocean_assert(pixel0.
south() == pixel1);
842 ocean_assert(pixel0.
southEast() == pixel1);
847 ocean_assert(pixel0.
east() == pixel1);
852 ocean_assert(pixel0.
northEast() == pixel1);
856 ocean_assert(
false &&
"Invalid direction");
866 const unsigned int parameter = (0x0000FFFFu & (pixel1.
x() - pixel0.
x())) | ((pixel1.
y() - pixel0.
y()) << 16u);
877 ocean_assert(pixel0.
north() == pixel1 || pixel0.
south() == pixel1);
884 ocean_assert(pixel0.
west() == pixel1 || pixel0.
east() == pixel1);
885 return RPD_HORIZONTAL;
899 ocean_assert(
false &&
"Invalid direction");
906 ocean_assert(pixelPosition.
isValid());
914 result.reserve(pixelPositions.size());
916 for (
typename std::vector<
PixelPositionT<T>>::const_iterator i = pixelPositions.begin(); i != pixelPositions.end(); ++i)
918 ocean_assert(i->isValid());
946 std::vector<PixelPositionT<T>> result;
947 result.reserve(values.size());
949 for (Vectors2::const_iterator i = values.begin(); i != values.end(); ++i)
951 result.push_back(vector2pixelPosition(*i));
960 static_assert(
sizeof(T) <=
sizeof(
int),
"Invalid template type T");
962 std::vector<PixelPositionT<T>> result;
963 result.reserve(values.size());
965 for (Vectors2::const_iterator i = values.begin(); i != values.end(); ++i)
967 result.emplace_back(T(
minmax(0,
int(i->x() +
Scalar(0.5)),
int(width - 1))), T(
minmax(0,
int(i->y() +
Scalar(0.5)),
int(height - 1u))));
974template <
typename TTarget>
977 std::vector<PixelPositionT<TTarget>> result;
978 result.reserve(pixelPositions.size());
980 for (
typename std::vector<
PixelPositionT<T>>::const_iterator i = pixelPositions.begin(); i != pixelPositions.end(); ++i)
982 result.emplace_back(TTarget(i->x()), TTarget(i->y()));
991 stream <<
"[" << pixelPosition.
x() <<
", " << pixelPosition.
y() <<
"]";
996template <
bool tActive,
typename T>
999 return messageObject <<
"[" << pixelPosition.x() <<
", " << pixelPosition.y() <<
"]";
1002template <
bool tActive,
typename T>
1003MessageObject<tActive>&
operator<<(MessageObject<tActive>&& messageObject,
const PixelPositionT<T>& pixelPosition)
1005 return messageObject <<
"[" << pixelPosition.x() <<
", " << pixelPosition.y() <<
"]";
T & x()
Returns the horizontal coordinate position of this object.
Definition PixelPosition.h:462
PixelPositionT< T > west() const
Returns the pixel position west to this position.
Definition PixelPosition.h:558
PixelPositionT< T > operator/(const T factor) const
Divides this pixel position by a scalar and returns the new resulting position.
Definition PixelPosition.h:749
static Vectors2 pixelPositions2vectors(const std::vector< PixelPositionT< T > > &pixelPositions)
Converts several pixel positions to 2D vectors.
Definition PixelPosition.h:911
PixelPositionT(const T &x, const T &y)
Creates a new coordinate object by two given coordinate values.
Definition PixelPosition.h:448
bool operator<(const PixelPositionT< T > &position) const
Compares two pixel position objects.
Definition PixelPosition.h:770
PixelPositionT(const PixelPositionT< T > &position)
Copy constructor.
Definition PixelPosition.h:440
PixelPositionT< T > & operator*=(const T factor)
Multiplies this pixel position by a scalar.
Definition PixelPosition.h:738
static PixelPositionT< T > vector2pixelPosition(const Vector2 &value)
Converts a 2D vector into a pixel position.
T x_
Horizontal coordinate value of this object, in pixel.
Definition PixelPosition.h:417
T index(const unsigned int width) const
Returns the index of this position inside a frame with given width.
Definition PixelPosition.h:673
PixelPositionT< T > & operator/=(const T factor)
Divides this pixel position by a scalar.
Definition PixelPosition.h:758
static std::vector< PixelPositionT< T > > vectors2pixelPositions(const Vectors2 &values, const unsigned int width, const unsigned int height)
Converts several 2D vectors into pixel positions.
Definition PixelPosition.h:958
PixelPositionT< T > & operator+=(const PixelPositionT< T > &position)
Add a second pixel position to this position object.
Definition PixelPosition.h:702
PixelPositionT< T > southWest() const
Returns the pixel position south west to this position.
Definition PixelPosition.h:564
bool inArea9(const PixelPositionT< T > &position) const
Returns whether this pixel position is equal to a second pixel position or is the direct neighbor in ...
Definition PixelPosition.h:636
PixelPositionT< T > operator+(const PixelPositionT< T > &position) const
Adds two pixel positions and returns the result as a new pixel position object.
Definition PixelPosition.h:694
T & y()
Returns the vertical coordinate position of this object.
Definition PixelPosition.h:474
static Vector2 pixelPosition2vector(const PixelPositionT< T > &pixelPosition)
Converts a pixel position into a 2D vector.
Definition PixelPosition.h:904
bool isNeighbor8(const PixelPositionT< T > &position) const
Returns whether this pixel position is the direct neighbor to a second pixel position in an 8-neighbo...
Definition PixelPosition.h:660
T y_
Vertical coordinate value of this object, in pixel.
Definition PixelPosition.h:420
static std::vector< PixelPositionT< TTarget > > pixelPositions2pixelPositions(const std::vector< PixelPositionT< T > > &pixelPositions)
Converts pixels positions with a data type T to pixel positions with another data type.
Definition PixelPosition.h:975
PixelPositionT< T > north() const
Returns the pixel position north to this position.
Definition PixelPosition.h:546
Vector2 vector() const
Returns a sub-pixel accuracy vector of this pixel position.
Definition PixelPosition.h:606
bool isValid() const
Returns whether this pixel position object holds two valid parameters.
CV::PixelPositionT< T > neighbor(const CV::PixelDirection pixelDirection) const
Returns the position of the pixel neighbor to this position.
Definition PixelPosition.h:498
PixelPositionT< T > operator*(const T factor) const
Multiplies this pixel position by a scalar and returns the new resulting position.
Definition PixelPosition.h:730
PixelPositionT()
Creates an invalid pixel position object with invalid coordinates.
Definition PixelPosition.h:432
PixelPositionT< T > east() const
Returns the pixel position east to this position.
Definition PixelPosition.h:582
T y() const
Returns the vertical coordinate position of this object.
Definition PixelPosition.h:468
static RoughPixelDirection roughDirection(const PixelPositionT< T > &pixel0, const PixelPositionT< T > &pixel1)
Returns the rough pixel direction of two successive pixels in a dense contour.
Definition PixelPosition.h:861
bool isNeighbor4(const PixelPositionT< T > &position) const
Returns whether this pixel position is the direct neighbor to a second pixel position in an 4-neighbo...
Definition PixelPosition.h:648
void setPosition(const T &x, const T &y)
Sets the two coordinate values of this object.
Definition PixelPosition.h:480
PixelPositionT< T > & operator=(const PixelPositionT< T > &position)
Copy assignment operator.
Definition PixelPosition.h:680
size_t operator()(const PixelPositionT< T > &pixelPosition) const
Hash function.
Definition PixelPosition.h:794
PixelPositionT< T > southEast() const
Returns the pixel position south east to this position.
Definition PixelPosition.h:576
unsigned int sqrDistance(const PixelPositionT< T > &position) const
Returns the square difference between two pixel positions.
Definition PixelPosition.h:487
bool operator==(const PixelPositionT< T > &position) const
Returns whether two pixel position objects are equal.
Definition PixelPosition.h:776
PixelPositionT< T > & operator-=(const PixelPositionT< T > &position)
Subtracts a second pixel position from this position object.
Definition PixelPosition.h:720
T x() const
Returns the horizontal coordinate position of this object.
Definition PixelPosition.h:456
PixelPositionT< T > northWest() const
Returns the pixel position north west to this position.
Definition PixelPosition.h:552
RoughPixelDirection
Definition of individual rough directions.
Definition PixelPosition.h:70
@ RPD_DIAGONAL
Vertical direction.
Definition PixelPosition.h:78
@ RPD_INVALID
Invalid direction.
Definition PixelPosition.h:72
@ RPD_HORIZONTAL
Horizontal direction.
Definition PixelPosition.h:76
@ RPD_VERTICAL
Vertical direction.
Definition PixelPosition.h:74
PixelPositionT< T > operator-(const PixelPositionT< T > &position) const
Subtracts two pixel positions and returns the result as a new pixel position object.
Definition PixelPosition.h:712
static std::vector< PixelPositionT< T > > vectors2pixelPositions(const Vectors2 &values)
Converts several 2D vectors into pixel positions.
Definition PixelPosition.h:944
PixelPositionT< T > south() const
Returns the pixel position south to this position.
Definition PixelPosition.h:570
PixelPositionT< T > northEast() const
Returns the pixel position north east to this position.
Definition PixelPosition.h:588
PixelPositionT< T > half() const
Returns this position divided by two.
Definition PixelPosition.h:594
bool operator!=(const PixelPositionT< T > &position) const
Returns whether two pixel position objects are not equal.
Definition PixelPosition.h:782
PixelPositionT< T > twice() const
Returns this position multiplied by two.
Definition PixelPosition.h:600
static PixelDirection direction(const PixelPositionT< T > &pixel0, const PixelPositionT< T > &pixel1)
Returns the pixel direction of two successive pixels in a dense contour.
Definition PixelPosition.h:803
Messenger object, one object for each message.
Definition Messenger.h:427
This class provides basic numeric functionalities.
Definition Numeric.h:57
static constexpr T minValue()
Returns the min scalar value.
Definition Numeric.h:3253
static constexpr int32_t round32(const T value)
Returns the rounded 32 bit integer value of a given value.
Definition Numeric.h:2067
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
T minmax(const T &lowerBoundary, const T &value, const T &upperBoundary)
This function fits a given parameter into a specified value range.
Definition base/Utilities.h:927
std::vector< PixelPositionI > PixelPositionsI
Definition of a vector holding pixel positions (with positive and negative coordinate values).
Definition PixelPosition.h:53
std::vector< PixelPosition > PixelPositions
Definition of a vector holding pixel positions (with positive coordinate values).
Definition PixelPosition.h:46
PixelDirection
Definition of individual directions with pixel accuracy.
Definition CV.h:85
@ PD_WEST
Definition CV.h:93
@ PD_NORTH_EAST
Definition CV.h:103
@ PD_NORTH_WEST
Definition CV.h:91
@ PD_EAST
Definition CV.h:101
@ PD_SOUTH_WEST
Definition CV.h:95
@ PD_SOUTH
Definition CV.h:97
@ PD_SOUTH_EAST
Definition CV.h:99
@ PD_INVALID
Definition CV.h:87
@ PD_NORTH
Definition CV.h:89
float Scalar
Definition of a scalar type.
Definition Math.h:129
std::vector< Vector2 > Vectors2
Definition of a vector holding Vector2 objects.
Definition Vector2.h:64
VectorT2< Scalar > Vector2
Definition of a 2D vector.
Definition Vector2.h:28
std::ostream & operator<<(std::ostream &stream, const PixelPositionT< T > &pixelPosition)
Definition PixelPosition.h:989
The namespace covering the entire Ocean framework.
Definition Accessor.h:15