zoukankan      html  css  js  c++  java
  • 凸包计算模块ConvexHull的使用方法

    开发了一个模块,可用来计算平面一些点所构成的凸包。模块名为ConvexHull.dll。

    使用方法是这样的,新建一个WinForm工程(控制台工程也行,只是输出结果不大直观),引用ConvexHull.dll,然后在Form1代码中引用模块的命名空间:

    using Hiquotion.ComputingGeometry;

    模块中包含一个类ConvexHull,用这个类声明一个对象,然后用平面点的集合类(Points)实例化:

    实例化
            private ConvexHull ch;

            
    private Points p = new Points();

                p.Add(
    new CGPoint(1010));
                p.Add(
    new CGPoint(3050));
                p.Add(
    new CGPoint(1030));
                p.Add(
    new CGPoint(2070));
                p.Add(
    new CGPoint(3020));
                p.Add(
    new CGPoint(5020));
                p.Add(
    new CGPoint(5030));
                p.Add(
    new CGPoint(2055));
                p.Add(
    new CGPoint(6010));

                ch 
    = new ConvexHull(p);

    然后就可以调用ConvexHull的方法GetConvexHull()来获取凸包了。这个方法返回一个Points对象,表示凸包顶点的集合。下面的代码可以获取凸包顶点。

            private Points l = new List<CGPoint>();
                l 
    = ch.GetConvexHull();

    为了测试结果是否正确,我们在窗体上绘制点集中所有的点,然后把凸包顶点用闭合的直线段连接起来。绘制的实现是在Form1的OnPaint方法中,可以参考《C#高级编程(第六版)》

    测试
            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.5F55));
                }
                Pen bluePen 
    = new Pen(Color.Blue, 2);
                dc.DrawPolygon(bluePen, pointf);

    测试结果如下图所示。

     


    作者:海阔天

    欢迎转载!转载请注明出处:

    www.cnblogs.com/yxsylyh

  • 相关阅读:
    pytest05-参数化
    pytest04-conftest配置文件
    pytest03-fixture
    pytest02-setup和teardown
    SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static ,必须加锁,或者使用 DateUtils 工具类
    线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式
    线程资源最好通过线程池提供
    获取单例对象需要保证线程安全,其中的方法也要保证线程安全
    高度注意 Map 类集合 K / V 能不能存储 null 值的情况,如下表格
    使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历的好处
  • 原文地址:https://www.cnblogs.com/yxsylyh/p/UsingConvexHull.html
Copyright © 2011-2022 走看看