凸多边形、凹多边形、凸包算法

凸多边形:
(Convex Polygon)可以有以下三种定义:
1、没有任何一个内角是优角(Reflexive Angle)的多边形。
2、如果把一个多边形的所有边中,有一条边向两方无限延长成为一直线时,其他
3、凸多边形是一个内部为凸集的简单多边形。简单多边形的下列性质与其凸性等
(1)所有内角小于等于180度。
(2)任意两个顶点间的线段位于多边形的内部或
(3)多边形内任意两个点,其连线全部在多边形内部或边上。
4、一个多边形,如果它的任意两个点的连线都不包括该多边形以外的点,就称为凸多边形。
5、角度法:

判断每个顶点所对应的内角是否小于180度,如果小于180度,则是凸的,如果大于180度,则是凹多边形。

6、凸包法:

这种方法首先计算这个多边形的凸包,关于凸包的定义在此不再赘述,首先可以肯定的是凸包肯定是一个凸多边形。如果计算出来的凸多边形和原始多边形的点数一样多,那就说明此多边形时凸多边形,否则就是凹多边形。
在这里插入图片描述
凸包详解:https://blog.csdn.net/u013377068/article/details/80095620

7、顶点凹凸性法

利用以当前顶点为中心的矢量叉乘或者计算三角形的有符号面积判断多边形的方向以及当前顶点的凹凸性。

假设当前连续的三个顶点分别是P1,P2,P3。计算向量(P1,P2),(P1,P3)的叉乘,也就是计算三角形P1P2P3的面积,得到的结果如果大于0,则表示P2点在线段P1和P3的右侧,多边形的顶点是逆时针序列。然后依次计算下一个前后所组成向量的叉乘,如果在计算时,出现负值,则此多边形时凹多边形,如果所有顶点计算完毕,其结果都是大于0,则多边形时凸多边形。

8、辛普森面积法

利用待判别的顶点以及前后两个顶点所组成的三角形,利用辛普森公式计算其面积,如果此三角形面积与整个多边形面积符号相同,那么这个顶点是凸的;如果此三角形面积与整个多边形面积符号不同,那么这个顶点是凹的,即整个多边形也是凹多边形。

在这里插入图片描述
所有的正多边形都是凸多边形。
所有的三角形都是凸多边形。
凸多边形的内角均小于或等于180°,边数为n(n属于Z且n大于2)的凸多
n-2)×180°,但任意凸多边形外角和均为360°,并可通过反证法
3个。
凸多边形所有对角线都在内部,边数为n的凸多边形对角线条数为2-1n(n-3),
n-3个顶点连对角线。
凸包寻找算法
凸多边形:一个多边形,如果它的任意两个点的连线都不包括该多边形以外的点,就称为凸多边形。
一个平面点集S的凸包是指包含s的最小凸多边形,该多边形的顶点称为s的极点。
寻找一个平面点集的凸包是计算几何的基本问题,同时在图像处理和统计学中也有应用。
寻找凸包的原理:
假定在S的凸包内部取一个点X,然后从X向下画一条垂直线,也跳垂直线与X和S的第i个点的连线之间
有一个逆时针夹角,称为极角,然后按照极角非递减次序来排列S的点,对于极小相同的点,按照他们
与X的距离从小到大来排列。
从X向下的垂线沿逆时针扫描,按照极角的次序会依次遇到S的极点。如果u,v,w是三个按逆时针排列
的三个连续的极点,那么如果从u到v和从w到v两条连线之间的逆时针夹角大于180度。如果两条连线
之间的夹角小于180度,则第二个点不是极点。
一般选取y最小的点,多个y最小的话,选取其中x最小的点,作为p0,选取好p0后就可以开始选取X了
X不要求是S中的点,是任意的点,一般选在S的中心保证p0是第一个点。
伪代码:
步骤一【处理退化情况】
如果S的点少于3个,则返回S
如果S的所有点都在一条直线上,即共线,则计算并返回包含S所有点的最短直线的两个端点。
步骤二:【按极角排序】
在S的凸包内找到一个点X
按照极角递增次序来排列S的点,对于极角相同的点,按照它们与X的距离从小到大来排列创建一个
以S的点为元素,按照上述顺序排列的双向循环链表
另right指向后继,left指向前驱。
步骤三:【删除非极点的点】
另p是y坐标最小的点(也可以是x坐标最大的)

