[几何]计算不规则多边形的面积、中心、重心(Android,转)
最近项目用到:在不规则多边形的中心点加一个图标。(e.g: xx地区发生暴雪,暴雪区域是多边形,给多边形中心加一个暴雪的图标)
之前的设计是,计算不规则多边形范围矩形bounds的中心点。这个比较简单,对于一些圆,矩形,凸多边形都比较适合。但是遇到凹多边形就会出现问题,比如一个月牙型的不规则多边形,bounds的中心点,就落到月牙外了。就有点难以接受了。
经过讨论,决定将中心改为重心。
下面上代码,
计算不规则多边形的中心:
- public static final double MIN_LAT = -90;
- public static final double MAX_LAT = 90;
- public static final double MIN_LNG = -180;
- public static final double MAX_LNG = 180;
- /**
- * 获取不规则多边形几何中心点
- *
- * @param mPoints
- * @return
- */
- public static LatLng getCenterPoint(List<LatLng> mPoints) {
- // 1 自己计算
- // double latitude = (getMinLatitude(mPoints) + getMaxLatitude(mPoints)) / 2;
- // double longitude = (getMinLongitude(mPoints) + getMaxLongitude(mPoints)) / 2;
- // return new LatLng(latitude, longitude);
- // 2 使用Google map API提供的方法(推荐)
- LatLngBounds.Builder boundsBuilder = LatLngBounds.builder();
- for (LatLng ll : mPoints)
- boundsBuilder.include(ll);
- return boundsBuilder.build().getCenter();
- }
- // 经度最小值
- public static double getMinLongitude(List<LatLng> mPoints) {
- double minLongitude = MAX_LNG;
- if (mPoints.size() > 0) {
- minLongitude = mPoints.get(0).longitude;
- for (LatLng latlng : mPoints) {
- // 经度最小值
- if (latlng.longitude < minLongitude)
- minLongitude = latlng.longitude;
- }
- }
- return minLongitude;
- }
- // 经度最大值
- public static double getMaxLongitude(List<LatLng> mPoints) {
- double maxLongitude = MIN_LNG;
- if (mPoints.size() > 0) {
- maxLongitude = mPoints.get(0).longitude;
- for (LatLng latlng : mPoints) {
- // 经度最大值
- if (latlng.longitude > maxLongitude)
- maxLongitude = latlng.longitude;
- }
- }
- return maxLongitude;
- }
- // 纬度最小值
- public static double getMinLatitude(List<LatLng> mPoints) {
- double minLatitude = MAX_LAT;
- if (mPoints.size() > 0) {
- minLatitude = mPoints.get(0).latitude;
- for (LatLng latlng : mPoints) {
- // 纬度最小值
- if (latlng.latitude < minLatitude)
- minLatitude = latlng.latitude;
- }
- }
- return minLatitude;
- }
- // 纬度最大值
- public static double getMaxLatitude(List<LatLng> mPoints) {
- double maxLatitude = MIN_LAT;
- if (mPoints.size() > 0) {
- maxLatitude = mPoints.get(0).latitude;
- for (LatLng latlng : mPoints) {
- // 纬度最大值
- if (latlng.latitude > maxLatitude)
- maxLatitude = latlng.latitude;
- }
- }
- return maxLatitude;
- }
计算不规则多边形的重心:
- /**
- * 获取不规则多边形重心点
- *
- * @param mPoints
- * @return
- */
- public static LatLng getCenterOfGravityPoint(List<LatLng> mPoints) {
- double area = 0.0;//多边形面积
- double Gx = 0.0, Gy = 0.0;// 重心的x、y
- for (int i = 1; i <= mPoints.size(); i++) {
- double iLat = mPoints.get(i % mPoints.size()).latitude;
- double iLng = mPoints.get(i % mPoints.size()).longitude;
- double nextLat = mPoints.get(i - 1).latitude;
- double nextLng = mPoints.get(i - 1).longitude;
- double temp = (iLat * nextLng - iLng * nextLat) / 2.0;
- area += temp;
- Gx += temp * (iLat + nextLat) / 3.0;
- Gy += temp * (iLng + nextLng) / 3.0;
- }
- Gx = Gx / area;
- Gy = Gy / area;
- return new LatLng(Gx, Gy);
- }
其中LatLng类就是一个包含经纬度点的简单类。可以自己创建一个包含 x ,y 的类代替。
- public final double latitude;
- public final double longitude;
通过这张图,就可以发现中心和重心的区别了
[几何]计算不规则多边形的面积、中心、重心(Android,转)的更多相关文章
- 【改革春风吹满地 HDU - 2036 】【计算几何-----利用叉积计算多边形的面积】
利用叉积计算多边形的面积 我们都知道计算三角形的面积时可以用两个邻边对应向量积(叉积)的绝对值的一半表示,那么同样,对于多边形,我们可以以多边形上的一个点为源点,作过该点并且过多边形其他点中的某一个的 ...
- python计算不规则图形面积算法
介绍:大三上做一个医学影像识别的项目,医生在原图上用红笔标记病灶点,通过记录红色的坐标位置可以得到病灶点的外接矩形,但是后续会涉及到红圈内的面积在外接矩形下的占比问题,有些外接矩形内有多个红色标记,在 ...
- CSU 1642 Problem B[难][前缀和]
Description 已知两个正整数a和b,求在a与b之间(包含a和b)的所有整数的十进制表示中1出现的次数. Input 多组数据(不超过100000组),每组数据2个整数a,b.(1≤a,b≤1 ...
- [ufldl]Supervised Neural Networks
要实现的部分为:forward prop, softmax函数的cost function,每一层的gradient,以及penalty cost和gradient. forwad prop forw ...
- Git之(一)Git是什么[转]
为什么使用Git 孔子曾经曰过的,名正则言顺 言顺则事成. 我们在学习一项新技术之前,弄清楚为什么要学它至关重要,至于为什么要学习Git,我用一段if-else语句告诉你原因: if(你相信我){ 我 ...
- 洛谷 P1183 多边形的面积
P1183 多边形的面积 题目描述 给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的.要求计算多边形的面积. 多边形被放置在一个 X-YX−Y 的卡笛尔平面上,它所有的边都平行于两条坐 ...
- [caffe]linux下安装caffe(无cuda)以及python接口
昨天在mac上折腾了一天都没有安装成功,晚上在mac上装了一个ParallelDesktop虚拟机,然后装了linux,十分钟就安装好了,我也是醉了=.= 主要过程稍微记录一下: 1.安装BLAS s ...
- [Swift]基础
[Swift]基础 一, 常用变量 var str = "Hello, playground" //变量 let str1="Hello xmj112288" ...
- hdu3060Area2(任意多边形相交面积)
链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多 ...
随机推荐
- java pravite关键字的使用
package java04; /* * 问题描述:定义Person的年龄时,无法阻止不合理的数值设置进来 * 解决方案:用private关键字将需要保护的成员变量进行修饰 * * 一旦使用了priv ...
- 洛谷3605 Promotion Counting
线段树合并都是蓝题了嘛 我可能和时代脱轨了emm... 直接离散化然后合并就好啦w 生病了真难受QAQ //Love and Freedom. #include<cstdio> #incl ...
- 为什么集合类没有实现Cloneable和Serializable接口?
为什么集合类没有实现Cloneable和Serializable接口? 克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的.因此,应该由集合类的具体实现来 ...
- Java数据流学习
数据流 与机器无关的操作Java基本数据类型.网络传输会用. DataInputStream 数据输入流允许应用程序以与机器无关的方式从底层输入流中读取Java基本数据类型.应用程序可以使用数据输出流 ...
- js this 指向
JavaScript 作为一种脚本语言身份的存在,因此被很多人认为是简单易学的.然而情况恰恰相反,JavaScript 支持函数式编程.闭包.基于原型的继承等高级功能.由于其运行期绑定的特性,Java ...
- leetcode-15双周赛-1288-删除被覆盖区间
题目描述: 方法一:排序O(Nlogn) class Solution: def removeCoveredIntervals(self, intervals: List[List[int]]) -& ...
- signer information does not match signer information of other classes in the same package
报错日志: java.lang.SecurityException: class "org.bouncycastle.asn1.ASN1ObjectIdentifier"'s si ...
- css 图片 和 文本 的处理
图片 1.css3已经可以实现 img标签 和 img内图片分开处理的功能了.类似标签的背景图. https://www.zhangxinxu.com/wordpress/2015/03/css3 ...
- Android实战技巧:Dialog (转)
转:http://blog.csdn.net/hitlion2008/article/details/7567549#t0 Dialog是任何系统都必须有的一个控件,作为辅助窗口,用于显示一些消息,或 ...
- error C2065: ‘__in’ : undeclared identifier
转自VC错误:http://www.vcerror.com/?p=1307 问题描述: 编译时出现: error C2065: '__in' : undeclared identifier error ...