美文网首页
算法 & 数据结构——最大凸包生成

算法 & 数据结构——最大凸包生成

作者: 落单的毛毛虫 | 来源:发表于2017-11-15 14:45 被阅读0次

记录一个最大凸多边形生成算法:通过随机顶点,生成一个包含所有顶点的凸多边形。

多边形生成算法

通过随机顶点,生成一个连接所有顶点的多边形

算法思路:

找到出于平面坐标最下面的顶点,以这个顶点为中心,对其他顶点依据角度进行排序。排序完成后,多边形就已经生成了。

C++实现:

void PolygonHull(std::vector<POINT> & points)
{
    auto val = *std::min_element(points.begin(), points.end(), [](const POINT & p1, const POINT & p2) 
        { 
            return p1.y < p2.y || p1.x < p2.x;
        });

    std::sort(points.begin(), points.end(), [&val](const POINT & p1, const POINT & p2)
        {
            auto a1 = GetAngle(val, p1), l1 = GetLengthSqr(p1 - val);
            auto a2 = GetAngle(val, p2), l2 = GetLengthSqr(p2 - val);
            return a1 < a2 || a1 == a2 && l1 < l2;
        });
}

最大凸包生成算法

算法思路:

在多边形算法的基础上,进行以下操作:

  • 1 将集合第一个顶点 p0 和第二个顶点 p1 压栈,将 p2 指向第三个顶点
  • 2 如果集合没有遍历完,则跳到步骤3,否则跳到步骤6
  • 3 判断 p2 处于 p0p1 的左边则跳到步骤4,否则跳到步骤5
  • 4 将 p2 压栈,p0,p1,p2各前进1步,跳到步骤2
  • 5 将 p1 出栈,跳到步骤2
  • 6 算法结束

C++实现:

std::vector<POINT> ConvexHull(std::vector<POINT> & points)
{
    auto val = *std::min_element(points.begin(), points.end(), [](const POINT & p1, const POINT & p2) 
        { 
            return p1.y < p2.y || p1.x < p2.x;
        });

    std::sort(points.begin(), points.end(), [&val](const POINT & p1, const POINT & p2)
        {   
            auto a1 = GetAngle(val, p1), l1 = GetLengthSqr(p1 - val);
            auto a2 = GetAngle(val, p2), l2 = GetLengthSqr(p2 - val);
            return a1 < a2 || a1 == a2 && l1 < l2;
        });

    std::vector<POINT> set;
    auto iter = points.cbegin();
    set.push_back(*iter++);
    set.push_back(*iter++);
    while (iter != points.cend())
    {
        auto & p0 = *(set.cend() - 2),
             & p1 = *(set.cend() - 1),
             & p2 = *iter;
        if (0 > Corss(p1 - p0, p2 - p1))
            set.pop_back();
        else 
            set.push_back(*iter++);
    }
    return set;
}

相关文章

  • 算法 & 数据结构——最大凸包生成

    记录一个最大凸多边形生成算法:通过随机顶点,生成一个包含所有顶点的凸多边形。 多边形生成算法 通过随机顶点,生成一...

  • 算法复习-geometric algo

    convex hull 凸包-video25&video26 凸包算法剖析https://cyw3.github....

  • 凸包算法

    R版本 python版本

  • 凸包算法

    凸包点集的性质 凸包点集中,取出相邻的两个点所构成的边一定能将所有点分割在一边,而另一边并无任何点。 若我们可以按...

  • 求解2维凸包问题

    参照《数据结构、算法与应用(c++语言描述)》书中的算法,2维凸包求解分为三步: 处理退化情况(点集S的个数小于等...

  • Python3 趣味系列题8 ------ 凸包动态绘制

    本文介绍利用Graham Scan算法获得凸包(平面凸包),并动态展示凸包的形成过程。下面用比较通俗的语言,介绍下...

  • 凸包

    凸包最常用的凸包算法是Graham扫描法和Jarvis步进法Graham's Scan法这个算法是由数学大师葛立恒...

  • 提取平面点云的轮廓

    一. 基于凸包的凹点挖掘算法: 1. 提取点云的凸包 2. 计算凸包每条边的顶点的点密度(即该点 K 个临...

  • Jarvis步进凸包算法

    凸包算法作为计算几何的基础和核心问题足以引起重视.这里给出Jarvis步进算法的Python实现.测试环境是Ubu...

  • 《算法》笔记 11 - 最小生成树

    最小生成树的应用 切分定理 贪心算法 加权无向图的数据结构 Prim算法 Kruskal算法 最小生成树的应用 加...

网友评论

      本文标题:算法 & 数据结构——最大凸包生成

      本文链接:https://www.haomeiwen.com/subject/rtncvxtx.html