网站大量收购闲置独家精品文档,联系QQ:2885784924

(lecture_05)计算几何基础_2009031689104.ppt

  1. 1、本文档共71页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ACM程序设计 杭州电子科技大学 刘春英 acm@hdu.edu.cn 今天, 你 了吗? 每周一星(4): 第五讲 计算几何初步 (Computational Geometry Basic) 第一单元 线段属性 思考: 1、传统的计算线段相交的方法是什么? 2、传统方法和本方法的区别是什么? 特别提醒: 以上介绍的线段的三个属性,是计算几何的基础,在很多方面都有应用,比如求凸包等等,请务必掌握! 第二单元 多边形面积和重心 基本问题(1): 给定一个简单多边形,求其面积。 输入:多边形(顶点按逆时针顺序排列) 输出:面积S 思考如下图形: Any good idea? 先看最简单的多边形——三角形 三角形的面积: 在解析几何里, △ABC的面积可以通过如下方法求得: 点坐标 = 边长 = 海伦公式 = 面积 思考:此方法的缺点: 计算量大 计算几何的方法: 在计算几何里,我们知道,△ABC的面积就是“向量AB”和“向量AC”两个向量叉积的绝对值的一半。其正负表示三角形顶点是在右手系还是左手系。 大功告成: Area(A,B,C)= 1/2 * (↑AB) × (↑AC) =∣ ∣/2 特别注意: 以上得到是有向面积(有正负)! 凸多边形的三角形剖分 很自然地,我们会想到以 P1为扇面中心,连接P1Pi就得到N-2个三角形,由于凸性,保证这些三角形全在多边形内,那么,这个凸多边形的有向面积: A=sigma(Ai) (i=1…N-2) 凹多边形的面积? 依然成立!!! 多边形面积公式:A=sigma(Ai) (i=1…N-2) 任意点为扇心的三角形剖分: 我们能把多边形分成N-2个三角形,为什么不能分成N个三角形呢? 比如,以多边形内部的一个点为扇心,就可以把多边形剖分成 N个三角形。 前面的三角剖分显然对于多边形内部任意一点都是合适的! 我们可以得到: A=sigma(Ai) ( i=1…N ) 即:A=sigma∣ ∣/2 ( i=1…N ) 能否把扇心移到多边形以外呢? 既然内外都可以,为什么不设P0为坐标原点呢? 简化的公式: A=sigma∣ ∣/2 ( i=1…N ) 基本问题(2): 给定一个简单多边形,求其重心。 输入:多边形(顶点按逆时针顺序排列) 输出:重心点C 从三角形的重心谈起: 三角形的重心是: (x1+x2+x3) / 3,(y1+y2+y3) / 3 看看一个特例: 原因: 错误的推广公式是“质点系重心公式”,即如果认为多边形的质量仅分布在其顶点上,且均匀分布,则这个公式是对的。 但是,现在多边形的质量是均匀分布在其内部区域上的,也就是说,是与面积有关的! Solution: 剖分成N个三角形,分别求出其重心和面积,这时可以想象,原来质量均匀分布在内部区域上,而现在质量仅仅分布在这N个重心点上(等假变换),这时候就可以利用刚才的质点系重心公式了。 不过,要稍微改一改,改成加权平均数,因为质量不是均匀分布的,每个质点代表其所在三角形,其质量就是该三角形的面积(有向面积!),——这就是权! 公式: C=sigma(Ai * Ci) / A (i=1…N) Ci=Centroid(△ O Pi Pi+1) = (O + ↑Pi +↑Pi+1 )/3 C=sigma((↑Pi +↑Pi+1)(↑Pi ×↑Pi+1) ) /(6A) 第三单元 凸包( Convex Hull ) 凸包模板: Any question? 课后在线作业: ?《ACM程序设计》在线作业(5)—— 计算几何 Welcome to HDOJ Thank You ~ //xiaoxia版 #include stdio.h #include math.h #include stdlib.h typedef struct { double x; double y; }POINT; POINT result[102]; //保存凸包上的点 POINT a[102]; int n,top; double Distance(POINT p1,POINT p2) //两点间的距离 { return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } double Multiply(POINT p1,POINT p2,POINT p3) //叉积 { return ((p2.x-p1.x

文档评论(0)

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

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

1亿VIP精品文档

相关文档