33 #include <visp3/core/vpRectOriented.h>
40 : m_center(), m_width(), m_height(), m_theta(), m_topLeft(), m_topRight(), m_bottomLeft(), m_bottomRight()
55 m_topLeft.
set_i(m_center.
get_i() - ((m_height * cos(m_theta)) / 2.0) - ((m_width * sin(m_theta)) / 2.0));
56 m_topLeft.
set_j((m_center.
get_j() + ((m_height * sin(m_theta)) / 2.0)) - ((m_width * cos(m_theta)) / 2.0));
57 m_bottomLeft.
set_i((m_center.
get_i() + ((m_height * cos(m_theta)) / 2.0)) - ((m_width * sin(m_theta)) / 2.0));
58 m_bottomLeft.
set_j(m_center.
get_j() - ((m_height * sin(m_theta)) / 2.0) - ((m_width * cos(m_theta)) / 2.0));
59 m_bottomRight.
set_i(m_center.
get_i() + ((m_height * cos(m_theta)) / 2.0) + ((m_width * sin(m_theta)) / 2.0));
60 m_bottomRight.
set_j((m_center.
get_j() - ((m_height * sin(m_theta)) / 2.0)) + ((m_width * cos(m_theta)) / 2.0));
61 m_topRight.
set_i((m_center.
get_i() - ((m_height * cos(m_theta)) / 2.0)) + ((m_width * sin(m_theta)) / 2.0));
62 m_topRight.
set_j(m_center.
get_j() + ((m_height * sin(m_theta)) / 2.0) + ((m_width * cos(m_theta)) / 2.0));
74 m_topLeft.
set_i(m_center.
get_i() - (m_height / 2.0));
75 m_topLeft.
set_j(m_center.
get_j() - (m_width / 2.0));
76 m_bottomLeft.
set_i(m_center.
get_i() + (m_height / 2.0));
77 m_bottomLeft.
set_j(m_center.
get_j() - (m_width / 2.0));
78 m_bottomRight.
set_i(m_center.
get_i() + (m_height / 2.0));
79 m_bottomRight.
set_j(m_center.
get_j() + (m_width / 2.0));
80 m_topRight.
set_i(m_center.
get_i() - (m_height / 2.0));
81 m_topRight.
set_j(m_center.
get_j() + (m_width / 2.0));
84 #if (VISP_CXX_STANDARD == VISP_CXX_STANDARD_98)
116 m_topLeft.
set_i(m_center.
get_i() - (m_height / 2.0));
117 m_topLeft.
set_j(m_center.
get_j() - (m_width / 2.0));
118 m_bottomLeft.
set_i(m_center.
get_i() + (m_height / 2.0));
119 m_bottomLeft.
set_j(m_center.
get_j() - (m_width / 2.0));
120 m_bottomRight.
set_i(m_center.
get_i() + (m_height / 2.0));
121 m_bottomRight.
set_j(m_center.
get_j() + (m_width / 2.0));
122 m_topRight.
set_i(m_center.
get_i() - (m_height / 2.0));
123 m_topRight.
set_j(m_center.
get_j() + (m_width / 2.0));
127 #if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
133 if (std::fabs(m_theta) > std::numeric_limits<double>::epsilon()) {
137 return vpRect(m_topLeft, m_bottomRight);
149 m_bottomLeft = bottomLeft;
150 m_bottomRight = bottomRight;
151 m_topRight = topRight;
154 m_width = sqrt(((m_topRight.
get_i() - m_topLeft.
get_i()) * (m_topRight.
get_i() - m_topLeft.
get_i())) +
156 m_height = sqrt(((m_bottomLeft.
get_i() - m_topLeft.
get_i()) * (m_bottomLeft.
get_i() - m_topLeft.
get_i())) +
158 m_theta = atan2(m_topRight.
get_i() - m_topLeft.
get_i(), m_topRight.
get_j() - m_topLeft.
get_j());
164 m_topLeft += center - m_center;
165 m_bottomLeft += center - m_center;
166 m_bottomRight += center - m_center;
167 m_topRight += center - m_center;
192 m_topLeft.
set_i(m_center.
get_i() - ((m_height * cos(m_theta)) / 2.0) - ((m_width * sin(m_theta)) / val_2));
193 m_topLeft.
set_j((m_center.
get_j() + ((m_height * sin(m_theta)) / 2.0)) - ((m_width * cos(m_theta)) / val_2));
194 m_bottomLeft.
set_i((m_center.
get_i() + ((m_height * cos(m_theta)) / 2.0)) - ((m_width * sin(m_theta)) / val_2));
195 m_bottomLeft.
set_j(m_center.
get_j() - ((m_height * sin(m_theta)) / 2.0) - ((m_width * cos(m_theta)) / val_2));
196 m_bottomRight.
set_i(m_center.
get_i() + ((m_height * cos(m_theta)) / 2.0) + ((m_width * sin(m_theta)) / val_2));
197 m_bottomRight.
set_j((m_center.
get_j() - ((m_height * sin(m_theta)) / 2.0)) + ((m_width * cos(m_theta)) / val_2));
198 m_topRight.
set_i((m_center.
get_i() - ((m_height * cos(m_theta)) / 2.0)) + ((m_width * sin(m_theta)) / val_2));
199 m_topRight.
set_j(m_center.
get_j() + ((m_height * sin(m_theta)) / 2.0) + ((m_width * cos(m_theta)) / val_2));
213 m_topLeft.
set_i(m_center.
get_i() - ((m_height * cos(m_theta)) / 2.0) - ((m_width * sin(m_theta)) / val_2));
214 m_topLeft.
set_j((m_center.
get_j() + ((m_height * sin(m_theta)) / 2.0)) - ((m_width * cos(m_theta)) / val_2));
215 m_bottomLeft.
set_i((m_center.
get_i() + ((m_height * cos(m_theta)) / 2.0)) - ((m_width * sin(m_theta)) / val_2));
216 m_bottomLeft.
set_j(m_center.
get_j() - ((m_height * sin(m_theta)) / 2.0) - ((m_width * cos(m_theta)) / val_2));
217 m_bottomRight.
set_i(m_center.
get_i() + ((m_height * cos(m_theta)) / 2.0) + ((m_width * sin(m_theta)) / val_2));
218 m_bottomRight.
set_j((m_center.
get_j() - ((m_height * sin(m_theta)) / 2.0)) + ((m_width * cos(m_theta)) / val_2));
219 m_topRight.
set_i((m_center.
get_i() - ((m_height * cos(m_theta)) / 2.0)) + ((m_width * sin(m_theta)) / val_2));
220 m_topRight.
set_j(m_center.
get_j() + ((m_height * sin(m_theta)) / 2.0) + ((m_width * cos(m_theta)) / val_2));
229 if (!isLeft(point, m_topLeft, m_bottomLeft)) {
232 if (!isLeft(point, m_bottomLeft, m_bottomRight)) {
235 if (!isLeft(point, m_bottomRight, m_topRight)) {
238 if (!isLeft(point, m_topRight, m_topLeft)) {
249 double c = -((a * point1.
get_i()) + (b * point1.
get_j()));
250 double d = (a * pointToTest.
get_i()) + (b * pointToTest.
get_j()) + c;
error that can be emitted by ViSP classes.
@ badValue
Used to indicate that a value is not in the allowed range.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
Defines an oriented rectangle in the plane.
double getHeight() const
Get the rectangle height.
vpImagePoint getBottomLeft() const
Get the bottom-left corner.
double getOrientation() const
Get the rectangle orientation (rad).
vpImagePoint getBottomRight() const
Get the bottom-right corner.
void setPoints(const vpImagePoint &topLeft, const vpImagePoint &topRight, const vpImagePoint &bottomLeft, const vpImagePoint &bottomRight)
void setCenter(const vpImagePoint ¢er)
Set the center of the rectangle.
vpRectOriented()
Default constructor.
double getWidth() const
Get the rectangle width.
bool isInside(const vpImagePoint &point) const
Check whether the point is inside the rectangle.
void setSize(double width, double height)
Set the size of the rectangle : performs a homothety relatively to the rectangle center.
vpImagePoint getTopRight() const
Get the top-right corner.
vpRectOriented & operator=(const vpRectOriented &)=default
vpImagePoint getTopLeft() const
Get the top-left corner.
vpImagePoint getCenter() const
Get the rectangle center point.
void setOrientation(double theta)
Set the rectangle orientation (rad).
Defines a rectangle in the plane.
void getCenter(double &x, double &y) const