首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用C#寻找极值点-凸包

是一个计算几何的问题,涉及到寻找给定点集中的凸包。下面是对这个问题的完善且全面的答案:

凸包是指包围给定点集的最小凸多边形。寻找凸包的一个常见算法是Graham扫描算法,它的基本思想是先找到点集中的最低点(y坐标最小),然后按照极角从小到大的顺序对其他点进行排序,最后通过栈来构建凸包。

C#是一种面向对象的编程语言,它可以用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序和移动应用程序等。在C#中,可以使用以下步骤来寻找给定点集的凸包:

  1. 定义一个Point类来表示点的坐标,包括x和y两个属性。
  2. 定义一个CompareByPolarAngle函数,用于比较两个点的极角大小。
  3. 找到点集中的最低点,记为p0。
  4. 对除p0外的其他点按照与p0的极角大小进行排序,可以使用CompareByPolarAngle函数来实现。
  5. 创建一个空栈,将p0和排序后的第一个点入栈。
  6. 遍历排序后的其他点,对于每个点p,判断p和栈顶两个点的连线是否构成一个左转,如果是,则将p入栈;否则,将栈顶点出栈,直到找到一个左转的连线或者栈为空。
  7. 遍历完所有点后,栈中剩余的点即为凸包的顶点。

以下是一个示例代码,用于在C#中寻找给定点集的凸包:

代码语言:txt
复制
using System;
using System.Collections.Generic;

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }
}

public class ConvexHull
{
    private static int CompareByPolarAngle(Point p1, Point p2)
    {
        if (p1.Y < p2.Y)
            return -1;
        if (p1.Y > p2.Y)
            return 1;
        if (p1.X < p2.X)
            return -1;
        if (p1.X > p2.X)
            return 1;
        return 0;
    }

    private static double CrossProduct(Point p0, Point p1, Point p2)
    {
        return (p1.X - p0.X) * (p2.Y - p0.Y) - (p1.Y - p0.Y) * (p2.X - p0.X);
    }

    public static List<Point> FindConvexHull(List<Point> points)
    {
        if (points.Count < 3)
            throw new ArgumentException("The number of points should be at least 3.");

        // Find the lowest point
        Point p0 = points[0];
        foreach (var point in points)
        {
            if (point.Y < p0.Y || (point.Y == p0.Y && point.X < p0.X))
                p0 = point;
        }

        // Sort points by polar angle
        points.Sort((p1, p2) => CompareByPolarAngle(p1, p2));

        // Build the convex hull
        Stack<Point> stack = new Stack<Point>();
        stack.Push(p0);
        stack.Push(points[1]);

        for (int i = 2; i < points.Count; i++)
        {
            while (stack.Count >= 2 && CrossProduct(stack.ElementAt(1), stack.Peek(), points[i]) <= 0)
                stack.Pop();
            stack.Push(points[i]);
        }

        return new List<Point>(stack);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        List<Point> points = new List<Point>
        {
            new Point { X = 0, Y = 0 },
            new Point { X = 1, Y = 1 },
            new Point { X = 2, Y = 2 },
            new Point { X = 3, Y = 1 },
            new Point { X = 2, Y = 0 },
            new Point { X = 1, Y = 2 }
        };

        List<Point> convexHull = ConvexHull.FindConvexHull(points);

        foreach (var point in convexHull)
        {
            Console.WriteLine($"({point.X}, {point.Y})");
        }
    }
}

这段代码使用了一个Point类来表示点的坐标,然后使用ConvexHull类来实现寻找凸包的算法。在Main函数中,我们定义了一个点集points,并调用ConvexHull.FindConvexHull方法来寻找凸包。最后,将凸包的顶点打印出来。

这里没有提及腾讯云相关产品和产品介绍链接地址,因为这个问题与云计算领域的产品和服务没有直接关联。但是,腾讯云提供了丰富的云计算产品和服务,可以用于开发和部署各种类型的应用程序。如果需要了解腾讯云的相关产品和服务,可以访问腾讯云官方网站获取更多信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

