ACM计算几何篇

文章目录

https://linxi99.gitee.io/20190211/ACM计算几何篇/

1 前言

1.1 计算几何算法

ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途

常用算法包括经典的凸包求解,离散化及扫描线算法、旋转卡壳、半平面交等

1.2 计算几何题目特点及要领

  • 大部分不会很难,少部分题目思路很巧妙

  • 做计算几何题目,模板很重要,模板必须高度可靠

  • 要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板。如果代码一片混乱,那么会严重影响做题正确率。

  • 注意精度控制

  • 能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍,或扩大sqrt2)。因为整数不用考虑浮点误差,而且运算比浮点快

1.3 预备知识

见ACM几何基础篇

https://linxi99.gitee.io/20190211/ACM几何基础篇/

https://blog.csdn.net/linxilinxilinxi/article/details/81750327

计算几何将用到大量基础篇中的函数与知识

2 凸包

2.1 定义

2.1.1 凸多边形

过多边形的任意一边做一条直线,如果其他各个顶点都在这条直线的同侧,则把这个多边形叫做凸多边形

凸包求解算法的基础便是凸多边形的定义与性质

2.1.2 凸包

假设平面上n个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”

形象理解:皮筋包裹钉子群

凸包

2.2 颜料配色问题

2.2.1 问题描述

假设每种颜料都拥有 ( R , G , B ) (R,G,B) (R,G,B)三种属性,表示该种颜料红色,绿色,与蓝色的化学成分所占的比重

给你若干种已有的不限量的颜料,问是否能够勾兑出目标颜料 ( R 0 , G 0 , B 0 ) (R_0, G_0, B_0) (R0,G0,B0)

2.2.2 问题简化

若只考虑 ( R , G ) (R, G) (R,G)这两种颜色

给定 X = ( 10 % , 35 % ) , Y = ( 16 % , 20 % ) X = (10\%, 35\%), Y = (16\%, 20\%) X=(10%,35%),Y=(16%,20%)

问是否能够配制出 U = ( 12 % , 30 % ) U = (12\%, 30\%) U=(12%,30%)的燃料

V = ( 13 % , 22 % ) V = (13\%, 22\%) V=(13%,22%)这一种呢

如果再给你一种 Z = ( 7 % , 15 % ) Z = (7\%, 15\%) Z=(7%,15%)颜料呢

2.2.3 问题抽象

将每一种颜料映射为二维欧氏空间中的一个点,我们可以将已经给定的颜料与目的颜料在空间中标定出来

经过观察与思考,我们可以发现,一个颜料能够被勾兑出来当且仅当该颜料对应的点,位于以给定颜料所构成的凸包之中

2.2.4 数学抽象

Given a point set S = { p 1 , ⋯   , p n } ⊆ ε 2 S = \{p_1, \cdots, p_n\} \subseteq \varepsilon ^ 2 S={ p1,,pn}ε2

Let λ = &lt; λ 1 , ⋯ &ThinSpace; , λ n &gt; ∈ R n , λ 1 + λ 2 + ⋯ + λ n = 1 \lambda = &lt;\lambda _ 1, \cdots, \lambda _ n&gt; \in R ^ n, \lambda _ 1 + \lambda _ 2 + \cdots + \lambda _ n = 1 λ=<λ1,,λn>Rn,λ1+λ2++λn=1 and m i n { λ 1 , ⋯ &ThinSpace; , λ n } ≥ 0 min\{\lambda _ 1, \cdots, \lambda _ n\} \ge 0 min{ λ1,,λn}0

The point

p = [ p 1 , ⋯ &ThinSpace; , p n ] λ = λ 1 p 1 + ⋯ + λ n p n p = [p _ 1, \cdots, p _ n]\lambda = \lambda _ 1 p _ 1 + \cdots + \lambda _ n p _ n p=[p1,,pn]λ=λ1p1++λnpn

is called a convex combination of S

2.2.4.1 Convex Combination And Affine Combination

凸组合:Convex Combination

两个点的Convex Combination会是这两个点所构成的线段

仿射组合:Affine Combination

而两个点的Affine Combination将会确定这两个点所对应的那条直线

2.2.4.2 区别与联系

也就是说Convex Combination 是 Affine Combination的一个子集

原因便是

m i n { λ 1 , ⋯ &ThinSpace; , λ n } ≥ 0 min\{\lambda _ 1, \cdots, \lambda _ n\} \ge 0 min{ λ1,,λn}0

这个根据生活实际添加的条件

2.3 构造凸包的初步尝试

2.3.1 转化思想

大事化小,小事化了

2.3.2 极性 Extremity

称最终对点集所构成的凸包有贡献的点具有极性

称其为极点 Extreme Point

通过观察,所谓的这些极点,我们可以找到一条穿过它们的直线,使得点集中的所有点都落在直线的同一侧

2.3.3 基于极点的凸包构造算法

类比冒泡排序,我们可以逐个判断每一个给定的点是否位于任何三个点所构成的三角形的内部

这样我们可以逐个剔除所有的非极点,从而得到所有的极点,即凸包的解

很容易想到,该算法的时间复杂度 O ( n 4 ) O(n ^ 4) O(n4)

2.3.4 基于极边的凸包构造算法

2.3.4.1 极边

类比极点的定义相应的我们也可以定义极边(Extreme Edge),它们具有类似的性质

很容易可以发现凸包边界上的边若取逆时针走向,点集中所有的都位于极边的左侧(ToLeftTest)

2.3.4.2 尝试实现

枚举所有点所有边,判断其左右位置相对关系,如果所有点都落在该边的某一侧,则该边为极边,其端点为极点

易得,时间复杂度为 O ( n 3 ) O(n ^ 3) O(n3)

2.4 更进一步

