- 1、本文档共58页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[计算几何在程序设计竞赛中的应用
计算几何在程序设计竞赛中的应用 预备知识(I) 差积: 预备知识(II) 差积应用(1):判断两条线段是否相交 预备知识(III) 特殊情况: 预备知识(VI) 为解决上述问题,我们引入点积: 预备知识(V) 设dot(a,b,c) 返回a,b.a,c的值。我们来看dot(a,b,c)值与c在ab上投影c’的关系. 基本问题举例(Ⅰ) 1.位置 (左右)判断 基本问题举例(Ⅰ) 基本思路: 基本问题举例(Ⅰ) 代码: 基本问题举例(Ⅱ) 2.求交点(ZJU1460) 问题描述:用刀切1000*1000的方形蛋糕,问切割若干刀之后,蛋糕被分为多少块,假设: 蛋糕顶点坐标为(0,0)(0,1000)(1000,1000)(1000,0) 切割刀数不超过8 切割后每一块蛋糕的边长不小于1 切割线和蛋糕边界有两个交点 基本问题举例(Ⅱ) 基本思路 假设平面上已经被m条直线切割成了n块,那么再增加一条直线增加的块数等于增加的交点数加1。 基本问题举例(Ⅱ) 相关算法 根据已知两点坐标,求过这两点的直线解析方程: a*x+b*y+c = 0 (a = 0) 基本问题举例(Ⅱ) 相关算法 判断两线段是否相交,如果相交则求出交点 相交用叉积cross(a,b,c)*cross(a,b,d)0 cross(c,d,a)*cross(c,d,b)0)判断(注意表示越界) 求交点 基本问题举例(Ⅱ) 特殊情况 切割线和边界或者以前的切割线重合(排除) 重复交点(只计算1次) 在边界相交(不增加交点) 基本问题举例(Ⅱ) 代码(主程序) 基本问题举例(Ⅲ) 3.求多边形的面积。 前面已经讲过,两向量的叉积的几何意义是以这两个向量为邻边的平行四边形的有向面积,我们可以利用这一点来求简单多边形的面积。 所谓简单多边形就是任何不相邻的两条边都没有交点,包括凸多边形和凹多边形。 基本问题举例(Ⅲ) 求下面多边形的面积,已知个顶点的坐标。 基本问题举例(Ⅳ) 4.求凸包 定义:直观地讲,对于一个平面点集或者一个 多边形,它的凸包指的是包含它的最小凸 图形或最小凸区域。 基本问题举例(Ⅳ) Graham-Scan算法(了解Gift-Wrapping算法 ) 试探性凸包 我们尝试从p1(最低点,一定属于凸包)出发,沿着多边形顶点逆时针的顺序,试探性的增长凸包.显然,一个点如果属于凸包,那么它到达下一个点一定需要左转,否则,该点一定不属于凸包。 基本问题举例(Ⅳ) 算法总结: 基本问题举例(Ⅳ) 3.伪代码: push(p1);push(p2); i=3; while i=n do if pi 在栈顶边pt-1pt左手方向 then push(pi) 并且i++; else pop(); 附加问题(需要离散化问题) 例:zju1128 问题描述:一些已知右下顶点和左上顶点坐标的矩形,这些矩形可能部分重叠,求它们所占的实际面积。例如: 附加问题(需要离散化问题) 方案一、 把矩形映射到数组M[ ][ ]中,如果某矩形的位置为(x1,y1)(x2,y2)则M[i][j]=1(其中x1=i=x2,y1=j=y2)。但是,如果坐标值离散程度很大或者非整型,此方案就不可行。 附加问题(需要离散化问题) 方案三——离散化 附加问题(需要离散化问题) 代码 #includeiostream using namespace std; double x[200],y[200],in[100][4]; bool xy[200][200]; double N=0.000001; int n_map; void input(); void solve(); double cacu(); 附加问题(需要离散化问题) int main(){ while(cinn_map n_map != 0) { input(); sort(x,x+2*n_map); sort(y,y+2*n_map); memset(xy,0,sizeof(xy)); solve(); double sum=cacu(); coutsumendl; } return 0; } 附加问题(需要离散化问题) void input(){ for(int i = 0,k=0 ; i n_map ; i++) { cinin[i][0]in[i][1]in[i][2]in[i][3]; x[k] = in[i][0]; y[k] = in[i][1]; k++; x[k] = in[i][2]; y[k] = in[i][3]; k++
您可能关注的文档
- 《员工消防须知.doc
- [视频矩阵的安装与调试5.ppt
- 《员工激励话语.doc
- 《员工离职带走客户是否构成对企业商业秘密的侵害北京唐青林律师.docx
- 《员工的职业生涯规划书.doc
- 《员工绩效奖发放管理办法.doc
- 《员工激励十大工程试题.doc
- 《员工绩效等级考核办法.doc
- [视频监控系统硬盘录像机.ppt
- 《员工绩效考核方案001.doc
- 死亡诉讼申请书范本(3).docx
- 老公在侧儿子在旁得文案.docx
- Unit 5 Work time Lesson1 课件(共32张PPT)(2025年新版).pptx
- A Let's learn&Let's do(2025年新版的啊啊).ppt
- Unit 2 I think that mooncakes are delicious! Section B 2a—Self Check 课件 (共22张PPT)人教版九年级全一册36.pptx
- Unit 5 Education Lesson 1课件(共17张ppt) 北师大版英语选择性必修第二册.ppt
- Unit 4 Looking good, feeling good Extended reading课件(共16张PPT,内镶嵌视频和音频) 2024-2025学年高一英语牛津译林版(2019)必修.pptx
- Unit 3 Learning better Part B Let's talk — Play a guessing game 课件(共22张PPT)(2025年新版).pptx
- Unit 2 Clean our classroom第三课时 Wrap-up time Making a cleaning plan课件(共20张PPT).pptx
- Unit 5 My clothes Part A Let’s learn 课件(共29张PPT)(2025年新版).pptx
文档评论(0)