凸包问题(Graham扫描法)

本文介绍了使用Graham扫描法解决凸包问题的详细步骤。首先找到点集中最下面的点作为极点,然后计算其他点相对于极点的极角,并按极角升序排序。通过比较点之间的相对位置,动态维护凸包上的点,最终得到凸包上的极点。算法涉及点的坐标、向量叉积、余切值比较等概念。
摘要由CSDN通过智能技术生成
/**
凸包问题 —— Graham扫描法:
    找出点集p[]中最下面的点(有多个时取最左边的),以该点为极点,求出其他所有点的极角,
显然,极角范围为 [0, 180)度,对这些点按极角的升序排序,也就是按极角的余切值降序排列,
先把极点和排序后的第一个点和第二个点入栈,再一次循环(i = 3 -> n-1),若栈顶的两个点和
当前的点p[i]这三点连线的方向向顺时针方向偏转,则栈顶元素出栈,直到向逆时针方向偏转或者
栈内只有2个元素了,就把当前点p[i]入栈。
最后栈中的元素就是所要求的凸包上的点,这里指的是凸包的极点(直线上的非端点不是凸包的极点)
**/

struct point
{
    double x, y, dx, dy;

    point(): x(0), y(0), dx(0), dy(0){}
    void setDxDy(int x0, int y0)
    {
        dx = x - x0;
        dy = y - y0;
    }
    /* 设当前点为p,若向量<p,p1>到向量<p1,p2>的转角为逆时针,则返回true,
       若为顺时针或夹角为0,则返回false。
       这里用向量叉积来判断,向量叉积大于0则返回true.           */
    bool mult(point p1, point p2)
    {
        return (p1.x - x)*(p2.y - p1.y) > (p2.x - p1.x)*(p1.y - y);
    }
    // 余切值大的小,余切值相等时距离极点近的小
    bool operator < (const point &p) co
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值