转自:[几何]计算不规则多边形的面积、中心、重心

最近项目用到:在不规则多边形的中心点加一个图标。(e.g: xx地区发生暴雪,暴雪区域是多边形,给多边形中心加一个暴雪的图标)

之前的设计是,计算不规则多边形范围矩形bounds的中心点。这个比较简单,对于一些圆,矩形,凸多边形都比较适合。但是遇到凹多边形就会出现问题,比如一个月牙型的不规则多边形,bounds的中心点,就落到月牙外了。就有点难以接受了。

经过讨论,决定将中心改为重心。

下面上代码,

计算不规则多边形的中心:

  1. public static final double MIN_LAT = -90;
  2. public static final double MAX_LAT = 90;
  3. public static final double MIN_LNG = -180;
  4. public static final double MAX_LNG = 180;
  5. /**
  6. * 获取不规则多边形几何中心点
  7. *
  8. * @param mPoints
  9. * @return
  10. */
  11. public static LatLng getCenterPoint(List<LatLng> mPoints) {
  12. // 1 自己计算
  13. // double latitude = (getMinLatitude(mPoints) + getMaxLatitude(mPoints)) / 2;
  14. // double longitude = (getMinLongitude(mPoints) + getMaxLongitude(mPoints)) / 2;
  15. // return new LatLng(latitude, longitude);
  16. // 2 使用Google map API提供的方法(推荐)
  17. LatLngBounds.Builder boundsBuilder = LatLngBounds.builder();
  18. for (LatLng ll : mPoints)
  19. boundsBuilder.include(ll);
  20. return boundsBuilder.build().getCenter();
  21. }
  22. // 经度最小值
  23. public static double getMinLongitude(List<LatLng> mPoints) {
  24. double minLongitude = MAX_LNG;
  25. if (mPoints.size() > 0) {
  26. minLongitude = mPoints.get(0).longitude;
  27. for (LatLng latlng : mPoints) {
  28. // 经度最小值
  29. if (latlng.longitude < minLongitude)
  30. minLongitude = latlng.longitude;
  31. }
  32. }
  33. return minLongitude;
  34. }
  35. // 经度最大值
  36. public static double getMaxLongitude(List<LatLng> mPoints) {
  37. double maxLongitude = MIN_LNG;
  38. if (mPoints.size() > 0) {
  39. maxLongitude = mPoints.get(0).longitude;
  40. for (LatLng latlng : mPoints) {
  41. // 经度最大值
  42. if (latlng.longitude > maxLongitude)
  43. maxLongitude = latlng.longitude;
  44. }
  45. }
  46. return maxLongitude;
  47. }
  48. // 纬度最小值
  49. public static double getMinLatitude(List<LatLng> mPoints) {
  50. double minLatitude = MAX_LAT;
  51. if (mPoints.size() > 0) {
  52. minLatitude = mPoints.get(0).latitude;
  53. for (LatLng latlng : mPoints) {
  54. // 纬度最小值
  55. if (latlng.latitude < minLatitude)
  56. minLatitude = latlng.latitude;
  57. }
  58. }
  59. return minLatitude;
  60. }
  61. // 纬度最大值
  62. public static double getMaxLatitude(List<LatLng> mPoints) {
  63. double maxLatitude = MIN_LAT;
  64. if (mPoints.size() > 0) {
  65. maxLatitude = mPoints.get(0).latitude;
  66. for (LatLng latlng : mPoints) {
  67. // 纬度最大值
  68. if (latlng.latitude > maxLatitude)
  69. maxLatitude = latlng.latitude;
  70. }
  71. }
  72. return maxLatitude;
  73. }

计算不规则多边形的重心:

  1. /**
  2. * 获取不规则多边形重心点
  3. *
  4. * @param mPoints
  5. * @return
  6. */
  7. public static LatLng getCenterOfGravityPoint(List<LatLng> mPoints) {
  8. double area = 0.0;//多边形面积
  9. double Gx = 0.0, Gy = 0.0;// 重心的x、y
  10. for (int i = 1; i <= mPoints.size(); i++) {
  11. double iLat = mPoints.get(i % mPoints.size()).latitude;
  12. double iLng = mPoints.get(i % mPoints.size()).longitude;
  13. double nextLat = mPoints.get(i - 1).latitude;
  14. double nextLng = mPoints.get(i - 1).longitude;
  15. double temp = (iLat * nextLng - iLng * nextLat) / 2.0;
  16. area += temp;
  17. Gx += temp * (iLat + nextLat) / 3.0;
  18. Gy += temp * (iLng + nextLng) / 3.0;
  19. }
  20. Gx = Gx / area;
  21. Gy = Gy / area;
  22. return new LatLng(Gx, Gy);
  23. }

