计算几何初步.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算几何初步.ppt

计算几何初步 何亮 roba269@ 计算几何 计算几何题的特点 代码量大 特殊情况多 精度问题难以控制 …… 注意事项 注意事项 不可直接判断相等(即使是那些看起来似乎“显然”没有精度问题的值) 尽量只用加/减法和乘法,避免除法,尤其避免除以一个很小的数 尽量避免两个很接近的数相减 尽量少用开方、三角函数等 符号函数 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;} 向量运算 向量是计算几何中极重要的工具 二维向量:应用于平面几何 加法 (a,b) + (c,d) = (a+c, b+d) 数乘 k(a,b) = (ka, kb) 向量运算 向量点积 (x1,y1)?(x2,y2) = x1*x2 + y1*y2 点积的结果是一个标量,表述向量之间的“前后”关系。很容易扩展到高维情况。 向量夹角 向量运算 向量叉积 二维形式: (x1,y1)×(x2,y2)=(x1*y2-x2*y1) 数值为向量形成的平行四边形面积 叉积表示向量的“左右” 叉积的结果实际上仍是一个向量 在二维的情况下,向量方向垂直纸面 向量运算 三维叉积 数值:平行四边形面积 方向:与两向量均正交 单纯形的“volume” 三角形面积 四面体体积-更高维 混合积 体积公式的另一种解释方法 展开之后可以发现与行列式的结果相同 推导过程…… 四面体的体积值的符号的意义: 如果为正,表示从d点的角度来看, a-b-c形成一个顺时针顺序 坐标系为右手系 比如,a=(1,0,0) b=(0,1,0) c=(0,0,1) d=(0,0,0), 求得V=1/6 多边形面积 多边形重心 剖分成小的三角形(带符号),把每个小三角形的重心看作质点,求加权平均 设多边形总面积为A,每个小三角形为Ai 线段相交的判断 判断 与 是否一正一负 说明c,d分别在线段ab的两侧 同理判断a,b是否在线段c,d的两侧 不规范相交 情况众多,应视具体题目而定 判断点在多边形内 凸多边形 只须求叉积 一般多边形 射线法——注意各种特殊情况的处理 环顾法 …… 凸包 包含所有点的最小凸图形 凸包 卷包裹法 Gift-Wrapping(Jarviss march) O(nh) 凸包 Graham-Scan O(nlogn+n) 首先选择最左下点,将剩余点按极角排序 维护一个栈,若下一个点与当前栈顶两点成向右旋转关系,则弹出栈顶元素,直至成向左旋转为止。 每个点进出栈一次,故扫描过程为O(n) 凸包 以叉积为依据排序,避免除法运算 int cmp(Point a, Point b) { return sig(a.x*b.y-a.y*b.x) 0; } 凸包 问题——若要求输出共线点,难以处理 双链法改进Graham Scan 先按y从小到大,若y相同则按x从小到大排序 分左链右链分别进行栈的运算 增量算法 从较小的凸包开始,逐次加入新的点 先选出3个点,形成三角形 依次检查剩下的点 若点在当前凸包内,不变 否则,检查当前点与当前凸包的“切线”,更新凸包 增量算法 “切点”——旋转方向发生变化的点 增量算法 朴素实现 O(n^2) 预先对x坐标排序,令得每次新点都不在原凸包上,可以使总的时间复杂度降为O(nlogn) 这种算法有什么好处? 三维凸包简述 三维凸包同样有类似二维的算法 卷包裹 (复杂) 分治 (复杂) 增量 (较简单) … 三维凸包简述 朴素算法 枚举三点,判断其余所有点是否在此三点确定的平面的同侧。如是,则此面为凸包上的面。 如何判断点在面的一侧? 复杂度O(n^4) 三维凸包简述 增量算法 凸包表示方法 记录与每面关联的三点:沿每面的法线方向,从体外面向内看,三个点成逆序排列 记录与每棱关联的二面 记录与每点关联的三棱 三维凸包简述 新加一点p,若p与面(a,b,c)形成的四面体体积为负,说明从p点可以看到(a,b,c) 若p点不能看到任何面,说明p在体内 否则,找“分界线” 对某条棱,若与它关联的两面分别为可见/不可见,则此棱为一条“分界线” (所谓Horizon) 找出所有“分界线”后,更新凸包 三维凸包简述 复杂度分析 若共有N个点,则根据欧拉定理,点数、棱数、面数的数量级都为O(N) 故总的复杂度为O(N^2) 更细致的实现和更精确的分析可得出,期望时间复杂度为O(nlogn)

文档评论(0)

gshshxx + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档