poj1113 凸包

凸包问题算法总结并将算法过程可视化 什么是凸包? 百度百科上是这样说的: 凸包(Convex Hull)是一个计算几何(图形学)中的概念。 在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。X的凸包可以用X内所有点(X1,…Xn)的凸组合来构造. 老师是用一个形象的例子来解释的: 在板子上钉钉子,钉了一定数量后用一个橡皮筋撑大到足以包括所有钉子,然后松手,橡皮筋所包围的最外一侧钉子形成的多边形就是这一堆钉子的凸包。这些外侧的钉子称为极点,他们形成的边称为极边。 凸包问题正是计算几何的核心,也是开头的第一课,下面总 阅读详情

题目:http://poj.org/problem?id=1113

概念

凸包(Convex Hull)是一个计算几何(图形学)中的概念。用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有点的。严谨的定义和相关概念参见维基百科:凸包。

这个算法是由数学大师葛立恒(Graham)发明的,他曾经是美国数学学会(AMS)主席、AT&T首席科学家以及国际杂技师协会(IJA)主席。(太汗了,这位大牛还会玩杂技~)

 

问题

给定平面上的二维点集,求解其凸包。

 

过程

1. 在所有点中选取y坐标最小的一点H,当作基点。如果存在多个点的y坐标都为最小值,则选取x坐标最小的一点。坐标相同的点应排除。然后按照其它各点p和基点构成的向量<H,p>与x轴的夹角进行排序,夹角由大至小进行顺时针扫描,反之则进行逆时针扫描。实现中无需求得夹角,只需根据向量的内积公式求出向量的模即可。以下图为例,基点为H,根据夹角由小至大排序后依次为H,K,C,D,L,F,G,E,I,B,A,J。下面进行逆时针扫描。

 

Figure1

 

2. 线段<H, K>一定在凸包上,接着加入C。假设线段<K, C>也在凸包上,因为就H,K,C三点而言,它们的凸包就是由此三点所组成。但是接下来加入D时会发现,线段<K, D>才会在凸包上,所以将线段<K, C>排除,C点不可能是凸包。

3. 即当加入一点时,必须考虑到前面的线段是否会出现在凸包上。从基点开始,凸包上每条相临的线段的旋转方向应该一致,并与扫描的方向相反。如果发现新加的点使得新线段与上线段的旋转方向发生变化,则可判定上一点必然不在凸包上。实现时可用向量叉积进行判断,设新加入的点为pn + 1,上一点为pn,再上一点为pn - 1。顺时针扫描时,如果向量<pn - 1, pn>与<pn, pn + 1>的叉积为正(逆时针扫描判断是否为负),则将上一点删除。删除过程需要回溯,将之前所有叉积符号相反的点都删除,然后将新点加入凸包。

 

注意:在对极角(即最左点与其他点的交角)进行排序时要注意考虑共线情况

 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define PI 3.141592653
