思路都是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

求凹多边形的视觉中心,不是质心、重心相关推荐

  1. matlab寻找闭合,MatLab求取多个闭合区域的轮廓、面积和bbox

    问题描述 要对如下所示的二值标签图做如下处理: 获取每一个闭合小区域的轮廓曲线坐标 获取每一个闭合小区域的面积 获取每一个闭合小区域的 bounding box 处理方法 问题一: 获取每一个闭合小区 ...

  2. HDOJ(1115)多边形重心

    Lifting the Stone http://acm.hdu.edu.cn/showproblem.php?pid=1115 题目描述:输入n个顶点(整数),求它们围成的多边形的重心. 算法:以一 ...

  3. NYOJ 3:多边形重心问题

    多边形重心问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接), ...

  4. poj 1655 树的重心

    题目链接:点击打开链接   题意:给了一个树,去掉一个结点后的子树的节点数的最大值即平衡值,求最小的平衡值,如果平衡值相同,使节点号最小.              思路:其实也就是求树的重心.树的重 ...

  5. 树的直径/重心 学习笔记

    树的直径 POJ2631 Roads in the North 题意:裸的直径 题解:套模板,但是开始的时候,我的代码在第一次dfs循环的时候,没有考虑到,路长全为0的情况,而用来记录最远点的maxp ...

  6. ITK学习笔记(五) ITK计算质心

    ITK学习笔记(五) ITK计算质心 通过LabelGeometryImageFilter可以求Label Image各个区域的质心和BoundingBox.然而,如果图像的spacing不是1,它并 ...

  7. tensorflow2实现yolov3并使用opencv4.5.5 DNN加载模型预测

    目录 综述 一.什么是YOLO 二.YOLOv3 网络 1.网络结构 2.网络输出解读(前向过程) 2.1.输出特征图尺寸 2.2.锚框和预测 3.训练策略与损失函数(反向过程) 三.tensorfl ...

  8. OpenCV3学习(9.4)轮廓矩及其匹配(Moments 、HuMoments、matchShape函数)

    矩的概念介绍 矩函数在图像分析中有着广泛的应用,如模式识别.目标分类.目标识别与方位估计.图像的编码与重构等.从一幅图像计算出来的矩集,不仅可以描述图像形状的全局特征,而且可以提供大量关于该图像不同的 ...

  9. 矩概念与图像矩详解及其hu矩的运用

    一.矩概念详解 矩这个东西,能组成的名词太多了,矩形,就是长方形,矩阵,就是m行n列的二维数组,所以想了解矩,就要从其具体的场景中去理解. 今天我们要讲的图像矩,就是一个新的概念,图像矩就是图像的矩, ...

最新文章

  1. 试编写一个将双向循环链表逆置的算法_循环双向链表在电路计算中的应用
  2. MP4移动商学院―――管理者贴身教练!
  3. React Native 红屏之Could not connect to development server.
  4. UDP socket编程中使用connect
  5. sap模块介绍_SAP系统操作指南.doc
  6. DATAGUARD STANDBY 服务器归档日志管理
  7. deeplab运行指南
  8. session 学习
  9. java编写母亲节快乐_写在母亲节来临之际
  10. 一个开源数据分析平台的搭建方法
  11. n918st能刷Android5吗?,中兴 N918ST中文Recovery刷机教程
  12. java 正则表达式电话邮箱_Java编程:正则表达式判断邮箱及电话号码是否有效
  13. Python基础知识之7
  14. 《持续集成实践指南》第1章 DevOps实践简介
  15. 怎样提取电影片段做gif?仅需三步在线截取gif动图
  16. 基于java springboot mysql百度地图的信息标注系统--桌面端的设计与实现
  17. mac 用户 文件夹 权限_Mac修改账户名称和个人目录后,进不去系统怎么办?
  18. android 单反相机_什么是数码单反相机作物因子(以及我为什么要关注)
  19. 小米人体感应器触发,随机播放网易云音乐
  20. Flex Builder 3代码格式化方法

热门文章

  1. WPF和WinForm的区别
  2. python-tkinter:简单GUI界面-背景图+文字
  3. secoclient-linux安装
  4. 重庆市行政区划 (2023)
  5. 【Android】AppCompatTextView的使用详解
  6. Java删除文件夹中所有的子目录(不删除本目录)
  7. 基于 JavaWeb 的社区管理系统
  8. unity内嵌浏览器——UniWebView插件
  9. 前端javascript百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
  10. 大学计算机技术知识大全,大学计算机全章节重点基础知识归纳大全.doc