计算几何是一门兴起于二十世纪七十年代末的计算机科学的一个分支,主要研究解决几何问题的算法。在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。
计算几何问题的输入一般是关于一组几何对象的描述,如一组点、一组线段,或者一个多边形的按逆时针顺序排列的一组顶点。输出常常是对有关这些对象的问题的回答,如是否直线相交,是否为一个新的几何对象,如顶点集合的凸包。
本文将介绍一些平面上的计算几何算法。在这些算法中,每个输入对象都是一组点{p1,p2,p3...},其中每个pi=(xi,yi)。
点与向量
向量也称为矢量,是一种既有大小又有方向的量。在计算几何中,某个向量从点A指向点B,记为向量AB。
二维直角坐标系中的向量可以沿坐标轴分解,向量AB=xi+yj。所以向量AB可以用实数(x,y)来表示,同理n维向量也可以用n个实数来表示。因此一个点也可以表示一个向量。
向量的基本运算包括加减法,数乘,点积,叉积,混合积等。
如果有向量a=(x1,y1),向量b=(x2,y2)。那么:
- 向量a的长度|a|=sqrt(x2+y2)。
- 加法的定义为:向量a+向量b=(x1+x2,y1+y2)。减法同理。
- 数乘是向量和实数之间的运算,如果是一个正实数与向量相乘,向量只发生大小变化,方向不变。乘以负数则会将原向量反向,乘以0则变成零向量。
- 点积,也叫数量积或内积,得到的结果是一个实数。定义向量a·向量b=x1y1+x2y2。点积满足交换律不满足结合律。
- 叉积,也叫矢量积或外积。定义向量aX向量b=x1y2-x2y1,即两个向量形成的平行四边行的面积。
因为计算几何中经常涉及精度问题,需要对一个很小的数判断正负,为了修正误差,需要引入一个极小量eps。
1 const double eps=1e-8; 2 int dcmp(double x){ 3 if (fabs(x)<eps) return 0; 4 if (x>0) return 1; 5 return -1; 6 }