struct aa
{
	int x,y;
	int n;
	double angle;  //交角
}point[1100];
struct aa stack[1100];   //栈
double angle(int x1,int y1,int x2,int y2)
{
	return atan2((double)(y1-y2),(double)(x1-x2));
}
int cmp(const void *a,const void *b)
{
	struct aa *c=(struct aa *)a;
	struct aa *d=(struct aa *)b;
	if(c->angle!=d->angle)
		return (c->angle>d->angle)?1:-1;
	return c->x-d->x;
}
int cross(int x1,int y1,int x2,int y2)
{
	return ( (x1*y2)-(x2*y1) )>0?1:0;
}
int Grasan(int n,int end)
{
	int i,j,m;
	int p1,p2,p3;
	for(i=4;i<=n;i++)
	{
		while(end>=2)
		{
			if(cross(stack[end].x-stack[end-1].x,stack[end].y-stack[end-1].y,point[i].x-stack[end].x,point[i].y-stack[end].y)==1)
			{stack[++end]=point[i];break;}
			else
				end--;
		}
		if(end==1)
			stack[++end]=point[i];
	}
	return end;
}
double dist(int x1,int y1,int x2,int y2)
{
	return sqrt((double) ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) );
}
double count(int end)
{
	int i;
	double sum=0;
	for(i=1;i<end;i++)
		sum+=dist(stack[i].x,stack[i].y,stack[i+1].x,stack[i+1].y);
	sum+=dist(stack[1].x,stack[1].y,stack[end].x,stack[end].y);
	return sum;
}
int main()
{
	int i,j,n,m,l,end;
	scanf("%d%d",&n,&l);
	for(i=1,m=1;i<=n;i++)     //寻找最左边的点,记为基点
	{
		scanf("%d%d",&point[i].x,&point[i].y);point[i].n=i;
		if(point[i].y<point[m].y||(point[i].y==point[m].y&&point[i].x<point[m].x))
			m=i;
	}
	//求极角
	for(i=1,point[i].angle=-1;i<=n;i++)
		if(i!=m)
			point[i].angle=angle(point[i].x,point[i].y,point[m].x,point[m].y);

	//对极角由小到大排序,极角相等按x大小升序排
	qsort(point+1,n,sizeof(point[0]),cmp);

	stack[1]=point[1];
	stack[2]=point[2];
	stack[3]=point[3];
	end=3;
	end=Grasan(n,end);
	printf("%.0f\n",count(end)+2.0*PI*l);
	return 0;
}


 

 

凸包算法(convex hull) 前言 今天学习了几何算法——凸包算法,听着名字很奇怪,不知道它是干什么的,但其实也很简单。下面来介绍一下这种凸包算法和其c++代码: 凸包算法 其实很简单,就是用一个的凸多边形围住所有的点。就好像桌面上有许多图钉,用一根紧绷的橡皮筋将它们全部围起来一样。算法详细步骤: 1. 找到所有点中纵坐标y最小的点,也就是这些点中最下面的点,记为p0。 2. 然后计算其余点与该点的连线与x轴之间夹角... 阅读详情

相关推荐

凸包求解:卷包裹算法及POJ1113问题Java实现

从数学的角度来看,凸包可以被定义为将包含点集S的最小凸多边形。即对于任意两个点集中的点A和点B,在凸包上任取一点P,点P到A和B的连线段的直线都会被包含在凸包内部或与凸包相切。使用Graham扫描法求解凸包,基本步骤包括:1. 找到所有点中Y坐标最小的点作为起点。2. 将其他所有点按照与起点的极角进行排序。3. 从起点开始,依次构建凸包的边。性能优化是一个持续的过程,依赖于对算法的深入理解、对数据的精确诊断以及对执行环境的熟悉。

weixin_35815766的博客 367

凸包算法(Graham扫描法)

目录 一、概念 二、算法步骤 三、代码实现 转自:https://www.cnblogs.com/aiguona/p/7232243.html 一、概念 凸包(Convex Hull)是一个计算几何(图形学)中的概念。 在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。 X的凸包可以用X内所有点(X1,...Xn)的线性组合来构造. 在二维欧几里得空...

よろしくお願いします 1万+

基于PLC1200与CB1241的RS485从站Modbus Rtu通信实战指南

本文提供了一份详细的西门子S7-1200 PLC与CB1241 RS485通讯板实现Modbus RTU从站通信的实战指南。内容涵盖从硬件接线、博途软件组态、关键参数设置到程序调试与测试的全过程,重点解析了Modbus_Slave指令配置与数据块映射,帮助工程师快速掌握工业自动化系统中的数据采集与设备接入技术。

Apple的专栏 793

【计算几何01】Graham-Scan算法计算凸包

其实实现凸包问题至少有五个方法,这里只介绍Graham-Scan经典算法。本文就该算法用代码实现,为了增加有趣性,我们用python实现。

gongdiwudu的专栏 7949

智能座舱(七)——智能音频系统

本文剖析车载智能音频系统的核心技术,聚焦音响、功放、麦克风和广播收音机四大组件。音响系统通过多声道布局(如23扬声器阵列)结合动态声场校准算法,实现三维声场覆盖;功放系统采用高效D类技术,支持OTA音效调整和故障自愈;麦克风阵列运用波束成形技术实现精准拾音,并保障隐私安全;广播系统融合数字与网络技术提升音质。核心在于硬件标准化与算法差异化的协同,未来将朝集成化、AI个性化方向发展。

