凸包算法(convex hull)

前言

今天学习了几何算法——凸包算法,听着名字很奇怪,不知道它是干什么的,但其实也很简单。下面来介绍一下这种凸包算法和其c++代码:

凸包算法

其实很简单,就是用一个的凸多边形围住所有的点。就好像桌面上有许多图钉,用一根紧绷的橡皮筋将它们全部围起来一样。算法详细步骤:

1. 找到所有点中纵坐标y最小的点,也就是这些点中最下面的点,记为p0。

2. 然后计算其余点与该点的连线与x轴之间夹角的余弦值,将这些点按其对于最低点的正弦值从大到小排序,排序好的点记为p1, p2, p3, ......

3. 将最低点p0和排序好的点中的第一个点p1压入栈中,然后从p2开始计算,计算栈顶两个点与该点三点向量是否是逆时针转动,若是,则将该点压入栈中,否则将栈顶元素推出。(此处对栈的概念不清楚可自行搜索)

4. 最后栈里面元素就是所有的凸包外围的点

判断是否为逆时针旋转

area = (b.x-a.x) * (c.y-a.y) - (b.y-a.y) * (c.x-a.x)

area >0,A-B-C逆时针旋转; 
area <0,A-B-C顺时针旋转; 
area =0,A-B-C在一条直线上。

来看看c++代码:

class mpoint{                       //class point(x, y)
public:
    double x;
    double 
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值