(hdu step 7.1.5)Maple trees(的最小半径寻找掩护轮)

事实上就是在求完以后再求一下最小覆盖圆即可了。 这道题须要用到下面的一些知识: 1、关于钝角三角形,假设c是斜边,那么必定有a^2 + b^2 < c^2的证明。...不须要考虑的输入顺序是顺时针还是逆时针,相除后就抵消了。 3、 +最小圆覆盖 枚举随意3找其最小覆盖圆 (当为钝角三角形时不是外接圆,而是以其最长边为直径的圆)。...这道题还须要注意的是: 1、在使用完graham求最小以后。尽量让这个闭合。即p[n] = p[0]。...[0];//记得要收尾相接,否则可能会出错 int j; int k; double maxr = -1;//用于求最小覆盖圆的半径 double r; /** * 枚举中的随意三个...* 假设这三个形成的外接圆的半径最大, * 那么这个就是我们所要找的的最小覆盖圆 */ for(i = 0 ; i < n ; ++i){ for(j = i+1 ;

31920

Python使用分治法高效求解任意集的(源码+动画演示)

问题描述: (Convex Hull)可以理解为能够包围给定点集的最小凸多边形,是计算机图形学及其相关领域中的一个重要问题,在游戏中进行物体碰撞检车时使用的包围盒其实就是。...求解给定点集的可以使用分治法来高效实现,每次使用集中左右跨度最大的两构成的直线把集分为上下两部分,然后在上侧集中寻找距离直线最远的,与直线两端点构成三角形,以三角形新增的两条边继续对集进行分隔...,多边形的边越来越多,直到没有更外侧的为止,类似于分形算法生成雪花形状或者使用正多边形逼近圆周的过程。...对直线下方的集也做同样的处理,最终得到原始点集的

13210

BZOJ3672: 购票(dp 斜率优化 分治 二分 )

题意 题目链接 Sol 介绍一种神奇的分治的做法 啥?这都有根树了怎么分治?? 嘿嘿,这道题的分治不同于一般的分治。...正常的分治思路大概是先统计过重心的,再递归下去 实际上一般的分治与统计顺序关系不大,也就是说我可以先统计再递归,或者先递归再统计。...首先我们可以这样考虑:对于每个\(x\),找出子树重心\(root\),对除去重心外的部分递归执行该操作,那么回溯回来的时候,我们默认除重心的子树外答案都已经更新好了。...接下来考虑重心子树内的的转移,我们只需要考虑从\(root\)到\(x\)的路径,显然排序之后双指针可以做到\(nlogn\)的复杂度。...(对转移位置按深度排序,对要更新的点按深度 - 限制长度排序,双指针的时候维护一下,因为\(p\)不单调所以需要在包上二分) 复杂度不太会严格的证明,但是跑的飞快。

34730

博客 | 机器学习中的数学基础(优化)

我们知道,梯度下降法和牛顿法都是通过逼近的方式到达极值,如何使损失函数的极值成为它的最值就是凸函数和优化关注的内容。 优化,即在一系列以凸函数为条件的限制下,求解目标凸函数的最小值。...即使目标函数本身是非凸函数,我们也可以使用一个凸函数去逼近它,以图寻找到一个最优的初始点来求解非凸函数的最小值问题。...在非负权重系数和为1的前提下,任意n个的加权平均所指示的位置就是一个组合。由同一组n个所指示的所有组合就构成一个。如果C’是函数f上镜图C的,那么以C’为上镜图的函数g称为f的。...的基础上,在定义域内满足不等式和等式条件的可行域中,寻找优化 ? ,求解得到最优化值 ? 。 根据原问题,定义拉格朗日量 ? 若取遍x的定义域,求解拉格朗日量关于 ?...最后就是介绍SVM最简单的形式,即如何寻找最优超平面将集C和D区分开? 建模的关键在于: 1,如何将该问题转变为优化问题; 2,如何将普通优化问题转变为优化问题。

1.3K30

