有需求需要对。多边形 获取中心点方法,绝大多数都是 puthon和java版本。立体几何学中的知识。
封装函数
point ##########::getCenterOfGravity(std::vector<point> polygon) {
if (polygon.size() <= 2)return point();
auto Area = [](point p0, point p1, point p2) {
double area = 0.;
area = p0.x * p1.y + p1.x * p2.y +
p2.x * p0.y - p1.x * p0.y -
p2.x * p1.y - p0.x * p2.y;
return area / 2;
};
point p0 = polygon[0];
point p1 = polygon[1];
point p2;
double sumarea = 0, sumx = 0, sumy = 0;
for (int i = 2; i < polygon.size(); i++)
{
p2 = polygon[i];
double area = Area(p0, p1, p2);//求三角形的面积
sumarea += area;
sumx += (p0.x + p1.x + p2.x) * area; //求∑cx[i] * s[i]和∑cy[i] * s[i]
sumy += (p0.y + p1.y + p2.y) * area;
p1 = p2;//求总面积
}
point barycenter;
barycenter.x = sumx / sumarea / 3;
barycenter.y = sumy / sumarea / 3;
return barycenter;
}
业务使用
std::vector<point> polygonDataList;
for (int n = 0; n < data.size(); n++)
{
point pointData;
double lng = data.at(n).toArray().at(0).toDouble();
double lat = data.at(n).toArray().at(1).toDouble();
pointData.x = lng;
pointData.y = lat;
polygonDataList.push_back(pointData);
lineString += QString::number(lng) + " " + QString::number(lat) + ",";
}
QString strTmp = lineString.remove(lineString.size() - 1, 1);
lineStringData = "POLYGON ((" + strTmp + "))";
qlistData.append(lineStringData);
m_polygonDataArrayList.append(polygonDataList);
定义
typedef struct point {
double x = 0.;
double y = 0.;
}point;
/**
* @breif : 计算中心点函数
* @param : QList
* @return : void
* @date : 2024/05/11 17:24
*/
point getCenterOfGravity(std::vector<point> polygon);
// 中心坐标数据
std::vector<point> m_polygonDataList;
QList<std::vector<point>> m_polygonDataArrayList;
取中点测试 情况
// 方案一, 中心点 不准确
//point data = getCenterOfGravity(pointData);
// 方案二, 取数据的中心点
int middleInt = (int)ceil(pointData.size() / 2);
//qDebug() << "middleInt" << middleInt;
point data = pointData.at(middleInt);
polygonDataList.push_back(data);
测试总结,其实 使用 数组取中间点,是面的中心点,如果是线的中心点,直接 数组的中间值,就是 线的中心点。
参考网址
【C++】计算多边形的重心_求不规则区域中心点(重心)的c++算法-CSDN博客
【中心】不规则多边形中心、形心、外接矩形中心计算方法_polygon 计算中心-CSDN博客