ViSP  2.8.0
vpPolygon Class Reference

#include <vpPolygon.h>

Public Member Functions

 vpPolygon ()
 
 vpPolygon (const std::vector< vpImagePoint > &corners)
 
 vpPolygon (const vpPolygon &poly)
 
virtual ~vpPolygon ()
 
vpPolygonoperator= (const vpPolygon &poly)
 
void buildFrom (const std::vector< vpImagePoint > &corners)
 
void buildFrom (const std::vector< vpPoint > &corners, const vpCameraParameters &cam)
 
void initClick (const vpImage< unsigned char > &I)
 
bool isInside (const vpImagePoint &iP)
 
void display (const vpImage< unsigned char > &I, const vpColor &color, unsigned int thickness=1)
 
const std::vector< vpImagePoint > & getCorners () const
 
double getArea () const
 
vpImagePoint getCenter () const
 
vpRect getBoundingBox () const
 

Protected Member Functions

void init (const std::vector< vpImagePoint > &corners)
 
void updateArea ()
 
void updateCenter ()
 
void updateBoundingBox ()
 

Protected Attributes

std::vector< vpImagePoint_corners
 
vpImagePoint _center
 
double _area
 
bool _goodPoly
 
vpRect _bbox
 

Detailed Description

Defines a generic 2D polygon.

A polygon is internally represented by N 2D points.

By default three coordinates in the $ (i,j) $ frame (see vpImagePoint class documentation for more details about the frame) are used $ (0,0) $, $ (1,0) $ and $ (0,1) $.

The code bellow shows how to manipulate a polygon.

#include <iostream>
#include <visp/vpPolygon.h>
int main()
{
std::vector<vpImagePoint> corners;
// Initialize the corners vector with 4 points
corners.push_back( vpImagePoint( 50, 100) );
corners.push_back( vpImagePoint( 50, 300) );
corners.push_back( vpImagePoint(200, 300) );
corners.push_back( vpImagePoint(200, 100) );
// Initialize a polygon with the corners
vpPolygon polygon(corners);
// Get the polygon bounding box
vpRect bbox = polygon.getBoundingBox();
std::cout << "Bounding box: " << bbox.getTopLeft() << " to " << bbox.getBottomRight() << std::endl;
// Get the polygon surface and center
std::cout << "Area: " << polygon.getArea() << std::endl;
std::cout << "Center: " << polygon.getCenter() << std::endl;
// Check if a point is inside the polygon
vpImagePoint ip(550, 200);
std::cout << "The point " << ip << " is " << (polygon.isInside(ip) ? "inside":"outside") << " the polygon" << std::endl;
return 0;
}

Definition at line 102 of file vpPolygon.h.

Constructor & Destructor Documentation

vpPolygon::vpPolygon ( )

Basic constructor.

By default, it defines a triangle with the three 2D points coordinates : $ (0,0) $, $ (1,0) $ and $ (0,1) $.

Definition at line 59 of file vpPolygon.cpp.

References _goodPoly, and init().

vpPolygon::vpPolygon ( const std::vector< vpImagePoint > &  corners)

Constructor which initialise the polygon thanks to the given corners.

Warning
the corners must be ordered (either clockwise or counter clockwise).
Parameters
corners: The Points defining the corners.

Definition at line 76 of file vpPolygon.cpp.

References _goodPoly, and init().

vpPolygon::vpPolygon ( const vpPolygon poly)

Copy constructor

Parameters
poly: The polygon used for the initialisation.

Definition at line 89 of file vpPolygon.cpp.

References _area, _center, _corners, and _goodPoly.

vpPolygon::~vpPolygon ( )
virtual

Basic destructor

Definition at line 100 of file vpPolygon.cpp.

Member Function Documentation

void vpPolygon::buildFrom ( const std::vector< vpImagePoint > &  corners)

Initialise the triangle thanks to the collection of 2D points (in pixel).

Warning
the corners must be ordered (either clockwise or counter clockwise).
Parameters
corners: The corners of the polyon.

Definition at line 127 of file vpPolygon.cpp.

References init().

Referenced by buildFrom(), and initClick().

void vpPolygon::buildFrom ( const std::vector< vpPoint > &  corners,
const vpCameraParameters cam 
)

Initialise the triangle thanks to the collection of 2D points (in meter). The fields x and y are used to compute the corresponding coordinates in pixel thanks to the camera parameters cam.

Warning
the corners must be ordered (either clockwise or counter clockwise).
Parameters
corners: The corners of the polyon.
cam: The camera parameters used to convert the coordinates from meter to pixel.

Definition at line 144 of file vpPolygon.cpp.

References buildFrom(), and vpMeterPixelConversion::convertPoint().

void vpPolygon::display ( const vpImage< unsigned char > &  I,
const vpColor color,
unsigned int  thickness = 1 
)

Display the polygon in the image (overlay, so the image is not modified). A call to the flush() method is necessary.

