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

无锡做网站哪家公司好北京赛车网站开发河南

无锡做网站哪家公司好,北京赛车网站开发河南,成都专业的网站建站公司,网站后期维护合同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.yayakq.cn/news/951756/

相关文章:

  • 做网站开发有前途么免费php企业网站管理系统
  • wordpress多站点必备插件可以在手机上编程的软件
  • 婚恋网站设计网站建设用哪种语言
  • wordpress ajax请求seo优化推广技巧
  • 电商网站 网站服务内容WordPress移动端加搜索框
  • 线上购物网站建设的可行性模板简历
  • 西安 做网站pc网站建设怎么做
  • 网站开发培训光山个人网站的设计与实现的任务书
  • 公司做网站公司展示型网站包含哪些模块
  • 电商型企业网站建设电商网
  • 做视频网站带宽不够怎么办优化网站的目的
  • 入侵网站做360广告东莞企业如何建网站
  • 宁波网站制作 收费标准博客html模板
  • 太原网站公司哪家好网站二次开发是什么意思
  • 网站后台英语苏州建设集团
  • 湖北网站设计制作多少钱wordpress文章数据下载
  • 怎么创建自己的网站平台设计分享网站
  • 档案网站建设网页蚌埠网站建设专业公司
  • 淮安市建设工程安全监督站网站各类网站建设
  • 网站推广的基本方法对于大部分网站来说都是适用的兰州优化网站公司
  • 网站开发成功案例网站英文版是怎么做的
  • 网站 301帷客分享 wordpress
  • 做食品网站需要什么条件广州建设大马路小学网站
  • 南京旅游网站建设公司做网站可以卖钱吗
  • 在制作网站前 不需要急于做的工作是开通一个微信小程序
  • 电子商务网站是电子商务企业wordpress如何发照片
  • 网站建设需要什么流程wordpress的title怎么书写
  • 行业网站建设收费明细保定做网站百度推广
  • 企业网站建立流程的第一步是如何把物流做免费网站
  • 松江新城投资建设发展有限公司网站如何做网站的源码