凸多边形是一个内部为凸集的简单多边形。凸多边形(Convex Polygon)指如果把一个多边形的所有边中,任意一条边向两方无限延长成为一直线时,其他各边都在此直线的同旁,那么这个多边形就叫做凸多边形,其内角应该全不是优角,任意两个顶点间的线段位于多边形的内部或边上。

判断是否为凸多边形的关键在于以一边及其延长线为参照,其他各边是否在此边同旁,也可以转化为其他顶点是否位于此边同旁。观察下图可知,图左的多边形无论是哪两个顶点组成一条边,其余顶点要么都在该边及其延长线的上方,要么都在该边及其延长线的下方,即始终位于同旁,因此可以判断该多边形为凸多边形。而与之形成对比的图右中,则存在顶点位于边及其延长线两侧的情况,图中红圈和绿圈标记的顶点位于直线两侧,因此该多边形为凹多边形。


基于上述分析,我们可以总结出判断凸多边形的思路:

  1. 相邻两个顶点组成一条直线,得到该条直线的表达式
  2. 计算组成顶点外的其余顶点到1中直线的距离
  3. 判断2中的所有距离是否均为相同符号,若为相同符号则为凸多边形,否则为凹多边形

需要特别注意的是,构成多边形的点要按照顺时针或者逆时针的顺序依次排列,其顺序不能有跳跃,否则会造成误判。因此在输入多边形所有顶点坐标前,必须先确保其定点顺序依次排列。