Parameters
I: The image where is displayed the polygon.
color: The color of the lines of the polygon.
thickness: The thickness of the lines used to display the polygon.

Definition at line 403 of file vpPolygon.cpp.

References _corners, and vpDisplay::displayLine().

double vpPolygon::getArea ( ) const
inline

Return the area of the polygon. The area is computed when the polygon is built from the corners.

Returns
The area of the polygon.

Definition at line 148 of file vpPolygon.h.

vpRect vpPolygon::getBoundingBox ( ) const
inline

Return the bounding box. The bounding box is the smallest rectangle containing all the polygon.

Returns
The bounding box of the polygon.

Definition at line 168 of file vpPolygon.h.

vpImagePoint vpPolygon::getCenter ( ) const
inline

Return the center of the polygon. The center is computed when the polygon is built from the corners.

Returns
The area of the polygon.

Definition at line 158 of file vpPolygon.h.

const std::vector<vpImagePoint>& vpPolygon::getCorners ( ) const
inline

Get the corners of the polygon.

Returns
A reference to the corners.

Definition at line 137 of file vpPolygon.h.

void vpPolygon::init ( const std::vector< vpImagePoint > &  corners)
protected

Intialise the polygon using the collection of image points. This method compute come internal variables such as center, area, ...

Warning
the corners must be ordered (either clockwise or counter clockwise).
Parameters
corners: The corners of the polyon.

Definition at line 189 of file vpPolygon.cpp.

References _corners, updateArea(), updateBoundingBox(), and updateCenter().

Referenced by buildFrom(), and vpPolygon().

void vpPolygon::initClick ( const vpImage< unsigned char > &  I)

Initialise the polygon by (left-)clicking to add a corners to the polygon. A right click is used to stop the addition of new corner.

Parameters
I: The image where to click to initialise the corners.

Definition at line 160 of file vpPolygon.cpp.

References buildFrom(), vpMouseButton::button1, vpDisplay::displayCross(), vpDisplay::flush(), vpDisplay::getClick(), and vpColor::red.

bool vpPolygon::isInside ( const vpImagePoint ip)

Check if the 2D point $ iP $ is inside the polygon.

Parameters
ip: The point which have to be tested.
Returns
Returns true if the point is inside the triangle, false otherwise.

Definition at line 247 of file vpPolygon.cpp.

References _corners, vpImagePoint::get_i(), vpImagePoint::get_j(), vpImagePoint::set_i(), and vpImagePoint::set_j().

vpPolygon & vpPolygon::operator= ( const vpPolygon poly)

Equal operator.

Assign poly to this polygon and return a reference to it.

Definition at line 110 of file vpPolygon.cpp.

References _area, _center, _corners, and _goodPoly.

void vpPolygon::updateArea ( )
protected

Update the _area attribute of the polygon using the corners.

The area is computed using the formula:

\[ A = \frac{1}{2} \sum_{i=0}^{n-1} (x_1 y_{i+1} - x_{i+1} y_{i}) \]

Definition at line 291 of file vpPolygon.cpp.

References _area, _corners, and _goodPoly.

Referenced by init().

void vpPolygon::updateBoundingBox ( )
protected

Definition at line 365 of file vpPolygon.cpp.

References _bbox, _corners, _goodPoly, vpRect::setBottomRight(), and vpRect::setTopLeft().

Referenced by init().

void vpPolygon::updateCenter ( )
protected

Update the _center attribute of the polygon using the corners.

The i coordinates is computed using:

\[ i = \frac{1}{6{area}} \sum_{i=0}^{n-1} (i_i + i_{i+1})(i_{i+1} j_i - j_{i+1} i_i) \]

The computation of the j coordinate is similar.

Definition at line 325 of file vpPolygon.cpp.

References _area, _center, _corners, _goodPoly, vpImagePoint::set_i(), and vpImagePoint::set_j().

Referenced by init().

Member Data Documentation

double vpPolygon::_area
protected

Area of the polygon.

Definition at line 110 of file vpPolygon.h.

Referenced by operator=(), updateArea(), updateCenter(), and vpPolygon().

vpRect vpPolygon::_bbox
protected

Boumding box containing the polygon.

Definition at line 114 of file vpPolygon.h.

Referenced by updateBoundingBox().

vpImagePoint vpPolygon::_center
protected

Center of the polygon. It is automatically computed when the corners are set.

Definition at line 108 of file vpPolygon.h.

Referenced by operator=(), updateCenter(), and vpPolygon().

std::vector<vpImagePoint> vpPolygon::_corners
protected

Collection of image points containing the corners.

Definition at line 106 of file vpPolygon.h.

Referenced by display(), init(), isInside(), operator=(), updateArea(), updateBoundingBox(), updateCenter(), and vpPolygon().

bool vpPolygon::_goodPoly
protected

Flag to indicate whether the polygon is a good polygon (ie. it has more than two corners, ...)

Definition at line 112 of file vpPolygon.h.

Referenced by operator=(), updateArea(), updateBoundingBox(), updateCenter(), and vpPolygon().