用c++实现凸包问题、扩展欧几里得算法

6.4.2 凸包问题

【问题】设S={(x1,y1), (x2, y2), ···,(xn, yn)}是平面上n个点构成的集合,凸包问题(convex hull problem)要求找出集合 S 的最小凸多边形


【想法】设p1=(x1,y1),p2=(x2,y2),…,pn=(xn,yn)按照x轴坐标升序排列,则最左边的点p1和最右边的点pn,一定是该集合的凸包极点,如图 6-14所示。设p1pn是经过点p1和pn的直线,这条直线把集合S分成两个子集:S1是位于直线上侧和直线上的点构成的集合,S2是位于直线下侧和直线上的点构成的集合。S1的凸包由下列线段构成:以p1和pn为端点的线段构成的下边界,以及由多条线段构成的上边界,这条上边界称为上包(upper envelope)。类似地,S2中的多条线段构成的下边界称为下包(lower envelope)。整个集合S 的凸包是由上包和下包构成的。由此得到凸包问题的分治策略:
(1)划分:设p1pn是经过最左边的点p1和最右边的点pn的直线,则直线p1pn把集合S 分成两个子集S1和S2。
(2)求解子问题:求集合S1的上包和集合S的下包。
(3)合并解:求解过程中得到凸包的极点,因此,合并步骤无须执行任何操作。
        下面讨论如何求解子问题。对于集合 S1首先找到 S1中距离直线p1pn,最远的点Pmax如图6-15所示。S1中所有在直线p1pmax上侧的点构成集合 S1,1,S1中所有在直线pmaxpn上侧的点构成集合S1,b2,包含在三角形pmaxp1pn之中的点可以不考虑了。递归地继续构造集合S1,1的上包和集合S1,2的上包ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值