当前位置: 首页 > news >正文

德化住房和城乡建设网站长沙正规seo优化价格

德化住房和城乡建设网站,长沙正规seo优化价格,电子商务以后可以做什么工作,南京整站优化C#实现凸包算法之Jarvis 文章目录 C#实现凸包算法之Jarvis前言示例代码实现思路测试结果结束语 前言 这篇关于凸包算法的文章,本文使用C#和Jarvis算法来实现凸包算法。 首先消除两个最基本的问题: 什么是凸包呢? 凸包是一个包围一组点的凸多…

在这里插入图片描述

C#实现凸包算法之Jarvis

文章目录

  • C#实现凸包算法之Jarvis
    • 前言
    • 示例代码
    • 实现思路
    • 测试结果
    • 结束语

前言

这篇关于凸包算法的文章,本文使用C#和Jarvis算法来实现凸包算法。
首先消除两个最基本的问题:

  1. 什么是凸包呢?
    凸包是一个包围一组点的凸多边形。凸多边形是指多边形中的每个内角都小于180度的多边形。
  2. 凸包算法有什么用呢?
    凸包算法的作用是找到这个凸多边形,并且使用最少的点来绘制出它的轮廓。凸包算法在计算机图形学、计算几何和机器学习等领域中有着广泛的应用。

示例代码

现在来看一下C#中的Jarvis算法是如何实现凸包算法的:

        /// <summary>/// 通过Jarvis算法获取围绕所有点的凸多边形的轮廓点<br/>/// </summary>/// <param name="points">点数组</param>/// <returns>轮廓点数组</returns>public static PointD[] GetConvexHullByJarvis(PointD[] points){if (points.Length < 3){throw new ArgumentException("凸包算法需要至少3个点");}List<PointD> pointList = new List<PointD>(points);// 找到最左边的点PointD leftmostPoint = pointList[0];for (int i = 1; i < pointList.Count; i++){if (pointList[i].X < leftmostPoint.X){leftmostPoint = pointList[i];}}// 使用栈来存储凸包的点Stack<PointD> hull = new Stack<PointD>();PointD currentPoint = leftmostPoint;do{hull.Push(currentPoint);PointD endpoint = pointList[0];for (int i = 1; i < pointList.Count; i++){if (endpoint.Equals(currentPoint) || Cross(currentPoint, endpoint, pointList[i]) < 0){endpoint = pointList[i];}}currentPoint = endpoint;pointList.Remove(currentPoint);} while (!currentPoint.Equals(leftmostPoint));return hull.ToArray();}

上面代码中定义了一个名为GetConvexHullByJarvis的静态方法,该方法接受一个PointD类型的数组作为输入参数,并返回一个PointD类型的数组,表示围绕所有点的凸多边形的轮廓点。

补充一下,关于示例中使用到的Cross方法和PointD类型的源代码如下:

        /// <summary>/// 计算从 a 到 b 再到 c 的叉积/// </summary>/// <returns>叉积值</returns>private static double Cross(PointD a, PointD b, PointD c){return (b.X - a.X) * (c.Y - a.Y) - (b.Y - a.Y) * (c.X - a.X);}
    public struct PointD {public PointD(double x, double y) {X = x;Y = y;}public double X { get; set; }public double Y { get; set; }public override bool Equals(object obj){if (obj == null || GetType() != obj.GetType()){return false;}PointD other = (PointD)obj;return X.Equals(other.X) && Y.Equals(other.Y);}}

实现思路

  1. 找到最左边的点,将它放入凸包中;
  2. 找到在当前点的右侧且离当前点最远的点,将它放入凸包中;
  3. 重复这个过程,直到回到最左边的点,形成一个闭合的凸多边形。

这就是 Jarvis 算法的基本思路。

需要注意的是,当点集中存在大量共线的点时,Jarvis 算法的时间复杂度可能会退化到 O(n^2) 级别,因为需要不断地扫描点集中的点来找到下一个点。此外当点集中存在大量重复的点时,Jarvis 算法可能会陷入死循环,因此需要对点集进行去重操作。


测试结果

用于测试的数据点:

        static PointD[] points = new PointD[]{   new PointD(0, 0),new PointD(0, 10),new PointD(10, 10),new PointD(10, 0),new PointD(1, 0),new PointD(4, 3),new PointD(5, 2),new PointD(6, 5),new PointD(4, 9),new PointD(4, 2),new PointD(5, 1),new PointD(6, 5),new PointD(1, 3),new PointD(7, 2),new PointD(8, 2),new PointD(6, 7),new PointD(8, 5),new PointD(9, 3),new PointD(7, 8),new PointD(8, 9),};

测试代码如下:

        [TestMethod]public void GetConvexHullByJarvis(){Console.WriteLine("Jarvis 算法");PrintPoints(ConvexHull.GetConvexHullByJarvis(points));}private void PrintPoints(PointD[] points){Console.WriteLine(points.Select(p => $"  ({p.X}, {p.Y})").Join("\r\n"));}

执行结果如下:
在这里插入图片描述


结束语

通过本章的代码可以轻松实现Jarvis算法并找到一组点最外侧的凸多边形。如果您觉得本文对您有所帮助,请不要吝啬您的点赞和评论,提供宝贵的反馈和建议,让更多的读者受益。

http://www.hengruixuexiao.com/news/47185.html

相关文章:

  • 男女激烈做羞羞事网站福州网站关键词推广
  • 网络工程师 网站建设推广网站多少钱
  • 手机公众平台网站开发网络营销推广策略有哪些
  • 北龙中网 可信网站验证 费用网络营销的培训课程
  • 做旅游网站图片哪里找seo3的空间构型
  • 新网站如何做推广软文在线代理浏览国外网站
  • 做h5最好的网站营销网站建设流程
  • 网站开发系统搭建推广方式有哪些?
  • 自己网站建设要维护优秀网站seo报价
  • 男女之间做那些事情视频网站百度推广图片
  • 晋中推广型网站建设如何在百度上发布自己的广告
  • 广州网站开发设计公司saas建站平台
  • 计算机培训班出来好找工作吗合肥网站优化搜索
  • 新疆网站备案 麻烦说说seo论坛
  • 学院管理网站建设百度下载免费安装
  • 网站怎么做移动图片今日军事新闻最新消息
  • 通州上海网站建设seo优化培训机构
  • 学院网站建设目的与意义seo网站外链平台
  • 百度做的网站 如果不做推广了 网站还保留吗百度竞价怎么收费
  • 大学生创新创业大赛的意义长沙网站托管seo优化公司
  • 安康市信息平台郑州seo哪家专业
  • 网站建设企业的未来发展计划百度账号管家
  • 西安专业网站建设公司南宁seo标准
  • 休闲旅游产品营销网站的建设策略seo关键词有话要多少钱
  • 东莞家具行业营销型网站建设多少钱短视频seo优化排名
  • h5网站怎么做的吗外贸网站建设优化推广
  • 如何得到网站后台权限同城推广有什么平台
  • eclipse视频网站开发关键词优化计划
  • 黄浦网站制作放单平台大全app
  • 中国制造网国际站网址谷歌seo优化怎么做