算法模板——计算几何2(二维凸包——Andrew算法)
时间:2022-05-08
本文章向大家介绍算法模板——计算几何2(二维凸包——Andrew算法),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现功能:求出二维平面内一对散点的凸包(详见Codevs 1298)
很神奇的算法——先将各个点按坐标排序,然后像我们所知的那样一路左转,求出半边的凸包,然后反过来求另一半的凸包
我以前正是因为总抱着想一步到位的想法,所以每次都跪得很惨(HansBug:事实上这次是我这辈子第一次A掉凸包题)
然后别的没了,就是凸包的基本思想
(顺便输出凸包周长C和面积S)
1 type arr=array[0..100005] of longint;
2 var
3 i,j,k,l,m,n,m1,m2:longint;
4 a:array[0..100005,1..2] of longint;
5 b,c,d:arr;ans,are:extended;
6 procedure swap(var x,y:longint);
7 var z:longint;
8 begin
9 z:=x;x:=y;y:=z;
10 end;
11 procedure sort(l,r:longint);
12 var i,j,x,y:longint;
13 begin
14 i:=l;j:=r;x:=a[(l+r) div 2,1];y:=a[(l+r) div 2,2];
15 repeat
16 while (a[i,1]<x) or ((a[i,1]=x) and (a[i,2]<y)) do inc(i);
17 while (a[j,1]>x) or ((a[j,1]=x) and (a[j,2]>y)) do dec(j);
18 if i<=j then
19 begin
20 swap(a[i,1],a[j,1]);
21 swap(a[i,2],a[j,2]);
22 inc(i);dec(j);
23 end;
24 until i>j;
25 if i<r then sort(i,r);
26 if l<j then sort(l,j);
27 end;
28 function right(x1,y1,x2,y2:longint):boolean;
29 begin
30 exit((x1*y2)>(x2*y1));
31 end;
32 function trip(x1,y1,x2,y2,x3,y3:longint):boolean;
33 begin
34 exit(right(x2-x1,y2-y1,x3-x2,y3-y2));
35 end;
36 function check(x,y,z:longint):boolean;
37 begin
38 exit(trip(a[x,1],a[x,2],a[y,1],a[y,2],a[z,1],a[z,2]));
39 end;
40 procedure doit(var b:arr;var m:longint);
41 begin
42 b[1]:=d[1];b[2]:=d[2];j:=2;
43 for i:=3 to n do
44 begin
45 while (j>1) and not(check(b[j-1],b[j],d[i])) do dec(j);
46 inc(j);b[j]:=d[i];
47 end;
48 m:=j;
49 end;
50 begin
51 readln(n);
52 for i:=1 to n do readln(a[i,1],a[i,2]);
53 sort(1,n);j:=1;
54 for i:=2 to n do //去重
55 begin
56 if (a[i,1]<>a[j,1]) or (a[i,2]<>a[j,2]) then
57 begin
58 inc(j);
59 a[j,1]:=a[i,1];a[j,2]:=a[i,2];
60 end;
61 end;
62 n:=j;
63 //求凸包
64 for i:=1 to n do d[i]:=i;doit(b,m1);
65 for i:=1 to n do d[i]:=n+1-i;doit(c,m2);
66 //两个半边整合
67 for i:=1 to m1 do d[i]:=b[i];
68 for i:=2 to m2 do d[i+m1-1]:=c[i];
69 //开始计算周长+面积
70 m:=m1+m2-2;ans:=0;are:=0;
71 for i:=1 to m do ans:=ans+sqrt(sqr(a[d[i],1]-a[d[i+1],1])+sqr(a[d[i],2]-a[d[i+1],2])); //周长
72 for i:=1 to m do are:=are+a[d[i],1]*a[d[i+1],2]-a[d[i],2]*a[d[i+1],1]; //面积
73 are:=abs(are)/2;
74 writeln('Convex Hull:');
75 for i:=1 to m do writeln(a[d[i],1],' ',a[d[i],2]);
76 writeln('C = ',ans:0:1);
77 writeln('S = ',are:0:1);
78 readln;
79 end.
- 一例 Hive join 优化实战
- 奇数分频
- Nginx log error:client sent invalid userid cookie
- Shell 参数扩展及各类括号在 Shell 编程中的应用
- linux 系统监控、诊断工具之 IO wait
- 关于 MySQL UTF8 编码下生僻字符插入失败/假死问题的分析
- Windows用户自查:微软紧急更新修复Meltdown和Spectre CPU漏洞
- rsync error: protocol incompatibility / mismatch
- 玩转 SHELL 脚本之:Shell 命令 Buffer 知多少?
- 使用实体嵌入的结构化数据进行深度学习
- CoffeeMiner:劫持WiFi网络接入设备进行“挖矿”的框架
- 数码管显示电路的Verilog HDL 实现
- 超前进位加法器
- 使用腾讯云“自定义监控”监控 GPU 使用率
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【JAVA基础&高级】“面向对象篇” 知识点汇总
- pycharm 入门基础配置
- CS学习笔记 | 16、用户枚举三个关键步骤
- Python数据分析实战(1)数据分析概述
- JVM面试常问知识点
- Python 为什么没有 void 关键字?
- FPGA设计心得(10)关于行为仿真的一点观点
- 一、Axios基础
- 二、fetch中的基础语法
- Laradock 运行 Nuxt 的一些问题
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut
- 微信小程序设置请求超时
- SAP CRM One Order函数CREATE_OW的设计原理
- 决策树(decision tree)
- 寻找质数—埃式筛法