其中LatLng类就是一个包含经纬度点的简单类。可以自己创建一个包含 x ,y 的类代替。

  1. public final double latitude;
  2. public final double longitude;

通过这张图,就可以发现中心和重心的区别了

     

[几何]计算不规则多边形的面积、中心、重心(Android,转)的更多相关文章

  1. 【改革春风吹满地 HDU - 2036 】【计算几何-----利用叉积计算多边形的面积】

    利用叉积计算多边形的面积 我们都知道计算三角形的面积时可以用两个邻边对应向量积(叉积)的绝对值的一半表示,那么同样,对于多边形,我们可以以多边形上的一个点为源点,作过该点并且过多边形其他点中的某一个的 ...

  2. python计算不规则图形面积算法

    介绍:大三上做一个医学影像识别的项目,医生在原图上用红笔标记病灶点,通过记录红色的坐标位置可以得到病灶点的外接矩形,但是后续会涉及到红圈内的面积在外接矩形下的占比问题,有些外接矩形内有多个红色标记,在 ...

  3. CSU 1642 Problem B[难][前缀和]

    Description 已知两个正整数a和b,求在a与b之间(包含a和b)的所有整数的十进制表示中1出现的次数. Input 多组数据(不超过100000组),每组数据2个整数a,b.(1≤a,b≤1 ...

  4. [ufldl]Supervised Neural Networks

    要实现的部分为:forward prop, softmax函数的cost function,每一层的gradient,以及penalty cost和gradient. forwad prop forw ...

  5. Git之(一)Git是什么[转]

    为什么使用Git 孔子曾经曰过的,名正则言顺 言顺则事成. 我们在学习一项新技术之前,弄清楚为什么要学它至关重要,至于为什么要学习Git,我用一段if-else语句告诉你原因: if(你相信我){ 我 ...

  6. 洛谷 P1183 多边形的面积

    P1183 多边形的面积 题目描述 给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的.要求计算多边形的面积. 多边形被放置在一个 X-YX−Y 的卡笛尔平面上,它所有的边都平行于两条坐 ...

  7. [caffe]linux下安装caffe(无cuda)以及python接口

    昨天在mac上折腾了一天都没有安装成功,晚上在mac上装了一个ParallelDesktop虚拟机,然后装了linux,十分钟就安装好了,我也是醉了=.= 主要过程稍微记录一下: 1.安装BLAS s ...

  8. [Swift]基础

    [Swift]基础 一, 常用变量 var str = "Hello, playground" //变量 let str1="Hello xmj112288" ...

  9. hdu3060Area2(任意多边形相交面积)

    链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多 ...

随机推荐

  1. Echarts 自定义数据视图

    toolbox : { show : true, feature : { dataView : { optionToContent : function(option) { // 行名称 var ax ...

  2. linux清除文件内容

    #以下方式清空文件大小为0 cat /dev/null > catalina.out清除日志文件 $ : > filename $ > filename #以下方式清空文件大小为1 ...

  3. 前端每日实战:53# 视频演示如何用纯 CSS 创作一个文本淡入淡出的 loader 动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ERwpeG 可交互视频 此视频是可 ...

  4. toj 4602 松鼠聚会

    题目: 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示,两个点的距离定义为:点( ...

  5. Ubuntu用户权限管理(chown, chmod)

    改变文件所有权chown 例如 sudo chown username myfile myfile文件的所有权变为username. chown -R username /files/work 加入参 ...

  6. CDH6.3 Centos7

    按照官方文档安装即可 CentOS7 上搭建 CDH(6.3.0) 官方文档:https://docs.cloudera.com/documentation/enterprise/6/6.3/topi ...

  7. leetcode-167周赛-1291-顺次数

    题目描述: 自己的提交: class Solution: def sequentialDigits(self, low: int, high: int) -> List[int]: l,h = ...

  8. navicat12过期问题,Windows平台。

    首先关闭Navicat 然后 win+R,输入regedit 回车,打开注册表编辑器: 删除HKEY_CURRENT_USER\Software\PremiumSoft\Data 展开HKEY_CUR ...

  9. 【HDOJ6606】Distribution of books(二分,BIT)

    题意:给定一个长为n的数组,要求挑它前缀的一段,将其分成k段,使得每段和的最大值最小 1<=k<=n<=2e5,abs(a[i])<=1e9 思路: 刚开始写了线段树TLE 改 ...

  10. python中chr()函数和ord()函数的用法

    一,chr()函数 格式:Chr(<数值表达式>)   说明:函数返回值类型为String,其数值表达式值取值范围为0~255.   例如:Print Chr(78),结果显示:N.   ...