求凹多边形的视觉中心,不是质心、重心
思路都是google上找的
思路1:效果不是很好,勉强可以
/** * reference:http://stackoverflow.com/questions/25495560/how-can-i-find-the-best-place-to-fit-a-label-inside-a-polygon * refernce:https://www.mapbox.com/blog/polygon-center/ * 1.Create four polygons by translating the original one with w, -w, h, -h where w and h are the semi-width and semi-height of the label. 2.Intersect those four polygons. 3.if the intersection is null - the label won't fit in the polygon. Exit. 4.All points inside the intersection satisfy the requirement: place the center of the label in one of those points. * @param polygon * @return */static public Geometry getPolygonVisualPoint(Polygon polygon){ Coordinate[] coordinates = polygon.getCoordinates(); List<Coordinate> leftCoordinateList = Arrays.asList(deepCopy(coordinates)); List<Coordinate> rightCoordinateList = Arrays.asList(deepCopy(coordinates)); List<Coordinate> topCoordinateList = Arrays.asList(deepCopy(coordinates)); List<Coordinate> bottomCoordinateList = Arrays.asList(deepCopy(coordinates)); Envelope envelope = polygon.getEnvelopeInternal(); double h = envelope.getHeight(); double w = envelope.getWidth(); double minSize = Math.min(h,w)/2; translateCoord(leftCoordinateList,true,minSize*-1); translateCoord(rightCoordinateList,true,minSize*1); translateCoord(topCoordinateList,false,minSize*1); translateCoord(bottomCoordinateList,false,minSize*-1); Polygon leftPolygon = createPolygon(leftCoordinateList); Polygon rightPolygon = createPolygon(rightCoordinateList); Polygon topPolygon = createPolygon(topCoordinateList); Polygon bottomPolygon = createPolygon(bottomCoordinateList); List<Geometry> polygons = new ArrayList<>(); polygons.add(polygon); polygons.add(leftPolygon); polygons.add(rightPolygon); polygons.add(topPolygon); polygons.add(bottomPolygon); Geometry geometry = intersect(polygons); return geometry;} static public Geometry intersect(List<Geometry> geoms){ Geometry intersectRes = geoms.get(0); for(int i=1;i<geoms.size();i++){ if(intersectRes.intersects(geoms.get(i))){ intersectRes = intersectRes.intersection(geoms.get(i)); } } return intersectRes;}static private Coordinate[] deepCopy(Coordinate[] arr){ Coordinate[] dest = new Coordinate[arr.length]; int i=0; for(Coordinate coordinate : arr){ dest[i++] = (Coordinate) coordinate.clone(); } return dest;}static public Polygon createPolygon(List<Coordinate> list){ Coordinate[] arr = new Coordinate[list.size()]; list.toArray(arr); return createPolygon(arr);}static public Polygon createPolygon(Coordinate[] coordinates){ GeometryFactory geometryFactory = new GeometryFactory(); Polygon polygon = geometryFactory.createPolygon(geometryFactory.createLinearRing(coordinates),null); return polygon;}static private void translateCoord(List<Coordinate> coordinates,boolean isX,double delta){ for(Coordinate coordinate : coordinates){ if(isX){ coordinate.x += delta; }else { coordinate.y += delta; } }} 思路2http://stackoverflow.com/questions/4279478/largest-circle-inside-a-non-convex-polygonhttps://github.com/mapbox/polylabel/blob/master/polylabel.js--这里有使用的demo,重点是求中心时注意设置精度,如果单位是经纬度,建议0.001https://github.com/mourner/tinyqueue/blob/master/index.js--tinyquene
转载于:https://www.cnblogs.com/yinchuanqi/p/6805320.html
求凹多边形的视觉中心,不是质心、重心相关推荐
- matlab寻找闭合,MatLab求取多个闭合区域的轮廓、面积和bbox
问题描述 要对如下所示的二值标签图做如下处理: 获取每一个闭合小区域的轮廓曲线坐标 获取每一个闭合小区域的面积 获取每一个闭合小区域的 bounding box 处理方法 问题一: 获取每一个闭合小区 ...
- HDOJ(1115)多边形重心
Lifting the Stone http://acm.hdu.edu.cn/showproblem.php?pid=1115 题目描述:输入n个顶点(整数),求它们围成的多边形的重心. 算法:以一 ...
- NYOJ 3:多边形重心问题
多边形重心问题 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接), ...
- poj 1655 树的重心
题目链接:点击打开链接 题意:给了一个树,去掉一个结点后的子树的节点数的最大值即平衡值,求最小的平衡值,如果平衡值相同,使节点号最小. 思路:其实也就是求树的重心.树的重 ...
- 树的直径/重心 学习笔记
树的直径 POJ2631 Roads in the North 题意:裸的直径 题解:套模板,但是开始的时候,我的代码在第一次dfs循环的时候,没有考虑到,路长全为0的情况,而用来记录最远点的maxp ...
- ITK学习笔记(五) ITK计算质心
ITK学习笔记(五) ITK计算质心 通过LabelGeometryImageFilter可以求Label Image各个区域的质心和BoundingBox.然而,如果图像的spacing不是1,它并 ...
- tensorflow2实现yolov3并使用opencv4.5.5 DNN加载模型预测
目录 综述 一.什么是YOLO 二.YOLOv3 网络 1.网络结构 2.网络输出解读(前向过程) 2.1.输出特征图尺寸 2.2.锚框和预测 3.训练策略与损失函数(反向过程) 三.tensorfl ...
- OpenCV3学习(9.4)轮廓矩及其匹配(Moments 、HuMoments、matchShape函数)
矩的概念介绍 矩函数在图像分析中有着广泛的应用,如模式识别.目标分类.目标识别与方位估计.图像的编码与重构等.从一幅图像计算出来的矩集,不仅可以描述图像形状的全局特征,而且可以提供大量关于该图像不同的 ...
- 矩概念与图像矩详解及其hu矩的运用
一.矩概念详解 矩这个东西,能组成的名词太多了,矩形,就是长方形,矩阵,就是m行n列的二维数组,所以想了解矩,就要从其具体的场景中去理解. 今天我们要讲的图像矩,就是一个新的概念,图像矩就是图像的矩, ...
最新文章
- 试编写一个将双向循环链表逆置的算法_循环双向链表在电路计算中的应用
- MP4移动商学院―――管理者贴身教练!
- React Native 红屏之Could not connect to development server.
- UDP socket编程中使用connect
- sap模块介绍_SAP系统操作指南.doc
- DATAGUARD STANDBY 服务器归档日志管理
- deeplab运行指南
- session 学习
- java编写母亲节快乐_写在母亲节来临之际
- 一个开源数据分析平台的搭建方法
- n918st能刷Android5吗?,中兴 N918ST中文Recovery刷机教程
- java 正则表达式电话邮箱_Java编程:正则表达式判断邮箱及电话号码是否有效
- Python基础知识之7
- 《持续集成实践指南》第1章 DevOps实践简介
- 怎样提取电影片段做gif?仅需三步在线截取gif动图
- 基于java springboot mysql百度地图的信息标注系统--桌面端的设计与实现
- mac 用户 文件夹 权限_Mac修改账户名称和个人目录后,进不去系统怎么办?
- android 单反相机_什么是数码单反相机作物因子(以及我为什么要关注)
- 小米人体感应器触发,随机播放网易云音乐
- Flex Builder 3代码格式化方法