《python算法教程》Day11 - 分治法求解平面问题平面问题简介分治法求解思路与直线的位置判断代码示例

这是《python算法教程》的第11篇读书笔记,笔记主要内容是使用分治法求解。 平面问题简介 在一个平面点集中,寻找点集最外层的,由这些所构成的凸多边形能将集中的所有点包围起来。...convexHull.png 分治法求解思路 按照暴力法的思路(求出所有由集任意两的直线,再获取使得点集剩余的点在该直线的一侧的直线)去求解问题,显然算法复杂度达到了n^3,这并不是在时间复杂度上可以接受的算法...因此,可考虑使用分治法去求解。大体思路如下: 1.找出由横坐标最大、最小的两个p1p2所组成的直线。用该直线将集分成上下两set1,set2部分。...#递归法求解 import random import matplotlib.pyplot as plt #通过计算三角形p1p2p3的面积(点在直线左边结果为正,直线右边结果为负)来判断 p3...if leftSet: divideDown(leftSet,dot1,minDot,minDot,dot2,dotSet) #划分下集 rightSet

1.9K80

使用Path2D和算法实现地理围栏服务

1.使用Path2D创建一个多边形 Path2D类是java.awt.geom提供的工具,可表示任意几何路径的简单而灵活的形状。...contains(PathIterator pi, double x, double y, double w, double h) 测试指定的矩形区域是否完全位于指定的闭合边界内PathIterator 4.使用算法把指定...在一个实数向量空间V中,对于给定集合X,所有包含X的集的交集S被称为X的。...X的可以用X内所有点(X1,...Xn)的组合来构造.在二维欧几里得空间中,可想象为一条刚好著所有点的橡皮圈。...用不严谨的话来讲,给定二维平面上的集,就是将最外层的连接起来构成的凸多边形,它能包含集中所有的。 ?

1.7K10

【通俗理解】优化

今天介绍一优化方面的知识~内容可能有点无聊,看懂了这篇文章,会对求极值和收敛有进一步理解,比如: 了解为什么向量机(SVM)等的推导中,求极值时可以把约束条件加在目标函数后面来变成一个无约束的优化问题...SVM的任务就是寻找这样一个超平面H把样本无误地分割成两部分,并且使H1和H2的距离最大。要找到这样的超平面,只需最大化间隔Margin,也就是最小化w^2。...由于凸函数的极值就是最值,相对于非凸函数,我们更喜欢凸函数。这里不但要求目标函数是的,其定义的空间也必须是的集合。正如要求地形是的,能走的路构成的集合也必须是的。...集合有个有趣的separating性质,以二维空间为例,任意一y不属于这个集合,则一定存在一条直线把这个集合分开。...如果对x取值没有约束(定义域X为整个超平面),则根据凸函数极值性质 很容易知道在极值x*有对应的导数/梯度为0。

1.3K30

机器学习是什么