2.4.1 减而治之

类比插入排序

我们可以考虑根据之前数据已经构成一个凸包,当新点来临之后,我们便可以考虑当前的点是否位于多边形内部 isPointInPolygon()

若位于内部或边界之上,我们便可以断定该点对凸包没有贡献

否则,将该点与凸包所构成的两条支撑线(Support-Lines)缝合到已有答案集合之中,并舍弃失去极性的点

2.4.2 转向形式

Pattern Of Turns

利用每个顶点相对于当前试图加入的点的不同的转向形式,获得支撑线以及不被丢弃的所有点

2.4.3 优点与劣势

该算法为在线算法,可以动态的添加点,从而改变凸包形式

但其复杂度虽然达到了 O ( n 2 ) O(n ^ 2) O(n2),但还是不尽如人意

2.5 求解凸包的高效算法

<
  • 79
    点赞
  • 404
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ACM 很全的计算几何模板 基础部分 1.几何公式 5 1.1三角形 5 1.2四边形 5 1.3正n边形 5 1.4圆 5 1.5棱柱 6 1.6棱锥 6 1.7棱台 6 1.8圆柱 6 1.9圆锥 6 1.10圆台 7 1.11球 7 1.12球台 7 1.13球扇形 7 2.直线与线段 7 2.0预备函数 7 2.1判三点是否共线 8 2.2判点是否在线段上 9 2.3判断两点在线段的同一侧 9 2.4判断两点是否在线段的异侧 9 2.5求点关于直线的对称点 10 2.7判断两线段是否相交 10 2.7.1常用版 10 2.7.2不常用版 11 2.8 求两条直线的交点 11 2.9点到直线的最近距离 12 2.10点到线段的最近距离 12 3.多边形 12 3.0 预备浮点函数 12 3.1判定是否是凸多边形 13 3.2判定点是否在多边形内 14 3.3 判定一条线段是否在一个任意多边形内 15 4. 三角形 16 4.0预备函数 16 4.1求三角形的外心 17 4.2求三角形内心 17 4.3求三角形垂心 17 5. 圆 18 5.0预备函数 18 5.1判定直线是否与圆相交 19 5.2判定线段与圆相交 19 5.3判圆和圆相交 19 5.4计算圆上到点p最近点 19 5.5计算直线与圆的交点 20 5.6计算两个圆的交点 20 6. 球面 21 6.0给出地球经度纬度,计算圆心角 21 6.1已知经纬度,计算地球上两点直线距离 21 6.2已知经纬度,计算地球上两点球面距离 21 7. 三维几何的若干模板 22 7.0预备函数 22 7.1判定三点是否共线 23 7.2判定四点是否共面 23 7.1判定点是否在线段上 23 7.2判断点是否在空间三角形上 24 7.3判断两点是否在线段同侧 24 7.4判断两点是否在线段异侧 25 7.5判断两点是否在平面同侧 25 7.6判断两点是否在平面异侧 25 7.7判断两空间直线是否平行 25 7.8判断两平面是否平行 26 7.9判断直线是否与平面平行 26 7.10判断两直线是否垂直 26 7.11判断两平面是否垂直 26 7.12判断两条空间线段是否相交 27 7.13判断线段是否与空间三角形相交 27 7.14计算两条直线的交点 28 7.15计算直线与平面的交点 28 7.16计算两平面的交线 29 7.17点到直线的距离 29 7.18 计算点到平面的距离 29 7.19计算直线到直线的距离 30 7.20空间两直线夹角的cos值 30 7.21两平面夹角的cos值 30 7.22直线与平面夹角sin值 31 1.最远曼哈顿距离 31 2. 最近点对 32 3. 最近点对 34 4. 最小包围圆 36 5. 求两个圆的交点 39 6. 求三角形外接圆圆心 40 7. 求凸包 42 8.凸包卡壳旋转求出所有对踵点、最远点对 44 9. 凸包+旋转卡壳求平面面积最大三角 47 10. Pick定理 50 11. 求多边形面积和重心 51 12. 判断一个简单多边形是否有核 52 13. 模拟退火 54 14. 六边形坐标系 56 15. 用一个给定半径的圆覆盖最多的点 60 16. 不等大的圆的圆弧表示 62 17. 矩形面积并 62 18. 矩形的周长并 66 19. 最近圆对 70 20. 求两个圆的面积交 74
ACM Codebook(ACM代码手册)是一本整理了算法竞赛常用算法和数据结构的参考手册。它是为了帮助算法竞赛选手快速查阅各种算法和数据结构的实现而编写的。 ACM Codebook的内容非常丰富,包括了各种常用算法,如排序算法、图论算法、动态规划算法等。同时,它还包含了各种常用数据结构的实现,如链表、栈、队列、堆等。此外,ACM Codebook还介绍了一些常见的算法设计技巧和优化技巧,帮助选手更好地解决问题。 ACM Codebook的作用非常明显,首先它提供了各种算法和数据结构的实现代码,方便选手直接复制粘贴使用,节省了编写代码的时间。其次,ACM Codebook提供了详细的算法和数据结构的说明和示例,帮助选手理解和掌握这些算法和数据结构的原理和用法。最后,ACM Codebook还提供了一些常见问题的解决方案,帮助选手快速解决问题。 ACM Codebook的编写并不容易,需要作者具备扎实的算法和数据结构基础,并且对算法竞赛有深入的了解。编写ACM Codebook需要不断地修改和更新,以适应算法竞赛中不断变化的需求。 总之,ACM Codebook是一本非常有用的参考手册,它不仅提供了丰富的算法和数据结构的实现,还提供了对应的说明和示例,帮助算法竞赛选手快速掌握和应用这些算法和数据结构。它是算法竞赛选手在比赛中必备的工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值