- 1
- 0
- 约3.28千字
- 约 30页
- 2018-03-10 发布于浙江
- 举报
[管理学]计算几何
根据2007年ACM协会暑期集训专题 计算几何 改编 引入 计算几何,也叫向量几何。 问题比较有趣,但是有一定难度 计算几何题的特点 代码量大 特殊情况多 精度问题难以控制 …… 需要注意的细节 常用头文件#includemath.h 计算几何中一般来说使用double型比较频繁,请注意数据类型的选择,该用实数的时候就用double,而float容易失去精度。 判断double型的x是否为0,应当用xeps x-eps(或者fabs(x)eps),其中eps代表某个精度,常常取eps=0.000001,还有其他类似情况也要注意double类型的精度问题,int(x+eps),避免x=4.999999999 需要注意的细节 圆周率取3.141592654或者更精确,或者用acos(-1) 角度制和弧度制的转换,C/C++中的三角函数均为弧度制 尽量少用除法,开方,三角函数,容易失去精度。用除法时注意除数不为0 输出的时候要小心-0.00000,比如 a=-0.0000001,printf(“%.5lf”,a); 示例 const double eps = 1e-6; int sig(double k) { if (k eps) return 1; if (k -eps) return -1; return 0; } int is_equal(double a, double b) {return sig(a-b) == 0;} 向量及其运算 计算几何中经常使用向量,而且基本上都是二维的,下面用αβγ代表三个向量 α=(x[0],y[0]) β=(x[1],y[1]) γ=(x[2],y[2]) 某些题目需要经常使用向量运算,因此对于这类问题最好建立构造类型或者类来表示向量,并将向量之间的运算进行重载 一般需要重载加法,减法,和向量乘法 向量及其运算 struct point{ //构造点的数据类型,也可作向量使用 double x; double y; }v1,v2; point operator+(point p1,point p2); double operator*(point p1,point p2); 向量及其运算 内积的几何意义:α在β的投影α’与β的长度乘积 外积的几何意义:α和β所张成的平行四边形的有向面积 外积在计算几何的题目当中经常使用 向量及其运算 向量有两种乘法,内积(数量积,点积)和外积(向量积,叉积),一般是要根据题目需要选择其中一个重载,多数情况是重载外积,其中 内积α·β= x[0]*x[1] + y[0]*y[1] 外积α×β= x[0]*y[1] – x[1]*y[0]= 向量运算 向量叉积 二维形式: (x1,y1)×(x2,y2)=(x1*y2-x2*y1) 数值为向量形成的平行四边形面积 叉积表示向量的“左右” 叉积的结果实际上仍是一个向量 在二维的情况下,向量方向垂直纸面 外积的应用 外积的应用 考察右图有向线段P1P2 “向右拐” 得到P2P3有向线段P1P2 “向左拐” 得到P2P4可以利用外积判断“拐向”,这在求凸包时会用到 外积的应用 利用外积求三角形面积 已知三个顶点坐标为(a[0],b[0]),(a[1],b[1]),(a[2],b[2]),则三角形面积为注意别忘记取绝对值,这里利用面积是否为0也可以考察三点共线问题 这个方法求面积比海伦公式或者其他方法要好 外积的应用 由求三角形面积的方法可以推广求凸多边形面积 如图,从一固定点出发,向其他各点引辅助线,这样就分割成了若干个三角形,利用上式求出每个三角形的面积再相加即可。 多边形面积 三角形的一些性质 如何判断点是否在三角形内部? 此点与三角形三个顶点相连,出现三个三角形,如果这三个三角形的面积之和等于原三角形面积,那么该点在内部 推广:可用来判断点是否在凸多边形内部 思考:如何判断点是否在一般多边形内部? Typedef struct point { double x ; double y ; }POINT ; double CrossProd(POINT A, POINT B, POINT C) { return(B.x – A.x)*(C.y – A.y) – (C.x – A.x)*(B.y – A.y) ; } 判断点在直线上 利用三点共线的等价条件α×β== 0 直线上取两不同点P1,P2,若点P在直线上,则fabs((P1 - P) × (P2 - P )) eps 如果该题目需要编写求三角形面积的函数,那直接判断这三个点形成的三角形面积是否eps 判断点在线段上 判断点P(x,y)是否在线段P1P2上,其中P1(x1,y1),P2(x
原创力文档

文档评论(0)