最优化:最小化目标函数求解参数 1.优化理论 指定义在集中的凸函数最优化的问题 优化问题的局部最优解就是全局最优解 很多非问题都可以被等价转化为优化问题或者被近似为优化问题(例如拉格朗日对偶问题...多元函数极值条件:多元函数各个分量的偏导数为0是极值存在的必要条件,多元函数的海森矩阵(二阶偏导数方阵,描述了多元函数的局部曲率)为正定或负定是极值存在的充分条件。...根据多元函数极值存在的必要条件,我们可以令多元函数的各个分量偏导数为0求解所有可能的极值,代入函数求解找到最小的极值。 当函数复杂到我们无法轻易求出潜在的极值时,我们可以构造初始值 ?...由于函数的等高线是密集的,因此我们只需要在满足函数等高线和约束曲线相切的集合中寻找可能的极值。...(相切是极值的必要非充分条件) 2.转化为数学语言 由于在极值处函数等高线和约束函数的梯度都与切平面垂直,从而他们的梯度方向在同一条直线上,即: 对于约束曲面上的任意 ? ,该的梯度 ?

80010

C# 使用OpenCV在一张图片里寻找人脸

master/data/haarcascades https://github.com/opencv/opencv/tree/master/data/haarcascades_cuda 建立工程 首先建立一个C#...接下来就是编辑代码了,后面所有代码都在main里 配置OpenCV使用显卡运算(如果支持的话) 使用显卡处理图像数据效率会很多,如果你的设备支持,最好打开,使用CvInvoke.HaveOpenCLCompatibleGpuDevice...CvInvoke.UseOpenCL能让OpenCV 启用或者停用 GPU运算 CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice; 构建级联分类器对象 emgu里已经有训练好的数据了...double scaleFactor = 1.1, int minNeighbors = 3, Size minSize = null, Size maxSize = null);//通过多次扫描 不同尺度, 寻找图像中可能包含级联分类器训练的样本

2.4K51

深度学习中的数学(一)——高等数学

四、凸函数与集(优化问题) 凸函数就是一个定义在某个向量空间的子集C(区间)上的实值函数。...(随意取两,值都在函数上方) 集:在欧氏空间中,集是对于集合内的每一对,连接该对的直线段上的每个也在该集合内。 包络函数:随意一个函数图像,将其包起来,就是一个凸函数。...山代表了需要优化的函数表达式;山的最低点就是该函数的最优值,也就是我们的目标;每次下山的距离代表后面要解释的学习率;寻找方向利用的信息即为样本数据;最陡峭的下山方向则与函数表达式梯度的方向有关,之所以要寻找最陡峭的方向...9.2 梯度下降法的基本方法 批量梯度下降法(Batch Gradient Descent, BGD) 批量梯度下降法每次学习都使用整个训练集,因此每次更新都会朝着正确的方向进行,最后能够保证收敛于极值...,凸函数收敛于全局极值,非凸函数可能会收敛于局部极值,缺陷就是学习时间太长,消耗大量内存。

80630

【数学基础篇】---详解极限与微分学与Jensen 不等式

3、应用 泰勒级数是一元微分逼近的顶峰,所以有关于一元微分逼近的问 题请尽情使用. 罗比塔法则 ? 证明: 因为是在 x0 附近的极限问题,我们使用泰勒级数来思考这个问题 ? ?...也 就是求某一个损失函数的极小值的问题, 在本课范围内我们考虑 可微分的函数极小值问题. 1、优化问题 对于一个无穷可微的函数 f(x),如何寻找他的极小值. 极值条件。...(方圆 δ 内的极小值) 不论是全局极小值还是局部极小值一定满足一阶导数/梯度 为零,f ′ = 0 或者 ∇f = 0. 2、局部极值算法 这两种方法都只能寻找局部极值 这两种方法都要求必须给出一个初始点...x0 数学原理:牛顿法使用二阶逼近(等价于使用二阶泰勒级数),梯度下降法使用一阶逼近 牛顿法对局部的函数找到极小值,对局部凹的函数找到极 大值,对局部不不凹的可能会找到鞍点....因为是局部逼近所以也只能寻找局部极值 牛顿法收敛步骤比较少,但是梯度下降法每一步计算更加简单,牛顿法不仅给出梯度的方向还给出具体应该走多少。梯度法的r只能自己定义。

70340

机器学习中的最优化算法总结

费马定理 对于一个可导函数,寻找极值的统一做法是寻找导数为0的,即费马定理。微积分中的这一定理指出,对于可导函数,在极值处导数必定为0: ? 对于多元函数,则是梯度为0: ?...导数为0的称为驻。需要注意的是,导数为0只是函数取得极值的必要条件而不是充分条件,它只是疑似极值。是不是极值,是极大值还是极小值,还需要看更高阶导数。...除鞍点外,最优化算法可能还会遇到另外一个问题:局部极值问题,即一个驻极值,但不是全局极值。如果我们对最优化问题加以限定,可以有效的避免这两种问题。...虽然驻只是函数取得极值的必要条件而不是充分条件,但如果我们找到了驻,再判断和筛选它们是不是极值,比之前要容易多了。无论是理论结果,还是数值优化算法,一般都以找驻作为找极值的目标。...如果使用了二阶导数,则称为二阶优化算法。 工程上实现时通常采用的是迭代法,它从一个初始点x0开始,反复使用某种规则从xk移动到下一个xk+1,构造这样一个数列,直到收敛到梯度为0的处。

2.9K30

批量(batch)状态估计问题

但每个项很简单,只关联2个变量 如果用李代数表达位姿,那么是无约束优化问题 如何求解 介绍通用的非线性最小二乘问题 非线性最小二乘 先考虑简单的问题: 这里 ,f为任意函数 当f很简单时: 解: 将得到极值或者鞍点...,比较这些即可。...当f复杂时: 难求, 很难解 使用迭代方式求解 如何使用迭代的方式: 给定某个初始值 对于第k次迭代,寻找一个增量 ,使得 达到最小值 足够小,则停止 否则,令 ,返回2 如何确定增量?...可以看成一阶和二阶的混合 参数 控制着两边的权重 小结 非线性优化是个很大的主体,研究者们为之奋斗多年 主要方法:最速下降,牛顿,G-N,L-M,DogLeg 与线性规划不同,非线性需要针对具体问题具体分析 问题非时...,对非敏感,会陷入局部最优 目前没有非问题的通用最优值的寻找方法 问题时,二阶方法通常一两步就能收敛

99320

PCA主成分分析(下)

数学中的美,是不是也是寻找那个导数为零的极值? 实际问题中,我们认为型函数是函数中是相对完美而且最容易求极值的。...我们已经知道上述二次型符合凸函数性质,实际中凸函数的极值问题,往往是带约束的求极值问题,也就是说我们要在求极值的同时加上一个条件——优化问题 比如在X的2范式——X的长度——为1的情况下,求上述二次型的极值...带入拉格朗日乘数,将上述问题归结为以下函数的极值问题: 类比一元函数的极值问题,我们求L的梯度,令梯度为0。...总结:求二次型的极值问题,就是求二次型矩阵特征值极值问题,就是求一个原始球在旋转后的空间中最大/最小拉伸。而这个特征值对应的特征向量,就是球最大/最小拉伸的方向。...因为数据点压缩后集中到一起,如果重合为一,那么信息就会严重受损。如下图 压缩后数据点的分散程度,决定了我们保留原信息的程度。

68710

面经 | 机器学习算法岗(阿里-飞猪)

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。...Python源码编译成JVM字节码,由JVM执行对应的字节码 IronPython:IronPython与Jython类似,所不同的是IronPython在CLR上实现了Python,即面向.NET平台,由C#...哪些学习器是优的? 优:局部最优即全局最优 对于优化问题,所有的局部极小值都是全局极小值,因此这类问题一般认为是比较容易求解的问题。 逻辑回归、SVM、线性回归优。...神经网络不优,因为可能收敛到鞍点。 SVM有几种,都是什么,几种核? 拉格朗日乘子法 是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法。...这种方法将一个有n 个变量与k 个约束条件的最优化问题转换为一个有n + k个变量的方程组的极值问题,其变量不受任何约束。

54520

【说站】js使用的注意

js使用的注意 使用注意 1、闭会使函数中的变量全部存储在内存中,内存消耗很大,所以不能滥用闭,否则会导致网页性能问题,在IE中可能会导致内存泄露。...解决办法是,在退出函数之前,删除所有未使用的局部变量。 2、闭将在父函数外部,改变父函数内部变量的值。...因此,如果将父函数作为对象(object)使用,并将闭作为其公共方法(PublicMethod),并将内部变量作为其私有属性(privatevalue),此时必须小心,不要随意改变父函数内部变量的值。...实例 fun函数返回一个f函数,形成闭,所以a的值是在f函数定义的环境寻找,如果找不到就往上一层作用域寻找。     ...            console.log(a)         }     }     var a = 20;     var f = fun();     f(); //打印出a的值为100 以上就是js使用的注意

34930
领券