C# 利用分治算法求凸包(Convex Hull using Divide and Conquer Algorithm)
如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。在计算几何中凸包是包含给定点集的最小凸多边形。它是一个基本概念在计算机图形学、机器人学和图像处理等各个领域都有应用。​凸包的重要性凸包在计算几何中非常重要原因有以下几点碰撞检测凸包可用于有效检测 2D 或 3D 空间中物体之间的碰撞。图像处理凸包可用于从图像中提取有意义的形状例如物体的轮廓。数据可视化凸包可用于可视化散点图中数据点的分布。输入是一个由 x 和 y 坐标指定的点数组。输出是这组点的凸包。利用分治算法求凸包先决条件两个凸多边形之间的切线JavaScript 两个凸多边形之间的切线:https://blog.csdn.net/hefeng_aspnet/article/details/160182506C# 两个凸多边形之间的切线:https://blog.csdn.net/hefeng_aspnet/article/details/160182477Python 两个凸多边形之间的切线:https://blog.csdn.net/hefeng_aspnet/article/details/160182449Java 两个凸多边形之间的切线:https://blog.csdn.net/hefeng_aspnet/article/details/160182407C 两个凸多边形之间的切线:https://blog.csdn.net/hefeng_aspnet/article/details/160182260算法给定一个点集我们需要找到它的凸包。假设我们已知左半部分点集和右半部分点集的凸包那么现在的问题是将这两个凸包合并从而确定整个点集的凸包。这可以通过找到左右凸包的上切线和下切线来实现。如图所示两个凸多边形之间的切线。设左凸包为 a右凸包为 b。则下切线和上切线分别标记为 1 和 2如图所示。红色轮廓线表示最终的凸包。现在的问题是如何找到左右两半的凸包。这时递归就派上用场了。我们将点集分割直到点数非常少比如只有 5 个点然后我们可以通过穷举算法找到这些点的凸包。将这两半合并就能得到整个点集的凸包。注我们使用暴力算法来寻找少量点的凸包其时间复杂度为 O(n³)。但有人提出由三个或更少点构成的凸包就是全部点集。这没错但问题在于当我们尝试合并一个由两个点构成的左凸包和一个由三个点构成的右凸包时程序在某些特殊情况下会陷入无限循环。因此为了解决这个问题我直接求出了由五个或更少点构成的凸包。O(n³)算法虽然略微复杂一些但并不影响算法的整体复杂度。以下是具体实现步骤using System;using System.Collections.Generic;namespace ConvexHullDivideAndConquer {class Program {static void Main(string[] args){Point[] points new Point[] {new Point(0, 0), new Point(1, -4),new Point(-1, -5), new Point(-5, -3),new Point(-3, -1), new Point(-1, -3),new Point(-2, -2), new Point(-1, -1),new Point(-2, -1), new Point(-1, 1)};ListPoint hull ComputeConvexHull(points);Console.WriteLine(Convex Hull:);foreach(Point p in hull){Console.WriteLine(p.X p.Y);}}static ListPoint ComputeConvexHull(Point[] points){ListPoint hull new ListPoint();// Sort points by x-coordinateArray.Sort(points);// Compute upper hullfor (int i 0; i points.Length; i) {while (hull.Count 2 Point.CrossProduct(hull[hull.Count - 2],hull[hull.Count - 1], points[i]) 0) {hull.RemoveAt(hull.Count - 1);}hull.Add(points[i]);}// Compute lower hullint lowerHullIndex hull.Count 1;for (int i points.Length - 2; i 0; i--) {while (hull.Count lowerHullIndex Point.CrossProduct(hull[hull.Count - 2],hull[hull.Count - 1], points[i]) 0) {hull.RemoveAt(hull.Count - 1);}hull.Add(points[i]);}// Remove last point (its a duplicate of the first// point)hull.RemoveAt(hull.Count - 1);return hull;}}class Point : IComparablePoint {public int X { get; }public int Y { get; }public Point(int x, int y){X x;Y y;}public int CompareTo(Point other){if (X ! other.X) {return X - other.X;}return Y - other.Y;}public static int CrossProduct(Point A, Point B,Point C){return (B.X - A.X) * (C.Y - A.Y)- (B.Y - A.Y) * (C.X - A.X);}}}输出凸包(convex hull)-5 -3-1 -51 -40 0-1 1时间复杂度合并左右凸包需要 O(n) 时间由于我们将点集分成两个相等的部分因此上述算法的时间复杂度为 O(n * log n)。辅助空间O(n)如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。