for(x=p,rx=x右边的下一个点;p!=rx)
        {
            rrx=rx右边的点;
            if(x,rx,和rrx的逆时针夹角小于或等于180)
            {
                从链表中删除rx;
                rx=x;x=rx左边的点;
            }
            else{x=rx;rx=rrx;}
        }

————————————————

凹多边形:
(Concave Polygon)可以有以下三种定义方式:
1、至少有一个优角(Reflexive Angle)的多边形。(例如下图中,∠CDE>180°)
2、把一个各边不自交的多边形任意一边向两方无限延长成为一直线,如果多边形
其他各边不在此直线的同旁(如下图左),那么这个多边形就叫做凹多边形。
3、凹多边形的是一个内部为非凸集的简单多边形.简单多边形的下列性质与其凸性等价。
(1)一个内角大于180度。
(2)存在两个顶点间的线段位于多边形的外部。
(3)多边形内存在两个点,其连线不全部在多边形内部。
在这里插入图片描述
示例:

五角星、四角星、八角星、六角形等都是凹多边形:例如,正六角星中,有一个240°
的角。

性质:

1、平面上,不可能存在凹三角形。
2、凹多边形的内角和的解,应该通过(n-2)180°来计算。实际上是把大于平角
使得任意一个凹N多边形,都可分画为N-2个三角形,因此凹多边形的内角和也适用于(N-2)180°这个公式。不可以沿着一条边的延长线切割凹多边形。
3、平面上,凹多边形与边数相同的凸多边形的内角和相等。
在这里插入图片描述
凹多边形内角和的计算方法: 任意一个凸 (或凹) N 多边形 ,都可分画为 N-2 个三角形 ,
因此凹多边形的内角和 ,也适用( N-2 ) 180° 这个公式
凹多边形的外角和是: 360+ 大于 180 度的内角的个数 *180

原文链接:https://blog.csdn.net/Du_Shuang/article/details/81083662

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在MATLAB中绘制多个连通区域的最小凸多边形,可以按照以下步骤进行: 1. 首先,使用图像处理的方法将图像转换为二值图像,即将连通区域中的像素值设置为1,其他非连通区域的像素值设置为0。 2. 接着,利用MATLAB内置函数regionprops来获取连通区域的属性,包括每个连通区域的像素索引。 3. 对于每个连通区域,使用convhull函数来计算出最小凸多边形的顶点索引。convhull函数使用凸包算法,将给定的点云集合转换为最小凸多边形的顶点索引。 4. 最后,使用plot函数将每个连通区域的最小凸多边形绘制出来。可以循环处理每个连通区域的顶点索引,将其连接成闭合的凸多边形。 下面是一个简单的示例代码: ```matlab % 假设已经有了一个二值图像bw_image,包含了多个连通区域 % 获取连通区域属性 cc = bwconncomp(bw_image); props = regionprops(cc, 'PixelIdxList'); % 绘制每个连通区域的最小凸多边形 figure; hold on; for i = 1:cc.NumObjects pixelIdxList = props(i).PixelIdxList; [row, col] = ind2sub(size(bw_image), pixelIdxList); % 计算最小凸多边形的顶点索引 k = convhull(col, row); % 绘制最小凸多边形 plot(col(k), row(k), 'r'); end hold off; ``` 以上代码将绘制出每个连通区域的最小凸多边形,其中bw_image是一个二值图像,表示了多个连通区域。每个连通区域的最小凸多边形将用红色线条绘制出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值