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/7/21 9:51:58 阅读更多 →
如何让喜欢的角色真正“活“在你的桌面上?DyberPet 桌宠框架给你答案!

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

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

2026/7/21 9:50:58 阅读更多 →
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/7/21 9:50:58 阅读更多 →

最新新闻

Spec Kit:规范驱动开发如何重塑团队Git协作模式

Spec Kit:规范驱动开发如何重塑团队Git协作模式

Spec Kit:规范驱动开发如何重塑团队Git协作模式 【免费下载链接】spec-kit 💫 Toolkit to help you get started with Spec-Driven Development 项目地址: https://gitcode.com/GitHub_Trending/sp/spec-kit 在传统软件开发流程中,Git…

2026/7/21 21:48:59 阅读更多 →
TMS320F28004x ADC与PGA配置实战:从寄存器到高精度信号链设计

TMS320F28004x ADC与PGA配置实战:从寄存器到高精度信号链设计

1. 项目概述:深入TMS320F28004x的模拟信号链核心 在工业电机驱动、数字电源或者高精度传感器采集这些实时控制系统的开发中,我们工程师最常打交道也最需要精细调校的,往往不是那些复杂的算法本身,而是最前端的模拟信号链路。信号链…

2026/7/21 21:48:59 阅读更多 →
如何快速掌握数据库内核:MiniOB学习平台的完整指南

如何快速掌握数据库内核:MiniOB学习平台的完整指南

如何快速掌握数据库内核:MiniOB学习平台的完整指南 【免费下载链接】miniob MiniOB is a compact database that assists developers in understanding the fundamental workings of a database. 项目地址: https://gitcode.com/GitHub_Trending/mi/miniob M…

2026/7/21 21:48:59 阅读更多 →
产品经理A/B测试防错速查表:避开90%的实验失效陷阱

产品经理A/B测试防错速查表:避开90%的实验失效陷阱

1. 这份A/B测试速查表&#xff0c;不是教你怎么点按钮&#xff0c;而是帮你避开让产品上线后“哑火”的致命坑作为带过7个DAU超500万App迭代的资深产品负责人&#xff0c;我见过太多团队把A/B测试当成“玄学开关”&#xff1a;埋好实验、等够样本、看p值<0.05就开全量——结…

2026/7/21 21:48:59 阅读更多 →
C++ Web服务器性能优化:从阻塞多线程到非阻塞事件驱动架构实战

C++ Web服务器性能优化:从阻塞多线程到非阻塞事件驱动架构实战

这次我们来看一个C Web服务器性能优化的实战案例。标题里提到的“从9千到5.8万请求/秒”这个数字非常吸引人&#xff0c;它直接点出了性能提升的核心价值。这个项目并非一个全新的框架&#xff0c;而是一个对现有C Web服务器进行深度重构和优化的过程&#xff0c;核心在于引入了…

2026/7/21 21:48:59 阅读更多 →
AI辅助重构老Android项目:从Eclipse到现代架构的升级实践

AI辅助重构老Android项目:从Eclipse到现代架构的升级实践

1. 项目背景与技术选型 七年前的老Android项目往往面临技术栈陈旧、架构过时、依赖库失效等典型问题。我接手的这个项目最初采用Eclipse开发&#xff0c;基于Android 4.4 API级别&#xff0c;使用早已废弃的ActionBarSherlock和Apache HttpClient等组件。代码中充斥着AsyncTask…

2026/7/21 21:47:59 阅读更多 →

日新闻

Octane Render与C4D汉化版安装与优化指南

Octane Render与C4D汉化版安装与优化指南

1. Octane Render与C4D的黄金组合&#xff1a;为什么选择这个方案&#xff1f;在三维创作领域&#xff0c;渲染器的选择往往决定了作品的最终呈现质量和工作效率。作为Cinema 4D&#xff08;C4D&#xff09;用户&#xff0c;Octane Render的GPU加速特性与实时预览功能&#xff…

2026/7/21 0:00:19 阅读更多 →
GPMC接口设计:异步/同步模式与多路复用配置实战

GPMC接口设计:异步/同步模式与多路复用配置实战

1. GPMC接口设计&#xff1a;从硬件连接到软件配置的全局视角在嵌入式系统开发中&#xff0c;尤其是基于TI Sitara系列如AM263x这类高性能微控制器的项目里&#xff0c;外部存储器的扩展几乎是绕不开的一环。无论是存放大量非易失性代码的NOR Flash&#xff0c;还是作为高速数据…

2026/7/21 0:00:19 阅读更多 →
UE5 GAS框架下RPG被动技能系统:从核心原理到实战实现

UE5 GAS框架下RPG被动技能系统:从核心原理到实战实现

1. 项目概述&#xff1a;UE5 GAS RPG被动技能的核心价值在UE5里用GAS&#xff08;Gameplay Ability System&#xff09;做RPG游戏&#xff0c;主动技能像是你手里的武器&#xff0c;按一下打一下&#xff0c;逻辑直接&#xff0c;反馈也快。但被动技能&#xff0c;它更像是你身…

2026/7/21 0:00:19 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