多边形的凹凸性判断及python实现
- 问题描述:给定一个二维封闭图形点集,判断图形中各点的凹凸性。
- 方法:使用矢量判断凹凸性,检测多边形的凸点。参考:判断平面多边形的凹凸性
- 关键点:
(1)通过矢量判断时,需找到图形中第一个凸点:y坐标最大的点,若y坐标最大点不止一个,则寻找其中x坐标最大点
(2)叉乘公式: 向量A(x1,y1),向量B(x2,y2)
叉乘结果 = x1 * y2 - x2 * y1
(3)第一个凸点的叉乘必为正,如果其他点叉乘结果为负,则说明该点为凹点。
下面是该问题的python实现
import numpy as npdef find_ymax(data):"""寻找封闭图形中y坐标最大的点若y坐标最大点不止一个,则寻找其中x坐标最大点Args:data (list): 封闭图形点集Returns:封闭图形中第一个凸点"""ploy = np.array(data)y = ploy[:,1]y_max = y.max()Conv_list = list()for p in data:if p[1] == y_max:Conv_list.append(p)if len(Conv_list) != 1:temp_list = []for p in Conv_list:temp_list.append(p[0])return Conv_list[temp_list.index(max(temp_list))]else:return Conv_list[0]def Conv(data):"""对多边形各点进行凹凸性判断Args:data (list): 封闭图形点集Returns:[list]: 多边形中凹点坐标集合"""Norm_dot = find_ymax(data)num = len(data)Ind = data.index(Norm_dot)Conv_dots = []# 第一个凸点的两条向量边叉乘# if num == 0:# Vec_A = [data[num][0] - data[Tonum - 1][0] , data[num][1] - data[Tonum - 1][1]]# Vec_B = [data[num+1][0] - data[num][0] , data[num+1][1] - data[num][1]]# elif num == Tonum - 1:# Vec_A = [data[num][0] - data[num - 1][0] , data[num][1] - data[num - 1][1]]# Vec_B = [data[0][0] - data[num][0] , data[0][1] - data[num][1]]# else:# Vec_A = [data[num][0] - data[num - 1][0] , data[num][1] - data[num - 1][1]]# Vec_B = [data[num+1][0] - data[num][0] , data[num+1][1] - data[num][1]]Vec_A = [data[Ind%num][0] - data[(Ind-1)%num][0], data[Ind%num][1] - data[(Ind-1)%num][1]]Vec_B = [data[(Ind+1)%num][0] - data[Ind%num][0], data[(Ind+1)%num][1] - data[Ind%num][1]]Vect_Norm = (Vec_A[0] * Vec_B[1]) - (Vec_A[1] * Vec_B[0])# 向量法判断图形中每个点的凹凸性for i in range(num):V_A = [data[(i)%num][0] - data[(i-1)%num][0], data[(i)%num][1] - data[(i-1)%num][1]]V_B = [data[(i+1)%num][0] - data[(i)%num][0], data[(i+1)%num][1] - data[(i)%num][1]]Vec_Cross = (V_A[0] * V_B[1]) - (V_A[1] * V_B[0])if (Vec_Cross * Vect_Norm) < 0:Conv_dots.append(data[(i) % num])return Conv_dotsdata = [[20,12],[25,0],[30,15],[15,17],[15,20],[10,20],[10,10]]
print(Conv(data))
如有不足,还请各位大佬不吝赐教!
多边形的凹凸性判断及python实现相关推荐
- 判断多边形的凹凸性和计算多边形面积:利用向量叉乘
根据百度百科的讲解: 凸多边形 现在重点讲解顶点凹凸性法(最常用也是较为简单的方法):计算总结在最后. 利用向量叉乘的相关知识进行计算:假设当前连续的三个顶点分别是P1,P2,P3.计算向量P1P3, ...
- 人工智能数学基础:利用导数判断函数单调性、凹凸性、极值、最值和描绘函数图形
一.单调性判断定理 定理: 设函数y=f(x)在[a,b]上连续,在(a,b)内可导. (1)如果在(a,b)内f(x)≥0,且等号仅在有限多个点处成立,那么函数y=f(x)在[a,b]上单调增加; ...
- 多边形凹凸性的判断、自相交判断
文章目录 说明 分析 代码 关于自相交的理解 看图说话 说明 该博文参考 弱花3kou 的文章 [OpenGL] 绘制并且判断凹凸多边形.自相交多边形 分析 凸多边形 凹多边形 自相交 代码 #inc ...
- 函数的凹凸性证明_判断复杂函数的凹凸性
判断无人机能量x关系函数的凹凸性(函数是关于v和drt的二元函数) 函数有非常多的参数,极其复杂,看到就烦,我首先用画函数的方法通过图像法来观察,但是画出来的图像不忍直视(或许是我画的图像不对,反正看 ...
- 点云凹凸性检验(1/2)
使用open3d 计算点云法向量并根据法向量判断凹凸性 在某些点云处理场景中,我们不仅需要法向量,还需要法向量所指示的某些区域的点云的凹凸性. 法向量 先去github找个bunny.pcd的实验点云 ...
- PCL—点云分割(基于凹凸性) 低层次点云处理
博客转载自:http://www.cnblogs.com/ironstark/p/5027269.html 1.图像分割的两条思路 场景分割时机器视觉中的重要任务,尤其对家庭机器人而言,优秀的场景分割 ...
- 函数凹凸性与黑塞矩阵
1 同济大学高等数学定义 2 国际上的定义 3 黑塞矩阵 1 同济大学高等数学定义 我们从几何上看到,在有的曲线弧上,如果任取两点,则联结这两点间的弦总位于这两点间的弧段的上方,如图3-8(a):而有 ...
- 【高数】高数第三章节——微分中值洛必达泰勒单调性与凹凸性作图弧微分与曲率
高数第三章节--微分中值&洛必达&泰勒&单调性与凹凸性&作图&弧微分与曲率 0.博主高数相关章节目录 1.数列 1.微分中值定理 1.1 罗尔定理 1.2 费马 ...
- 高等数学--函数的单调性,曲线凹凸性及极值(五)
函数单调性 定理: 设函数f(x)在[a,b]上连续,在(a,b)内可导,如果在(a,b)内f'(x)>=0,且等号仅在有限多个点处成立,那么函数f(x)在[a,b]上单调增加. 反之如果f'( ...
- 点云凹凸性检验(2/2)
凹凸性 当我们持有表面点云数据时.可能从某个方向看向数据,此区域是凹陷的,但是当我们从背向看过来时其又是凸起的.这使得我们产生一个误会:在判断点云的凹凸性之前,是否需要先规定一下点云的表侧和里侧? 事 ...
最新文章
- html广告20s倒计时,一段广告倒计时退出代码
- 无法从“const char [10]”转换为“char *”
- QPixmap: It is not safe to use pixmaps outside the GUI thread原因
- Git笔记(二)——[diff, reset]
- 如果有人问你关系数据库的工作原理,叫他看这篇文章How does a relational database work
- 全国公共英语五级(PETS-5) 写作作文
- Jenkins file一行代码部署.NET程序到K8S
- 【无线串口模块快速选型指南】通信频点、芯片、通信距离、功率灵敏度、电流 空中速率
- [react] React的isMounted有什么作用?
- Python | Lambda函数与示例
- java中的输入语句判断正负_在java中使用方法调用统计数组中正数的个数,将判断数据的正负功能定义成方法...
- php页面防刷,PHP防止刷新重复提交页面的示例代码
- Linux进程管理内核API函数pid_task( )---根据pid获取task_struct
- 机会难得 | 这家上市公司终于招人了
- 微信公众平台开发最佳实践
- Win10-更改c盘下的用户文件夹名[转]
- vuetify calendar实现日历考勤
- 避免创业的大忌,我为何给 TDengine 只选择了集群、高性能与 SQL 支持三大特点?
- 原生态(PHP和JAVA)研发的文锋网约车APP文锋代驾APP700个功能模块免费开源源码
- GitHub Pages 快速搭建个人主页