DC20160101的博客 1573

基于三轴加速度计的塑料水管泄漏振动检测技术全解析

在流体力学与结构动力学领域,管道振动分析是评估系统健康状态的关键技术。其基本原理在于,当管道内流体状态发生异常(如泄漏)时,会引发管壁产生特定的机械振动信号。这项技术的核心价值在于实现了对管道系统的非侵入式、在线监测,能够提前预警潜在故障,避免资源浪费与次生灾害。在智慧城市与智能水务等应用场景中,它对于保障供水管网安全、提升运维效率具有重要意义。本文聚焦于如何利用高精度的三轴加速度计,精准捕捉塑料水管因泄漏产生的微弱振动,并通过信号处理与机器学习算法,构建一套从数据采集到泄漏识别与定位的完整工程解决方案。

weixin_32239523的博客 407

二维凸包问题

二维凸包

Meteor的笔记 379

超详细 | 贝叶斯网络基础——有图有真相

Hello,大家好,我是starz。这是本系列的第二篇《概率基础Ⅱ》,虽说是概率基础,但作为过渡,它开始以图为载体 这节的主要内容有: 贝叶斯网络 三种结构 D-划分 贝叶斯球 马尔科夫毯 应用例子 总结 让我们开始吧 :3 贝叶斯网络 概率图模型可笼统分为两类,一是基于无向图的马尔科夫网络: 二是基于有向图的贝叶斯...

qq_41603411的博客 2万+

poj1113Wall【凸包】

Language: Default Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 32437   Accepted: 11008 Description Once upon a time there was a greedy King who o

走一步再走一步 1748

基于DNN、CNN与SVM的串联电弧故障智能检测:从原理到嵌入式部署

在电气安全与工业物联网领域,时间序列分类是处理传感器信号、实现状态监测与故障诊断的核心技术。其原理在于从连续的信号数据中提取有效特征,并利用机器学习模型识别异常模式。这项技术的核心价值在于能够实现设备预测性维护、提升系统安全性并降低运维成本,广泛应用于智能电表、电机健康监测、电力设备保护等场景。本文聚焦于电气安全中的一个具体且危险的隐患——串联电弧故障的检测。针对这一隐蔽性强、传统方法误报率高的问题,项目深入实践了三种主流AI模型:深度神经网络、卷积神经网络和支持向量机。通过对比DNN的通用特征学习能力、C

weixin_31860973的博客 413

保姆级教程:在RK3568 Debian系统上搞定AIC8800 WiFi与蓝牙驱动(含固件路径与开机自启脚本)

本文提供在RK3568 Debian系统上配置AIC8800 WiFi与蓝牙驱动的保姆级教程,涵盖驱动移植、固件部署、开机自启脚本等关键步骤。通过详细的硬件连接指南、内核配置示例和常见问题解决方案,帮助开发者快速实现无线模块的全功能配置,特别适合嵌入式Linux开发者参考。

weixin_28684825的博客 378

使用 ABAP 代码动态创建新的 Function Module

通过内表。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 6906

学习凸包(三):凸包练习 POJ 1113

接上文:学习凸包(二):分治法求解http://128kj.iteye.com/blog/1748622 通过前面两文学习,基本上明白了凸包,先做个练习POJ 1113. POJ 1113题意: 从前有一个吝啬的国王要求他的总设计师在他的城堡周围建一道围墙。这国王非常吝啬,以至于他没有听总设计师的建一个拥有外形漂亮又高大的砖头塔楼的围墙的建议,而是要求用最少的石头和劳工围着整

深圳大力 385

保姆级教程:如何将仅限客户端使用的免费大模型(Gemini、Antigravity、Qwen Code、Kiro 等)转为任何应用可调用的 OpenAI 兼容标准接口