相关新闻

Unity安卓开发权限管理全解析:从Manifest配置到运行时动态申请

Unity安卓开发权限管理全解析:从Manifest配置到运行时动态申请

1. 项目概述与核心价值 在Unity里做安卓开发,权限管理是个绕不开的坎。很多开发者,尤其是从PC或主机平台转过来的,一开始都会觉得有点懵:明明在Unity里跑得好好的,怎么一打包到手机上就闪退,或者功能用不了…

2026/10/18 18:37:25 阅读更多 →
如何让喜欢的角色真正“活“在你的桌面上?DyberPet 桌宠框架给你答案!

如何让喜欢的角色真正“活“在你的桌面上?DyberPet 桌宠框架给你答案!

如何让喜欢的角色真正"活"在你的桌面上?DyberPet 桌宠框架给你答案! 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 每天面对单调的电脑桌面&am…

2026/10/19 3:04:50 阅读更多 →
Zotero Reference:如何5分钟建立你的智能文献引用网络

Zotero Reference:如何5分钟建立你的智能文献引用网络

Zotero Reference:如何5分钟建立你的智能文献引用网络 【免费下载链接】zotero-reference PDF references add-on for Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-reference 你是否曾在阅读论文时,面对密密麻麻的参考文献列表感…

2026/10/17 4:53:39 阅读更多 →

最新新闻

Linux账号与权限管理实战:从用户规划到事故排障全解析

Linux账号与权限管理实战:从用户规划到事故排障全解析

我刚接手服务器运维时遇到的第一起事故,至今印象很深。那天业务方反馈内部管理后台登录不上,我看了一下,不是密码错,而是系统直接提示账户被锁定。当时第一反应是去改密码,改完依然进不去,后来才发现是账户…

2026/10/19 7:40:22 阅读更多 →
STM32自动浇花系统源码解析:从土壤湿度采集到水泵控制与Flash阈值存储

STM32自动浇花系统源码解析:从土壤湿度采集到水泵控制与Flash阈值存储

简介:STM32自动浇花系统是一套面向嵌入式初学者与电子爱好者的完整智能硬件实践项目,以STM32F103C8T6为核心,结合土壤温湿度、光敏、空气温湿度等传感器与OLED显示、DC-DC电源、水泵控制模块,实现按湿度阈值或定时策略自动灌溉&am…

2026/10/19 7:40:22 阅读更多 →
内核空间初始化:从引导程序到start_kernel的完整流程解析

内核空间初始化:从引导程序到start_kernel的完整流程解析

1. 内核空间初始化的整体蓝图1.1 初始化到底在做什么很多做应用开发的同事一听到"内核空间初始化",第一反应是"那不就是开机跑一段汇编把硬件摸一遍嘛"。这个理解不算错,但跟实际的内核初始化工作相比,显得太过乐观了。我…

2026/10/19 7:40:22 阅读更多 →
升维与降维互为因果:构建永续认知螺旋

升维与降维互为因果:构建永续认知螺旋

先说一个我最近的经历。某个产品功能上线不到两周,数据就出现明显下滑,团队开会复盘时,现场出现了两种截然不同的声音:一种说,要想清楚这个功能到底在服务谁、解决什么问题,别让短期指标牵着走;…

2026/10/19 7:40:21 阅读更多 →
RAG落地实战:检索增强生成的原理、架构与参数调优全解析

RAG落地实战:检索增强生成的原理、架构与参数调优全解析

最近大模型圈子里最绕不开的一个词就是RAG(Retrieval-Augmented Generation,检索增强生成)。不管是做知识库问答、企业私有数据助手,还是给大模型配上"长期记忆",背后基本都是这套架构。我自己在过去一段时间…

2026/10/19 7:40:21 阅读更多 →
把Claude当成AI同事:一套减少返工的高效工作流搭建指南

把Claude当成AI同事:一套减少返工的高效工作流搭建指南

1. 为什么我决定把 Claude 当成"同事"而不是"搜索框"1.1 一个月的试验是怎么开始的事情要从上个月说起。那段时间我手头同时压着三个项目:一个老活动的复盘报告还没交,一个新上线的功能要赶推广方案,还有日常的周报、邮件…

2026/10/19 7:39:21 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →