算法逻辑

在点集凸包算法python实现这篇博客中介绍了一种凸包算法,这种算法中凸包点搜索的过程较为麻烦,主要是因为计算点集连线与X轴的夹角需要考虑到四个不同象限,在这里通过计算向量夹角的方式,对凸包点集的搜索过程进行了优化

算法逻辑如下图所示:

python代码实现

from osgeo import ogr, gdalconst, osr
import numpy as npdef getAlfa(startPoint, endPoint):dx = endPoint[0] - startPoint[0]dy = endPoint[1] - startPoint[1]if dx == 0:if dy > 0:return np.pi / 2elif dy < 0:return 3 * np.pi / 2else:return np.pialfa = np.arctan(dy / dx)if dx < 0:alfa += np.pielif dy < 0:alfa += np.pi * 2return alfadef convexHull(xys: np.array):convexPoints = []ymin = np.min(xys, axis=0)[1]index = np.where(xys[:, 1] == ymin)[0][0]convexPoints.append(xys[index, :])n = 1while True:startPoint=convexPoints[-1]if n==1:previousPoint=np.array([startPoint[0]+100,startPoint[1]])else:previousPoint=convexPoints[-2]index=0minCosAngle=0v1=previousPoint-startPointfor i in range(xys.shape[0]):nextPoint=xys[i,:]v2=nextPoint-startPointcosAngle=np.dot(v1,v2)/(np.sqrt(np.sum(v1**2))*np.sqrt(np.sum(v2**2)))if i==0:index=iminCosAngle=cosAngleelse:if cosAngle<minCosAngle:minCosAngle=cosAngleindex=iconvexPoints.append(xys[index,:])n+=1xys=np.delete(xys,index,axis=0)firstPoint=convexPoints[0]endPoint=convexPoints[-1]if firstPoint[0]==endPoint[0] and firstPoint[1]==endPoint[1]:breakwktPolygon = ""for i in range(n):x = convexPoints[i][0]y = convexPoints[i][1]wktPolygon = '{} {},'.format(x, y) + wktPolygonwktPolygon = wktPolygon[0:-1]wktPolygon = "POLYGON(({}))".format(wktPolygon)return wktPolygonif __name__ == "__main__":ogr.RegisterAll()ds = ogr.Open("./point.shp", gdalconst.GA_ReadOnly)oLay = ogr.DataSource.GetLayer(ds, 0)ogr.Layer.ResetReading(oLay)xys = []while True:oFea = ogr.Layer.GetNextFeature(oLay)if oFea == None:breakoPoi = ogr.Feature.GetGeometryRef(oFea)x = ogr.Geometry.GetX(oPoi)y = ogr.Geometry.GetY(oPoi)xys.append([x, y])xys = np.array(xys)wktPolygon = convexHull(xys)driver = ogr.GetDriverByName("ESRI Shapefile")convexds = ogr.Driver.CreateDataSource(driver, "convexHull.shp")srs = ogr.Layer.GetSpatialRef(oLay)convexLay = ogr.DataSource.CreateLayer(convexds, "convexhull", srs, ogr.wkbPolygon)labelField = ogr.FieldDefn("label", ogr.OFTInteger)ogr.Layer.CreateField(convexLay, labelField)convexFea = ogr.Feature(ogr.Layer.GetLayerDefn(convexLay))ogr.Feature.SetField(convexFea, "label", 1)convexPolygon = ogr.CreateGeometryFromWkt(wktPolygon)ogr.Feature.SetGeometry(convexFea, convexPolygon)ogr.Layer.CreateFeature(convexLay, convexFea)ogr.DataSource.Destroy(convexds)ogr.DataSource.Destroy(ds)print('ok!')

代码运行结果

