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

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

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

2026/7/28 21:09:03 阅读更多 →
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/29 1:34:46 阅读更多 →

最新新闻

汽车TARA分析实战:从威胁建模到安全需求落地的完整指南

汽车TARA分析实战:从威胁建模到安全需求落地的完整指南

1. 项目概述:为什么TARA分析让工程师又爱又恨?“TARA分析从入门到放弃”,这个标题精准地戳中了无数汽车电子电气工程师的痛点。TARA,全称Threat Analysis and Risk Assessment,即威胁分析与风险评估,是汽车…

2026/7/29 6:38:48 阅读更多 →
零门槛录音转文字实战指南:从设备选择到文本校对

零门槛录音转文字实战指南:从设备选择到文本校对

1. 项目概述:录音转文字技术入门指南录音转文字技术早已不是什么新鲜事物,但真正能零门槛上手的方案却不多见。作为一个在语音处理领域摸爬滚打多年的从业者,我见过太多人在这件事上栽跟头——要么被复杂的软件界面劝退,要么花大价…

2026/7/29 6:38:48 阅读更多 →
深入解析ARM Cortex-M异常与中断:从原理到实战调试

深入解析ARM Cortex-M异常与中断:从原理到实战调试

1. 项目概述:为什么需要深入理解异常与中断?如果你正在使用STM32、GD32或者任何基于ARM Cortex-M3/M4内核的微控制器,那么“异常”和“中断”这两个词一定是你开发路上的常客。它们就像是系统的“神经系统”,负责响应外部世界的各…

2026/7/29 6:38:48 阅读更多 →
永久保存你的QQ空间记忆:GetQzonehistory完整备份方案

永久保存你的QQ空间记忆:GetQzonehistory完整备份方案

永久保存你的QQ空间记忆:GetQzonehistory完整备份方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的青春记忆大多存储在QQ空间中&#xff0c…

2026/7/29 6:38:48 阅读更多 →
基于Raft分布式Kv存储:leaderHeartBeatTicker

基于Raft分布式Kv存储:leaderHeartBeatTicker

源码里的准确名字是 leaderHearBeatTicker()。它是 Leader 的周期性调度器: 控制什么时候启动下一轮心跳或日志复制;真正构造 AppendEntries、发送快照和处理各节点复制进度的是 doHeartBeat()。 Raft 要求 Leader 定期向所有 Follower 发送 AppendEntri…

2026/7/29 6:38:48 阅读更多 →
150 行代码,吊打 MyBatis 全家桶

150 行代码,吊打 MyBatis 全家桶

150 行代码,吊打 MyBatis 全家桶 联表才是真实战场,ORM 却在那儿卷单表? 先说结论:两个层次,一次说清 这篇文章有两个层次: 150 行核心代码,直接干翻原生 MyBatis(XML 映射 动态…

2026/7/29 6:37:48 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