第8章 计算几何学
第8章 计算几何学 本章主要内容 8.1 几何基本知识 8.2 基本算法 8.3 凸包 8.4 实例研究 8.1 几何基本知识 8.1.1 矢量的概念 8.1.2 矢量加减法 8.1.3 矢量叉积 8.1.4 折线段的拐向判断 8.1.5 判断点是否在线段上 8.1.6 跨立试验与判断两线段是否相交 8.1.7 整数点与Pick定理 8.1.1 矢量的概念 1、 线段 8.1.2 矢量加减法 设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ) 。矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 )。矢量加法的几何意义是以向量P、Q为邻边的平行四边形的对角线 8.1.3 矢量叉积 2、叉积的性质: double CrossProd(double x0,double y0,double x1,double y1,double x2,double y2) { return (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0); } 8.1.3 矢量叉积 8.1.4 折线段的拐向判断 折线段的拐向判断:左转、右转: 8.1.5 判断点是否在线段上 判断点C在线段AB上的依据是: 点C在线段AB所在的直线L上, C 在以A、B为对角顶点的矩形内。 点在线段上的条件 ON_SEGMENT算法描述: C点在直线AB上:AB × AC=0 C点不在线段AB的延长线或反向延长线上: (min(xA,xB) = xC)且(xC = max(xA,xB)) 且 (min(yA,yB) = yC)且(yC = max(yA,yB)) 8.1.6 跨立试验与判断两线段是否相交 1、线段相交 设有4点:P1、P2、 Q1 、 Q2,问线段P1P2与 Q1Q2是否相交? 8.1.6 跨立试验与判断两线段是否相交 2、快速排斥试验 设以线段P1P2为对角线的矩形为R,以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交。 以线段P1P2为对角线的矩形为R,以线段 Q1Q2 为对角线的矩形为T,如果R和T相交,则两线段就一会相交吗? 8.1.6 跨立试验与判断两线段是否相交 3、跨立试验 8.1.6 跨立试验与判断两线段是否相交 4、跨立试验的叉积表示 8.1.6 跨立试验与判断两线段是否相交 改革春风吹满地(求多边形的面积hdu:2036) Input 输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3=n=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。 Output 对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。每个实例的输出占一行。 Sample Input 3 0 0 1 0 0 1 4 1 0 0 1 -1 0 0 -1 0 #include stdio.h #include math.h #define N 100 double area; double CrossProd(int x0,int y0,int x1,int y1,int x2,int y2) { return (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0); } double run(int n,int x[],int y[]) { int i; area=0; for(i=1;in-1;i++) area+=CrossProd(x[0],y[0],x[i],y[i],x[i+1],y[i+1]); return area/2; } int main() { int n,x[N],y[N],i; scanf(%d,n); while(n!=0) { for(i=0;in;i++) scanf(%d%d,x[i],y[i]); area=run(n,x,y); printf(%.1f\n,area); scanf(%d,n); } return 0; } 8.1.7 整数点与Pick定理 1、线段上格点问题 格点:就是平面上坐标为整数的点。 问题:平面中一条线段上有多少个整数点? 8.1.7 整数点与Pick定理 3、多边形中的格点问题 8.1.7 整数点与Pick定理 4、Pick定理:设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,多边形边界上的整数点数为L
原创力文档

文档评论(0)