24 #ifndef __UTILS_MATH_POLYGON_H_ 25 #define __UTILS_MATH_POLYGON_H_ 28 #include <Eigen/StdVector> 36 typedef std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> >
Polygon2D;
47 if (p.size() < 3)
return 0.;
49 size_t j = p.size() - 1;
50 for (
size_t i = 0; i < p.size(); ++i) {
51 area += (p[j][0] + p[i][0]) * (p[j][1] - p[i][1]);
55 return fabsf(area)/2.;
75 const int nr_poly_points =
static_cast<int>(polygon.size());
76 float xold = polygon[nr_poly_points - 1][0];
77 float yold = polygon[nr_poly_points - 1][1];
78 for (
int i = 0; i < nr_poly_points; i++) {
79 float xnew = polygon[i][0];
80 float ynew = polygon[i][1];
93 if ( (xnew < point[0]) == (point[0] <= xold) &&
94 (point[1] - y1) * (x2 - x1) < (y2 - y1) * (point[0] - x1) )
103 float xnew = polygon[0][0];
104 float ynew = polygon[0][1];
117 if ( (xnew < point[0]) == (point[0] <= xold) &&
118 (point[1] - y1) * (x2 - x1) < (y2 - y1) * (point[0] - x1) )
135 Eigen::Vector2f centroid(0.,0.);
140 size_t j = p.size() - 1;
142 for (
size_t i = 0; i < p.size(); ++i) {
143 a = p[j][0]*+p[i][1] - p[i][0]*p[j][1];
145 centroid[0] += (p[j][0] + p[i][0]) * a;
146 centroid[1] += (p[j][1] + p[i][1]) * a;
151 centroid[0] /= (6.0 * area);
152 centroid[1] /= (6.0 * area);
Fawkes library namespace.
float polygon_area(const Polygon2D &p)
Calculate area of a polygon.
std::vector< Eigen::Vector2f, Eigen::aligned_allocator< Eigen::Vector2f > > Polygon2D
Polygon as a vector of 2D points.
bool polygon_contains(const Polygon2D &polygon, const Eigen::Vector2f &point)
Check if given point lies inside the polygon.
Eigen::Vector2f polygon_centroid(const Polygon2D &p)
Calculate centroid of polygon.