赞
踩
有需求需要对。多边形 获取中心点方法,绝大多数都是 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博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。