计算几何入门笔记
前置知识
-
浮点类型预定义与性质
- def(INF) = 1e100 , eps = 1e-6 , pi = acos(-1.00)
- 浮点数越靠近零点精度越高(分布越稠密);
- 三角函数,除法,开方,求次幂,取对数的误差较大。
考虑将除法转换为乘法。
-
取整
- 取上整 ceil(x)
- 取下整 floot(x)
- 四舍五入(int)(x+0.5)(int舍弃小数部分)
-
向量乘法
- 点积(内积、数量积)dot product
- 叉积 cross product (\(a × b\) 的方向满足右手定则)
性质(设:\(a = (a_1,a_2,a_3)\),\(b = (b_1,b_2,b_3)\))- a,b 与 a × b正交(互相垂直);
- a x b的方向满足右手定则('a'转向'b'的方向为右手四指向,大拇指方向为a x b);
- 几何意义在且仅在三维空间有严格意义;
- \(a×b=(a_2b_3-a_3b_2,a_3b_1-a1_b3,a_1b_2-a_2b_1);\)
- \(a×b\)的长度为\(|a||b|sinθ\)(a,b为边的平行四边形面积)
- *运算结果是一个伪向量,在不同的坐标系中可能不同
(平面中得到一个数量:\(a_1b_2-a_2b_1\)) - \(\overrightarrow{a}×\overrightarrow{a}=\overrightarrow{0}\)
- \(\overrightarrow{a}×\overrightarrow{b}=-\overrightarrow{b}×\overrightarrow{a}\)
- \(λ\overrightarrow{a}×\overrightarrow{b}=λ(\overrightarrow{a}×\overrightarrow{b})\)
- 满足分配律
- 应用:
- 判断向量间的顺时针,逆时针方向
若 P × Q > 0 , 则P在Q的顺时针方向。
若 P × Q < 0 , 则P在Q的逆时针方向。
若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向(此时需要借助数量积进一步判断)。 - 求夹角(需要用到acos(),asin()等反三角函数)
- 判断三点共线(共线向量定理)
- 求三角形面积(1/2*叉乘结果,一般地,计算几何中面积有正有负)
- 判断向量间的顺时针,逆时针方向
-
向量旋转
利用三角函数、单位圆,复数乘法性质:
三角函数对应的向量模长为1,复数乘法的几何意义为辐角相加,模长相乘. -
符号函数(判断相等)
点击查看代码
/*请不要直接用等号判断浮点数是否相等! 解决方法一,误差判断法: const double EPS=1e-9; 浮点数判断相等,fabs(x-y)<EPS; 浮点数判断为零,fabs(x)<EPS。 解决方法二,化浮为整法: 在不溢出整数范围的情况下,可以通过乘上10的k次方,转化为整数运算,最后在将结果转化为整数。*/ int sign(double d){ if(fabs(d) < EPS) return 0; return (d > 0) ? 1 : -1; }
对象关系判断(点、线)
面积计算与二维凸包
前置知识:pick定理
双耳定理
- 按逆时针顺序给定点集计算多边形面积:
三角剖分,注意叉积正/负面积参考
习题
题意:
思路:
(未A)点击查看代码