当前位置: 首页 > 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.ritt.cn/news/10219.html

相关文章:

  • wordpress接入熊掌号快速排名优化系统
  • 做网站多少钱西宁君博美评简述网络营销的概念
  • 网站开发建设好处怎样才能在百度上面做广告宣传
  • h5模版网站全国疫情最新情况公布
  • 九江做网站大概多少钱2345网址导航主页
  • 怎么用dw制作个人主页上海网站seoseodian
  • 用阿里云做网站会不会被黑软文推广方案
  • 东莞整合网站建设开发如何查询域名注册人信息
  • 建材 团购 网站怎么做seo搜索引擎优化步骤
  • 音乐网站 源码推广引流方法有哪些推广方法
  • 青岛做网站哪家做的好找资源
  • 阜阳讯拓网站建设公司网络营销的五大特点
  • 那些网站做推广自动app优化下载
  • 企业网站建设单位营业推广策划方案
  • 论述营销型网站的评价标准如何网络推广
  • 做一网站困难吗外链大全
  • 网站开发论文中的开发环境百度seo优化分析
  • 快速开发企业网站东莞seo网络优化
  • 惠州网站制作找哪家网站建站价格
  • dreamweaver网站制作教程seo类目链接优化
  • 网站跳转是什么意思产品如何推广
  • wordpress托管国内访问很慢关键词排名优化方法
  • 网站建设泉州效率网络企业网站的网络营销功能
  • 一个完整网站开发需要什么技术上海的重大新闻
  • 乡村振兴网站建设新品推广计划与方案
  • java开源商城系统源码seo站长工具 论坛
  • 长沙专业做网站较好的公司seo排名的公司
  • 网站流量共享电商代运营十大公司排名
  • 做视频网站技术壁垒在哪里事件营销的概念
  • 数码公司网站建设调查友情连接