`

Convex Hull Algorithm

 
阅读更多

Convex hull: the smallest polygon that covers all the points in the given set.

Application: Farthest pair problem, shortest Path across the boundary.

Algorithm: Find the point with the lowest y-coordinates p, then iterate through all the points in the order of polar-angle relative to the p. Check if they can form a counter clock wise angle with the previous point, if so include it in the context hull, otherwise discard it. There is a video clip explaining the convex hull algorithm

https://www.youtube.com/watch?v=0HZaRu5IupM

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Stack;
 
 
public class ConvexHull {
    //assume no duplicate points 
    public static void main(String [] args) {
        ArrayList<Point> points = new ArrayList<Point> ();
        points.add(new Point(0, 0));
        points.add(new Point(1, 1));
        points.add(new Point(3, 10));
        points.add(new Point(8, 7));
        points.add(new Point(11, 8));
        points.add(new Point(12, 1));
        ArrayList<Point> result = new ArrayList<Point>();
        //check if there are more than three points in the array
        if (points.size() < 3) {
            System.out.println("Too few points");
            return;
        }
         
        //find the point with the lowest y
        int oIndex = 0;
        for (int i = 1; i < points.size(); i++) {
            if (points.get(i).y < points.get(oIndex).y)
                oIndex = i;
        }
        //remove the origin points and put it into the stack
        final Point origin = points.get(oIndex);
        points.remove(oIndex);
         
        //stack that we use to iterate through the 
        Stack<Point> hullStack = new Stack<Point>();
        hullStack.push(origin); //put origin point in stack
        //sort the points according to their polarity relative to origin
        Collections.sort(points, new Comparator<Point>() {
            @Override
            public int compare(Point p1, Point p2) {
                float polar1 = getPolar(origin, p1);
                float polar2 = getPolar(origin, p2);
                if (polar1 > polar2)
                    return -1;
                else if (polar1 < polar2)
                    return 1;
                return 0;
            }       
        });
        //add origin to as the last element
        points.add(origin);
        for (Point p : points) {
            Point pre = hullStack.pop();
            while(!hullStack.isEmpty() && !isLeftTurn(hullStack.peek(), pre, p)) {
                pre = hullStack.pop();//discard the pre and take new top of the stack as pre
            }
            hullStack.push(pre);
            hullStack.push(p);
        }
        //remove the duplicate origin
        hullStack.pop();
        while(!hullStack.isEmpty()) {
            result.add(hullStack.pop());
        }
    }
     
    private static float getPolar(Point start, Point end) {
        //get the cosin between end and start
        float r = ((end.x - start.x)*(end.x - start.x) + (end.y - start.y)*(end.y - start.y));
        return (float) ((end.x - start.x)/Math.pow(r, 0.5)); 
    }
     
    private static boolean isLeftTurn(Point a, Point b, Point c) {
        if ((c.y - a.y)/(c.x - a.x) > (b.y - a.y)/(b.x - a.x))
            return true;
        return false;
    }
}

  

The above program shows an way get a convex hull from a set of points.
The running time is dominated by the sorting so it is nlogn.

Two things need to pay attention:
1. the original point is the one with the lowest y coordinate. So all the other point was above it. We want the points to be sorted according to the polar angle relative to the original point, in the order of counterclockwise. So we should use cosin which on the uppper part of coordinate system, decrease in the order of counterclock direction.

2. To find out whether we make a left (counter clock wise) turn in a three point a->b->c, there is a simple way. We should check if (c.y – a.y)*(b.x – a.x) – (b.y – a.y)*(c.x – a.x). If it is equals to 0, then a, b and c are on the same line. if positive, it is making a left turn, otherwise it is making a right turn.

 

From:

https://hellosmallworld123.wordpress.com/2014/08/01/convex-hull-algorithm/

分享到:
评论

相关推荐

    Melkman's Convex Hull Algorithm

    ### Melkman's Convex Hull Algorithm #### 概述 Melkman的凸包算法是一种高效计算简单多边形链(或简单多边形)的凸包的线性时间算法。该算法由Arieh D. Melkman提出,并基于前人工作的基础上发展而来。在计算机...

    Straightness of a set of points from excelusing Convex Hull algorithm:Straightness of a set of points from Matlab using Convex Hull algorithm-matlab开发

    首先,让我们了解什么是直线度,接着我们将详细介绍 MATLAB 中的凸包(Convex Hull)算法,以及如何通过这个算法来评估点集的直线度。 直线度是一个几何概念,它衡量了多点分布的线性程度。在工程和科学领域,例如...

    ConvexHull-main.zip

    本项目"ConvexHull-main.zip"显然关注的是如何在编程中实现凸包算法。 在二维平面上,常见的凸包算法有格雷码顺序( Graham's Scan)、 Jarvis March( Gift Wrapping 或者是 Convex Hull Trick)以及 Andrew's ...

    ConvexHull_Test.rar_The Four

    这个"ConvexHull_Test.rar_The Four"的标题和描述似乎指的是一个与四边形相关的凸包测试,可能是一个编程项目或算法实现。 在描述中,“rotate all four until the two points are horizontal”这部分可能是指处理...

    convexHull

    "convexHull"通常指的是找到一个给定集合中的最小凸多边形,该多边形包含了所有点。这个过程被称为计算凸包。在本场景中,我们讨论的是使用C++语言实现这个算法。 C++是一种强大且灵活的编程语言,它提供了丰富的库...

    TuBao.rar_convex hull Visual C_凸包_凸包2_快速凸包_点集凸包

    在计算机科学领域,凸包(Convex Hull)是几何计算中的一个重要概念,它是指一个包含在二维或三维空间中所有点的最小凸多边形。在这个项目“TuBao.rar”,作者实现了一个针对2维点集的凸包算法,特别强调了使用快速...

    ConvexHull:计算一组随机点的凸包

    凸包 这个程序是我为 CSCE 411: Design and Analysis of Algorithms 开发的。 它使用 Graham's Scan 或 Jarvis' March 计算一组随机生成的点的凸包。... java ConvexHull &lt;points&gt; &lt;iterations&gt; &lt;display&gt; &lt;algorithm&gt;

    convexhull.zip_matlab例程_Dev_C++_

    C++ Implementation of the convex-hull algorithm for a list of 2D points. Based on the quick-hull algorithm.

    参加ACM大赛应该准备哪些课程?.pdf

    8.(convex hull algorithm) 数学 / 数论 1. 欧几里德算法 2. 扩展的欧几里德算法 3. 同余方程 / 二元一次不定方程 4. 线性方程组 5. 高斯消元法 6. 矩阵行列式的计算 7. 利用矩阵乘法快速计算 8. 递推关系 9. 分数...

    1471-2105-10-4.pdf

    4. **凸包算法**(Convex Hull Algorithm):适用于复杂背景信号的基线校正。 5. **Savitzky-Golay滤波**:通过拟合局部多项式来实现平滑处理,进而提高峰检测的准确性。 这些算法被应用于模拟数据和实际的MALDI-MS...

    Data Structures and Algorithms with Python

    - 凸包算法(Convex Hull Algorithm) - 最近点对问题(Closest Pair of Points Problem) #### 四、适用对象 - 对于初学者来说,《数据结构与算法使用Python》提供了从零开始学习数据结构和算法的基础知识,帮助...

    The Quickhull algorithm for convex hulls 快速凸包生成算法

    在"The Quickhull algorithm for convex hulls"这篇文献中,作者深入探讨了算法的细节,包括算法的实现、性能分析以及与其他凸包算法(如Graham扫描和 Jarvis步进)的比较。文献可能还涵盖了如何处理特殊情况,例如...

    ACM计算几何源码

    凸包算法 (Convex Hull Algorithm) #### 概述 凸包是计算几何中的一个基础问题,旨在找到一组点构成的最小凸多边形,使得所有的点都在这个多边形内部或边界上。在ACM竞赛和实际应用中都非常常见。 #### Graham...

    python 实现 分治法 (Divide-and-conquer algorithm) 课程设计 代码

    Convex Hull Heaps Algorithm Heaps Algorithm Iterative Inversions Kth Order Statistic Max Difference Pair Max Subarray Sum Mergesort Peak Power 最近的一对点 凸包 堆算法 堆算法迭代 第 K...

    凸包算法 matlab程序

    首先,**凸包算法**(Convex Hull Algorithm)是指在一组给定点中找到最小凸多边形,该多边形包含所有点。在二维空间中,这个多边形就是包围这些点的最小子集边界。常见的凸包算法有 Graham扫描、Jarvis步进法、...

    Algorithm-Visualizer:使用React App可视化算法。 包括排序,寻路和凸包可视化器

    该网站可用于可视化多种算法,包括排序,寻路和ConvexHull。 您可以在这里访问它: : 演算法 排序 选择排序 合并排序 快速排序 寻找路径 Dijkstra的算法 凸包 格雷厄姆的扫描 安装 在计算机上安装Node 从克隆此...

    The Algorithm Design Manual (2rd Edition)

    17.2 Convex Hull 17.3 Triangulation 17.4 Voronoi Diagrams 17.5 Nearest Neighbor Search 17.6 Range Search 17.7 Point Location 17.8 Intersection Detection 17.9 Bin Packing 17.10 Medial-Axis ...

    Sparse Subspace Clustering: Algorithm, Theory, and Applications

    具体来说,可以使用L1范数的凸包(convex hull),即L1范数本身作为替代目标函数。 ##### 谱聚类 一旦获得了稀疏表示矩阵,SSC使用谱聚类方法来推断数据点所属的子空间。谱聚类是一种基于图论的技术,它通过构建一...

    求随机离散点的凸包边界

    凸包问题有多种解决方法,其中最为人知的是格拉姆-舒勒米(Graham's Scan)、 Jarvis March( Gift Wrapping 或者是 Convex Hull wrapping)以及 Andrew's Monotone Chain Algorithm。这些算法都旨在高效地找出点集的...

Global site tag (gtag.js) - Google Analytics