点集凸包算法python实现(二)相关推荐

  1. 凸包计算几何matlab,计算几何-凸包算法 Python实现与Matlab动画演示

    凸包算法是计算几何中的最经典问题之一了.给定一个点集,计算其凸包.凸包是什么就不罗嗦了 本文给出了<计算几何--算法与应用>中一书所列凸包算法的Python实现和Matlab实现,并给出了 ...

  2. 凸包计算几何matlab,計算幾何-凸包算法 Python實現與Matlab動畫演示

    凸包算法是計算幾何中的最經典問題之一了.給定一個點集,計算其凸包.凸包是什么就不羅嗦了 本文給出了<計算幾何--算法與應用>中一書所列凸包算法的Python實現和Matlab實現,並給出了 ...

  3. 【知识发现】隐语义模型LFM算法python实现(二)

    http://blog.csdn.net/fjssharpsword/article/details/78015956 基于该篇文章中的代码优化,主要是在生成负样例上提高执行速度,代码参考如下: # ...

  4. 数据结构与算法(Python版)二十二:递归可视化(谢尔宾斯基三角形)

    谢尔宾斯基Sierpinski三角形 分形构造, 平面称谢尔宾斯基三角形, 立体称谢尔宾斯基金字塔 谢尔宾斯基三角形:作图思路 根据自相似特性, 谢尔宾斯基三角形是由3个尺寸减半的谢尔宾斯基三角形按照 ...

  5. Graham-Scan算法计算凸包的Python代码实现

    对于一个点集P来讲,它的凸包就是一个凸多边形Q,其中满足P中的每个点都在Q的边界上或内部.就像下图所示 凸包的计算算法有好多种,wiki和算法导论第33章中都有比较详细的介绍,比如下面是算法导论中给出 ...

  6. python 卡方分箱算法_python实现二分类的卡方分箱示例

    解决的问题: 1.实现了二分类的卡方分箱: 2.实现了最大分组限定停止条件,和最小阈值限定停止条件: 问题,还不太清楚,后续补充. 1.自由度k,如何来确定,卡方阈值的自由度为 分箱数-1,显著性水平 ...

  7. 凸包问题-Graham-Scan算法-python实现

    一般来说凸包问题有三种解决方式:蛮力法.Graham-Scan法和分治法.关于蛮力法和分治法的python实现可参考博文:蛮力法.分治法,博主写的很清晰. 这里主要介绍Graham-Scan算法的实现 ...

  8. 【Python数学建模常用算法代码(二)之BP神经网络】

    Python数学建模常用算法代码(二) BP神经网络模型Python代码 import numpy as np import math import random import string impo ...

  9. Python预测之美 数据分析与算法实战(二)

    Python预测之美 数据分析与算法实战 第一篇 预测入门 第一章到第四章 第二篇 预测算法 第五章 参数优化 在使用选定算法进行建模时设定或得到的参数很可能不是最优或接近最优的,这时需要对参数进行优 ...

最新文章

  1. Web 开发 Browser 调试大全
  2. python二叉树遍历例子_python数据结构之二叉树的遍历实例
  3. ffmpeg 录屏推流_在 Linux 使用 ffmpeg 推流
  4. servlet请求转发html页面乱码问题
  5. python sys库
  6. 显微镜下的大明——第三个故事
  7. vue用post请求下载文件
  8. 关于股票的经典书籍有哪些推荐?
  9. 数值分析:数据的最小二乘拟合
  10. 【Linux】之systemd与systemctl
  11. JavaScript中 FormData 对象详解
  12. 【金猿产品展】星环KunDB ——助力企业数字化转型的高性能分布式交易型数据库...
  13. css 选择器 如何 选择 大于 N 的情况 ?第n个元素之后的情况
  14. RESIZE DATAFILE与ORA-03297
  15. 如何在 Windows 上 使用 ONLYOFFICE 协作编辑文档
  16. 机器人行业中我们常说的roll、yaw、pitch是什么?
  17. 怎么让计算机响音乐,如何让电脑声音更大一点
  18. PowerBI-日期和时间函数-WEEKDAY\WEEKNUM
  19. JAVA数组扁平化整合_一文搞定数组扁平化(超全面的数组拉平方案及实现)
  20. 电子商务设计师考试心得

热门文章

  1. 区块链会计案例_区块链会计行业 区块链会计应用案例
  2. USB Audio Class (UAC)音频解读规范
  3. python打包加密工具:Pyinstaller和Nuitka
  4. Access 查询的IIF的写法
  5. 快手提前批--Java开发面经
  6. 奇数值结点链表 (20 分)
  7. Unity FPS显示工具
  8. FPGA控制TDC-GPX2时间间隔测量(一)
  9. 51单片机_7-1独立按键控制流水灯方向
  10. 2022年全球市场高空作业平台总体规模、主要生产商、主要地区、产品和应用细分研究报告