找凸包方法

本文介绍了如何通过快速排斥和线段判断来找到二维平面上点集的凸包。首先确定最下方的点作为起点P0,然后沿逆时针方向转动,每次选择与当前点形成逆时针方向的点加入凸包,直到再次碰到起点,形成完整的凸包。过程中用到了叉积判断和栈的数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是基于 合工大老师徐本柱的教材
什么是凸包:
在这里插入图片描述
中间涉及问题
线之间是否相交?
首先使用快速排斥
在这里插入图片描述
再判断线段是否跨立

在这里插入图片描述
如何用栈简化算法:
在这里插入图片描述

会涉及到的知识:
叉积 栈的使用

叉积是有方向的,当叉积为正代表逆时针,为true,
当叉积为正代表顺时针,为false,那么叉积为0的时候也为ture (原因查看sortByPolorAngle函数)
看注释也可得知!

说一下具体思路(对照着代码和注释就很容易理解了):
1.找出集中最下方的点,如果这样的点不止一个,那么用最下面最左边的点。
2.那么把这个点设为P0是凸包子集中的一个点
3.设想P0栓了一根皮筋如上图,放在P0成水平的右侧
4.沿逆时针方向转动,首先碰到P1(一定要逆时针旋转,如果不是逆时针选择,那么果断抛弃找下一个点,例如p1p2到p1p3就不是逆时针旋转了,果断抛弃P2。)
5.以P1为中心做和P0一样的事情,碰P3
6.循环,直到再次碰到P0,循环结束

下面展示一些 代码

我觉得注释写的很清楚了 ,看着注释对着思路,基本上没问题的。
#include <iostream> 
#include <utility> 
#include <vector> 
#include <algorithm> 
using namespace std; 
typedef pair<double,double> POINT;
// function dirction determines the direction that the segment 
//p1p turns to p2p with respect to point p 
//if return value is positive, means clockwise; 
//if return value is negative, menas counter-clockwise; 
// naught means on the same line; 
double direction(POINT p,POINT p1,POINT p2) 
{
    
 POINT v1,v2; 
 v1.first =p2.first -p.first ; 
 v1.second=p2.second-p.second; 
 v2.first =p1.first -p.first; 
 v2.second=p1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值