大模型 API 费用太贵?💸 这篇文章分享一个薅羊毛神器,能把 Gemini、Qwen Code、Kiro 等客户端专属的免费大模型转换成标准 OpenAI 兼容接口 🔌。支持多协议互转、账户池管理、Web 管理界面,Docker 一键部署,零成本调用 Claude Opus 4.5、Gemini 3 Pro 等高级模型 ✅

XiaoqiangClub的博客 1033

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

poj 1113 Wall (凸包)

题意:给定多边形城堡的n个顶点,绕城堡外面建一个围墙,围住所有点, 并且墙与所有点的距离至少为L,求这个墙最小的长度 思路:最小长度=城堡顶点构成的凸包的总边长+半径为L的圆的周长 先用Graham算法求出凸包,再枚举其顶点求两两之间的边长,记得加上第一个顶点和最后一个顶点的边长 最后要输出四舍五入的整数结果,可以用double存,最后用%.0lf输出

happy_lcj 1272

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

poj 1113wall (凸包)

poj 1113wall (凸包) #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long #define M 1002 #define DEBU

程序员的冷浪漫 733

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

POJ1113——WALL 凸包

调了两个小时(吐 poj1113 凸包有毒啊??? 我闲的蛋疼用了一个函数叫atan2 然而这个东西用法有点神奇。。是用来求极角的 atan2(y,x) 注意是y,x 得到的是(x,y)点对对于0,0的弧度!注意是弧度! 弧度转化角度:#define atan2(x,y) atan2(x,y)*180/3.1415926535当然其实这题。。不转化角度也没关系,显然弧度与角度是增函数的关

来自Fop_zz的辣鸡题解或教程 455

poj 1113 凸包模板

#include #include #include #include #include #include using namespace std; #define N 1050 #define PI acos(-1.0) int n,r; struct point { int x,y; point(int _x=0,int _y=0) { x=_x; y=_y; }

Jackyguo1992的专栏 762

POJ1113 计算几何-凸包算法-卷包裹法、Graham-Scan法

POJ1113 wall 题目链接:http://poj.org/problem?id=1113 凸包算法的板题,找出凸包,计算凸包的周长加上以要求的距离为半径的圆的周长即可。 卷包裹法 思路: 点集预处理,以横坐标为准从小到大(横坐标相同以纵坐标从小到大) 从点集的第一个点开始找上凸包。 如果要添加的点在凸包的点集中最新添加的两个点所形成的直线的右边,将改点添加进凸包的点集。 如果在左边,把...

Aczy156的博客 427

POJ 1113 Wall 【凸包入门】

原题连接:http://poj.org/problem?id=1113 题意:给 n 个点,你见一个围墙,使所有的点到围墙的距离不小于 l 。求围墙长度。。 思路:先求出n个点的 凸包,然后根据凸包建一个围墙,围墙的一部分就是 凸包长度,另一部分 是一个 以 l 为半径的 圆!! 代码: #include #include #include #include using namespa

nyist_飘谊 1482

POJ 1113 Wall 围墙 凸包

题意:给出一系列的点,在凸包外面l米建造围墙,求围墙的长度。 其实就是裸凸包+半径l的圆周长。 这题卡了一下午...由于里面的精度有些问题...后面输出最好用%.f不要用lf和int转换.... 第一次做凸包,感觉还好... 代码: /* * Author: illuz * Blog: http://blog.youkuaiyun.com/hcbbt * Fil

水果君の日常 1305

Poj 1113 Wall (凸包Graham)

题目链接:http://poj.org/problem?id=1113 解题报告参见  http://blog.youkuaiyun.com/lyy289065406/article/details/6648622 第一次写凸包的题,发现还有许多细节没有完全掌握。。。 公式:城堡围墙长度最小值 = 城堡顶点坐标构成的散点集的凸包总边长 + 半径为L的圆周长(推导见上述解题报告) 极角序

whyorwhnt的专栏 1038

SW练习_POJ1113_凸包

package info.frady.poj; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Comparator; import java.util.LinkedList; import java.util.StringTokenizer; public class POJ1113 { static Point1113 a; .

mush_me的专栏 407
上一篇: poj1012 约瑟夫
下一篇: poj2187 凸包
Ruansf
博客等级 码龄14年 1粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值