-3.在此声明:
笔者极端厌恶计算几何,以至于直到今天之前都只打过几个计算几何的模板~~~~~
不过鉴于今年是18年,所以感觉SD很有可能考计算几何(18年是什么理由啊喂)
于是滚过来整理计算几何的资料了......
-2.可能会用到的资料:
《计算几何——算法与应用》
Mark·Overmars 著 邓俊辉 译
《计算几何导论》
[美] F·P·普霍帕拉塔 M·I·沙莫斯 著
——好像是一些没什么用的东西呢
《算法导论——第33章》
[美]Tomas H.Cormen Charles E.Leiserson Ronald L.Rivest Clifford Stein 著
——听说是可以提升文章逼格的东西呢
本文会尽量(大概吧)把上述文献中对OI有用的部分扒拉出来
《蓝书》
刘汝佳 著
《紫书》
刘汝佳 著
某些大佬的blog——%%%%%%%%%%%%%%%%%%%%%%%%%%%
-1.可能会用到的OJ:
BZOJ——尽管他很爆炸
POJ——尽管全是英文
HDU——我好像没怎么用过
luogu——很良心的OJ吧,大概......
LOJ——几乎没用过,应该也用不到吧
UOJ——不用搜索引擎就能翻出需要的题——如果需要的题真的凑巧在这个OJ里的话
(废话真多)
计算几何最重要的是(拼命调)关注点和向量
1.几何的准备工作(可以直接略过而和后文没什么联系的工作):
1.1.一般定义和记法以及一些可有可无且并不全面的说明:
计算几何的研究对象往往是基于欧几里得空间的点集的,
因为,当我们存在一个坐标系时
一个点可以有一个坐标,于是与原点构成了向量——实际上,在许多大佬的计算几何模板中都将点和向量宏定义为一个东西,如刘汝佳的《蓝书》
两个点可以构成一个线段或者直线,直线可以定义半平面交
多个点可以构成多边形,或者凸包——事实上凸包和半平面交存在着诸多相似性
多边形可以各种剖分
而且,相比于用其他元素描述上述内容而言,坐标系中的点是更加适用于计算机语言的,因为一个点表示成有序数对之后,与任何数对(pair)无异
当然以上胡扯也可以扯到扩展到更高的维度上去
于是约定有如下不常用的记法:
$E^d$表示d维欧几里得空间,(在下文中,d一般大于等于2且不超过3,——由于笔者水平而有的限制)
在d维欧几里得空间中,有如下基本对象:
1.1.1.点、向量——
一个d元组$(x_1,x_2,...,x_d)$,他可以表示一个点P,也可以表示一个起点为$E^d$的原点O,终点为点P的一个有d个分量的向量
1.1.2.线、平面——
给定$E^d$中两个不同的点$P_1$,$P_1$的线性组合
$$aP_1+(1-a)P_2(a∈R)$$
可以表示$E^d$中的一条直线(如果把P看做向量的话,上式是高中数学中常见的向量基本定理推论)
给定$E^d$中三个不同的点$P_1$,$P_2$,$P_3$的线性组合
$$aP_1+bP_2+(1-a-b)P_3$$
可以表示$E^d$中的一个平面
类似的上面关于线面的定义也可以推广的更高的维度而成为一种叫做线性簇的东西
(没有用)
线段——
给上文中的直线表达式中加一个对a的范围限制,可以得到一条线段
如,加入限制(0≤a≤1)可以得到一个以$P_1$,$P_2$位端点的线段,可以表示为$\overline{P_1P_2}$或$\overline{P_2P_1}$
1.1.3.凸集——
若$E^d$中的点集D中的任何两点$P_1,P_2$,$\overline{P_1P_2}$中的所有点属于D,则称D是$E^d$中的一个凸集
凸集的交是凸集
直线中的任意线段是凸集
平面内的任意凸多边形是凸集
空间中的任意凸多面体是凸集
关于更高维的凸集的相关性质,可移步《线性规划》——反正笔者看了一点就直接弃疗了的说
凸壳与凸包——
$E^d$中点集S的凸包是$E^d$中包含S的最小凸集,
凸壳是凸包的边界
1.1.4. 多边形——
在$E^2$中多边形定义为线段的一个有限集合使得每个端点恰为两条边所共有,且没有边的子集具有该性质(多边形仅指这一个边界部分)
注意:
是多边形
而
不是
多边形的其他内容没有什么值得强调的
简单多边形——
若不相邻的边无公共点,则多边形是简单的
如上上图中的多边形就不是简单的
简单多边形把平面划成两个不相交的区域
称为为多边形的内部和外部
凸多边形与星形多边形——
若简单多边形P的内部是个凸集,则此简单多边形是凸多边形
若存在点z在简单多边形P的内部或边上,满足对于P的所有点p,线段$\overline{zp}$属于P的内部或属于P边,则说明多边形P是星形的
(因此每个凸多边形都是星形的)
然而:
如上图就不是星形多边形
在星形多边形P中,所有z构成的集合为P的核(he?hu?)容易证明,核是一个凸集
(可以用凸集的定义来证)
2.二维几何——点与向量与线段的性质:
这一部分将在$E^2$内
以向量的计算为基础
讨论点与线段的关系,线段与线段的关系
将介绍如何定义一个点,如何定义一个向量
如何实现向量的基本计算
如何用点和向量表示直线、线段,进而用点和向量实现对直线线段的操作
这大概是计算几何中最简单的一部分,将会粘贴一些模板
2.1.二维向量的基本运算:
向量的基本运算作为处理计算几何点线的基础出现
2.1.1.由于一些众所周知的原因,首先定义精度:
const double eps=1e-10; int dcmp(double x){ if(fabs(x)<eps)return 0; else return x<0?-1:1; }//精度