'''
计算直线表达式
:param vertex1: 前一个顶点
:param vertex2: 后一个顶点
:return (type, param): 返回直线的类别及其描述参数
'''
def kb(vertex1, vertex2):x1 = vertex1[0]y1 = vertex1[1]x2 = vertex2[0]y2 = vertex2[1]if x1==x2:return (0, x1)      # 0-垂直直线if y1==y2:              return (1, y1)      # 1-水平直线else:k = (y1-y2)/(x1-x2)b = y1 - k*x1return (2, k, b)    # 2-倾斜直线'''
判断是否为凸多边形
:param vertexes: 构成多边形的所有顶点坐标列表,如[[0,0], [50, 0], [0, 50]]
:return convex: 布尔类型,为True说明该多边形为凸多边形,否则为凹多边形
'''
def isConvex(vertexes):# 默认为凸多边形convex = True   # 多边形至少包含三个顶点l = len(vertexes)if l<3:raise ValueError("多边形至少包含三个顶点!")# 对每两个点组成的直线做判断for i in range(l):pre = inex = (i+1)%l# 得到直线line = kb(vertexes[pre], vertexes[nex])# 计算所有点和直线的距离(可能为正也可能为负)if line[0]==0:offset = [vertex[0]-vertexes[pre][0] for vertex in vertexes]elif line[0]==1:offset = [vertex[1]-vertexes[pre][1] for vertex in vertexes]else:k, b = line[1], line[2]offset = [k*vertex[0]+b-vertex[1] for vertex in vertexes]# 计算两两距离的乘积,如果出现负数则存在两个点位于直线两侧,因此为凹多边形for o in offset:for s in offset:if o*s<0:convex = Falsebreakif convex==False:breakif convex==False:break# 打印判断结果if convex==True:print("该多边形为凸多边形!")else:print("该多边形为凹多边形!")return convex

【Python】判断多边形的形状为凸多边形还是凹多边形相关推荐

  1. python 判断多边形,点是否重合(方法简单易懂,没有使用 cv2.pointPolygonTest函数)

    python 判断多边形,点是否重合 首先代码并未使用 cv2.pointPolygonTest 这一opencv函数,因为自己在使用时,一直报错,很难自己构造出适用于 pointPolygonTes ...

  2. 判断一个多边形是凸多边形还是凹多边形

    题目: 判断一个多边形是凸多边形还是凹多边形 输入: 输入包含多组测试数据,每组数据占2行,首先一行是一个整数n,表示多边形顶点的个数,然后一行是2×n个整数,表示逆时针顺序的n个顶点的坐标(xi,y ...

  3. 判断两个形状是否相交(二)-GJK

    判断两个形状是否相交二-GJK 原文地址 一 介绍 二凸多边形性质 三Minkowski和 四单纯形 五支持函数 六创建单纯形 七相交检测 八迭代 然后我们开始循环迭代 第二次迭代 第三次迭代 九检测 ...

  4. python 填充多边形 学习笔记

    笔记: 两个函数都只能填充凸多边形,凹多边形会丢失一部分内容,用人脸关键点做掩码时出现了这个情况. 函数可以用来填充凸多边形,只需要提供凸多边形的顶点即可. img = np.zeros((1080, ...

  5. python判断点在直线的哪一侧_判断点在直线的哪一侧

    2.2.1下面开始程序的设计: 由于本部分需要判断空间多边形的拓扑关系,现在约定凸多边形的边界和内部,凸多边形用顶点坐标的逆时针方向序列确定.凸多边形P Q的顶点序列为p1 p2 ..pn和q1 q2 ...

  6. 基于python OpenCV多边形图像识别的实现

    首先说一下我的整体思路: ① 首先定义了一个识别器类型,封装了计算边长,识别形状和展示结果三个函数. ② 主函数先读入图片,然后将图片转化为灰度图片,然后高斯滤波平滑处理,然后将灰度图片转化为黑白两色 ...

  7. python计算多边形的面积并保留两位小数_计算任意多边形面积的Python实现

    最近需要实现一个计算非凸多边形面积的功能,需要输入是顺次排序的多边形顶点坐标,假设输入的多边形顶点是V={v0, v1, v2, -, vn-1},则多边形的边为E={, , ,...,, }.要求输 ...

  8. js判断多边形的坐标点是顺时针还是逆时针的两种方法

    js判断多边形的坐标点是顺时针还是逆时针的两种方法 关键算法 通过极值点与其相邻点的构成的矢量走向算出多边形走向 通过计算各左边点所在矢量夹角的角度总和来推算多边形走向 由于arcgis对顺时针生成的 ...

  9. python 判断字典是否包含某个key,以及对应的value 值

    python 判断字典是否包含某个key 可以使用 in 来判断 具体如下: num = {"a": 1, "b": 2, "c": 3} ...

  10. Python 判断当前数值的类型(比如x=10 获取x的类型)

    python 判断当前数值的类型使用type 先面集体说下type 的使用 x = 10 x = type(x) print (x) y = "10" y = type(y) pr ...

最新文章

  1. postman发送post请求,用request.getParameter()获取请求参数
  2. 日志按照天自动输出_性能测试和接口自动化测试
  3. 织梦cms系统如何code 财付通接口
  4. MapReduce排序-实现比较器和序列化代码
  5. 全网爆红!全新洗脑神曲:程序员Disco
  6. html写用户导入,用户基本信息录入.html
  7. Unknown system variable 'query_cache_size'
  8. sql server 快照_SQL Server复制:配置快照和事务复制
  9. 收购一家毁一家,雅虎到底杀死了多少好产品?
  10. matlab将多个nc文件进行合成TIF
  11. 简单的Dos攻击-死亡之Ping
  12. ThinkBook 14P Win11网卡驱动掉了-解决方案
  13. 向日葵远程控制连接服务器黑屏原因
  14. ie edge浏览记录文件_如何在Microsoft Edge中清除浏览历史记录
  15. 如何转换成Ogg和MPEG4格式
  16. c++ 11 原子操作库 (std::atomic)(三)
  17. VOLATILE和队列
  18. VUE中导出Excel功能的实现
  19. 哪些原因会导致头晕头痛,日常应该如何去注意呢?
  20. 无须注册的云盘平台anonfile

热门文章

  1. opengles图像处理之边缘检测
  2. java 对手机号码进行校验
  3. 11000-雷达基本资料
  4. Qt输出PDF排版的技巧
  5. 简单计算经纬度表示的距离
  6. 最厉害的象棋软件_太牛了!象棋史上最厉害人机高手竟弃车跟软件对杀,就问你敢不敢...
  7. Nature杂志总编辑:如何培养一个有价值的研究者
  8. 风尚云网学习-Linux/宝塔面板部署禅道开源系统
  9. 下载网页上的各种视频只需四步
  10. matlab sa函数的傅里叶变换,通信第三章常见函数的傅里叶变换.ppt