求取多边形面积与周长
支持任意多边形,凹、凸皆可 多边形顶点输入时按顺时针顺序排列
面积法一:
struct Point2i
{
double x;
double y;
}
double cross1(Point2i pi, Point2i pj, Point2i pk)
{
return (pj.x - pi.x) * (pk.y - pi.y) - (pj.y - pi.y) * (pk.x - pi.x);
}
double polygon_area(vector<Point2i>& polygon)
{
double area = 0.0;
Point2i temp;
temp.x = 0;
temp.y = 0;
for (int i = 0; i < polygon.size(); i++)
{
area += cross1(temp, polygon.data()[(i)], polygon.data()[((i + 1) % polygon.size())]);
}
return fabs(area / 2);
}
面积法二:
double polygonarea(vector<Point2i>& polygon, int N)
{
int m, n;
double area = 0;
for (m = 0; m < N; m++) {
n = (m + 1) % N;
area += polygon[m].x * polygon[n].y;
area -= polygon[m].y * polygon[n].x;
}
area /= 2;
return(area < 0 ? -area : area);
}
求周长方法:
inline double calDis2_2(double x1, double y1, double x2, double y2)
{
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
double polygon_length(vector<Point2i>& polygon)
{
double len = 0;
Point2i pt1, pt2;
long npt = polygon.size();
for (int i = 0; i < npt; i++)
{
pt1 = polygon.at(i);
pt2 = polygon.at((i + 1) % npt);
len += calDis2_2(pt1.x, pt1.y, pt2.x, pt2.y);
}
return len;
}
opencv库中有求取周长与面积的函数,其输入与面积法一相同!
|