开发了一个模块,可用来计算平面一些点所构成的凸包。模块名为ConvexHull.dll。
使用方法是这样的,新建一个WinForm工程(控制台工程也行,只是输出结果不大直观),引用ConvexHull.dll,然后在Form1代码中引用模块的命名空间:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->using Hiquotion.ComputingGeometry;
模块中包含一个类ConvexHull,用这个类声明一个对象,然后用平面点的集合类(Points)实例化:
实例化
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> private ConvexHull ch;
private Points p = new Points();
p.Add(new CGPoint(10, 10));
p.Add(new CGPoint(30, 50));
p.Add(new CGPoint(10, 30));
p.Add(new CGPoint(20, 70));
p.Add(new CGPoint(30, 20));
p.Add(new CGPoint(50, 20));
p.Add(new CGPoint(50, 30));
p.Add(new CGPoint(20, 55));
p.Add(new CGPoint(60, 10));
ch = new ConvexHull(p);
然后就可以调用ConvexHull的方法GetConvexHull()来获取凸包了。这个方法返回一个Points对象,表示凸包顶点的集合。下面的代码可以获取凸包顶点。
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> private Points l = new List<CGPoint>();
l = ch.GetConvexHull();
为了测试结果是否正确,我们在窗体上绘制点集中所有的点,然后把凸包顶点用闭合的直线段连接起来。绘制的实现是在Form1的OnPaint方法中,可以参考《C#高级编程(第六版)》
测试
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> private PointF[] pointf;
pointf = new PointF[l.Count];
for (int i = 0; i < l.Count; i++)
{
pointf[i] = new PointF(l[i].X, l[i].Y);
}
Graphics dc = e.Graphics;
Pen redPen = new Pen(Color.Red, 3);
redPen.Brush = new SolidBrush(Color.Red);
foreach (CGPoint pt in p)
{
dc.FillEllipse(redPen.Brush, new RectangleF(pt.X - 2.5F, pt.Y - 2.5F, 5, 5));
}
Pen bluePen = new Pen(Color.Blue, 2);
dc.DrawPolygon(bluePen, pointf);
测试结果如下图所示。
分享到:
相关推荐
完整凸包算法,标准C++编译,包含注释完整有效,内涵博客链接。
凸面船体 该模块提供了确定一组地理坐标(纬度和经度)的凸包的功能。 单位应以度为单位。 返回值是经度和纬度坐标的数组。...var convexHull = calculateConvexHull ( points ) ; 归因 从这里进行最小的修改: :
计算几何中,计算点集凸包,使用方便,结果可靠!
convex_hull: 最早,最经典的凸包论文 描述了凸包的原理,算法以及其证明
ConvexHull2D 一个周末项目,使用 C++ 和标准库实现各种算法以查找一组 2D 点的凸包。 包括 Graham 的扫描、礼品包装算法、单调链算法和 QuickHull。 为清楚起见,代码没有考虑重复或共线的点。
凸包 Python中的ConvexHull算法可视化
实现凸包实现,采用MATLAB编写代码,用于凸包算法的快速实现。
例子 var convexHull = require ( './convexhull.js' ) ;// Create some initial points.var initialPoints = [ { x : 10 , y : 10 } , { x : 50 , y : 10 } , { x : 5 , y : 30 } , { x : 50 , y : 60 } , ] ;// ...
Melkman的凸包算法 We describe an algorithm, due to Melkman (and based on work by many others), which computes the convex hull of a simple polygonal chain (or simple polygon) in linear time.
实现了一个2维点集的凸包算法,其中用到快速排序。
处理这些退化更昂贵,因此如果您不需要这种行为,您应该使用常规convex-hull模块。 例子 var convexHull = require ( 'full-convex-hull' ) var points = [ [ 1 , 0 , 0 ] , [ 0 , 1 , 0 ] , [ 1 , 1 , 0 ] , [ 5 ...
凸包算法改进 对找到的现有凸包算法的改进 它解决了使用大数时的整数溢出问题。
凸包 Java 项目####Overview 这个程序找到一组给定点的凸包。 给定欧几里得平面中的 N 个点集,包含每个点的最小面积凸区域是凸包。想象这些点是垂直于平面的钉子,在所有点周围拉伸一个弹性橡皮筋;... ConvexHull
[V,I] = ConvexHull(InputData) 给出二维点集的凸包。 InputInputData是大小为Nx2的坐标矩阵。 第一列包含 xInputData ,第二列包含 yInputData : InputData = [xInputData'yInputData'] [V,I] = ConvexHull...
它使用 Graham's Scan 或 Jarvis' March 计算一组随机生成的点的凸包。 可以指定多次迭代来衡量两种算法的性能。 编译 javac *.java 跑步 java ConvexHull <points> <iterations> <display> <algorithm>
凸包算法
凸包(Convex Hull)是一个计算几何(图形学)中的概念。 在一个实数向量空间中,对于给定集合,所有包含的凸集的交集被称为的凸包。
CGAL模型凸包计算,利用CGAL计算几何算法库,解决了模型凸包运算问题。资源包含完整代码和详细说明文档。
opengl多边形顶点排序,凸包计算,路径绘制 opengl多边形顶点排序,凸包计算,路径绘制 opengl多边形顶点排序,凸包计算,路径绘制
两种凸包的计算方法,源代码及工程文件,编译测试通过。