http://www.algorithmist.com/index.php/Monotone_Chain_Convex_Hull.java
/* This is an implementation of Monotone Chain Convex Hull algorithm in Java.
* It takes O( NlogN ) in sorting & O(N) in actual convex hull finding for N points.
* Author - Nikhil Garg
* Email - nikhilgarg28@gmail.com
* This code is not heavily commented. To understand it, refer to pseudocode.
*/
class Point implements Comparable<Point>
{
int x,y;
Point(int x, int y)
{
this.x = x;
this.y = y;
}
// sort first on x then on y
public int compareTo(Point other)
{
if( x == other.x)
return y - other.y;
else
return x - other.x;
}
// cross product of two vectors
public int cross( Point p)
{
return x * p.y - y * p.x;
}
// subtraction of two points
public Point sub( Point p)
{
return new Point( x - p.x, y - p.y );
}
}
public Point[] findHull( Point[] points)
{
int n = points.length;
Arrays.sort( points);
Point[] ans = new Point[2 * n]; // In between we may have a 2n points
int k = 0;
int start = 0; // start is the first insertion point
for(int i = 0; i < n; i ++) // Finding lower layer of hull
{
Point p = points[i];
while( k - start >= 2 && p.sub( ans[k-1] ).cross(p.sub( ans[k-2] ) ) > 0 )
k--;
ans[k++] = p;
}
k--; // drop off last point from lower layer
start = k ;
for(int i = n-1 ; i >= 0 ; i --) // Finding top layer from hull
{
Point p = points[i];
while( k - start >= 2 && p.sub( ans[k-1] ).cross(p.sub( ans[k-2] ) ) > 0 )
k--;
ans[k++] = p;
}
k--; // drop off last point from top layer
Point [] ret = new Point[k]; // ret would contain our convex hull to be returned.
for(int i = 0 ; i < k; i++)
ret[i] = ans[i];
return ret;
}
分享到:
相关推荐
3D-Convex-hull.zip文件可能包含了一个用于计算3D凸壳的项目或者库,名为"Convex-hull-master",这通常是由编程语言实现的算法,用于处理和分析三维数据。 3D凸壳的计算通常用于多种领域,如几何造型、碰撞检测、...
在计算机科学和图形学中,凸包(Convex Hull)是一个重要的概念,它是包含所有点的最小凸多边形。在MATLAB中实现凸包算法,可以有效地处理一系列几何问题,如碰撞检测、图像处理和机器学习等。本教程将详细介绍如何在...
在给定的"java-convexhull"项目中,开发者针对凸包算法进行了优化,特别是针对处理大数时的整数溢出问题。 凸包算法有很多种实现方式,如 Graham's Scan、 Jarvis March(Gift Wrapping) 和 Andrew's Monotone ...
"monotone-chain-convex-hull"是一个专为前端设计的开源库,其核心功能是实现二维平面上点集的单调链凸壳算法。这个算法是计算机图形学中的一个重要概念,尤其在路径规划、碰撞检测以及几何计算等领域有广泛应用。 ...
本项目"ConvexHull-main.zip"显然关注的是如何在编程中实现凸包算法。 在二维平面上,常见的凸包算法有格雷码顺序( Graham's Scan)、 Jarvis March( Gift Wrapping 或者是 Convex Hull Trick)以及 Andrew's ...
2. `ConvexHull.h`/`ConvexHull.cpp`: 包含计算凸包的主算法,可能会使用到Graham's Scan或Andrew's Monotone Chain。 3. `main.cpp`: 主程序,用于读取点的数据,调用凸包算法,然后输出结果。 在实际应用中,凸包...
ConvexHull2D 一个周末项目,使用 C++ 和标准库实现各种算法以查找一组 2D 点的凸包。 包括 Graham 的扫描、礼品包装算法、单调链算法和 QuickHull。 为清楚起见,代码没有考虑重复或共线的点。
在计算机科学领域,凸包(Convex Hull)是几何计算中的一个重要概念,它是指一个包含在二维或三维空间中所有点的最小凸多边形。在这个项目“TuBao.rar”,作者实现了一个针对2维点集的凸包算法,特别强调了使用快速...
这样的作业可能会要求学生实现不同的凸包算法,例如 Graham's Scan、 Jarvis March(Gift Wrapping)、QuickHull 或 Andrew's Monotone Chain 等,并对比它们的效率和准确性。 在标签中,“convex hall”可能是输入...
3. **Andrew's monotone chain算法**:这是一种改进的Graham扫描,先将点按x坐标排序,然后分为左链和右链,分别进行Graham扫描,最后合并两链。这种方法更适合大规模数据集。 对于3D空间的凸包,虽然题目中提到"3D...
在本问题中,我们关注的是二维平面上的点集及其凸包(Convex Hull)的概念。凸包可以被理解为一个最小的多边形,该多边形包含了所有给定点,并且任何通过多边形内部的直线都会与多边形的边界至少有两个交点。这个...
在"Convex-Hull.Individual-practice-main"这个项目中,你可能会找到相关的代码示例、数据集以及练习题,这些都是你进行凸包实践的良好资源。通过实践,不仅可以理解凸包的基本原理,还能提升编程能力和解决实际问题...
在计算机科学领域,凸包(Convex Hull)是一种重要的几何概念,它在各种算法和问题中都有着广泛的应用,比如机器学习、图形学、路径规划等。这篇博客“学习凸包(三): 凸包练习 POJ 1113”显然是关于如何通过编程...
凸包问题有多种解决方法,其中最为人知的是格拉姆-舒勒米(Graham's Scan)、 Jarvis March( Gift Wrapping 或者是 Convex Hull wrapping)以及 Andrew's Monotone Chain Algorithm。这些算法都旨在高效地找出点集的...
在计算机科学中,凸包(Convex Hull)算法是一种重要的几何计算方法,它用于找到一组点在二维或高维空间中的最小凸多边形,这个多边形包含了所有的点。在给定的“编写的凸包算法”项目中,我们可以看到它是由C++语言...
Andrew算法是一种常用的计算凸包的方法,它基于Monotone Chain Convex Hull算法,首先对输入点进行排序,然后构建一个单调链,确保每个新点只可能添加到当前链的前端或后端。 3. **直线两点式转为一般式**: 在计算...
在`convexHull`这个文件中,可能包含了这两个算法的实现代码或者示例数据。通过分析这些文件,你可以更深入地理解这两种算法的工作原理,以及如何在实际编程中应用它们。 总的来说,生成凸多边形是计算机图形学中的...
在计算机图形学和几何计算领域,求取平面点集的凸多面体包围盒(Convex Hull)是一项基本且重要的任务。它涉及到一系列算法,这些算法可以找出一组二维平面上的点构成的最小凸多边形,这个多边形包含了所有的点。在C...
在计算机图形学和几何处理领域,凸包(Convex Hull)是一个重要的概念,它是指一个几何对象所有点的最小凸集合。在这个“tubao.zip”压缩包中,包含的是关于使用C++编程语言和MATLAB软件实现多边形凸包算法的相关...
在计算机科学领域,凸包(Convex Hull)是一种重要的几何概念,它对于各种算法和问题的解决具有广泛的应用。在二维空间中,给定一组点集,凸包可以被理解为这些点形成的一个最小的凸多边形,该多边形包含所有点,...