今天, AC 你 了吗? 2018/11/21.

Slides:



Advertisements
Similar presentations
青少年儿童常见伤害的预防. 伤害的定义 伤害是指各种物理性、化学性或生物性 事件而导致人体发生暂时或永久性损 伤、死亡和残疾的一类疾病的总称。
Advertisements

学生入党材料写作规范.
高职高专院校人才培养工作水平评估指标体系解读
小学科学中的化学 武威十九中 刘玉香.
1、什么是预算会计? 2、预算会计的组成体系? 3、预算会计的要素和会计等式? 4、预算会计的特点?
C语言程序设计 主讲教师 :张群燕 电话:
2 016 陕西广播电视台 餐饮娱乐行业广播投放方案 【第一版】.
2011年10月31日是一个令人警醒的日子,世界在10月31日迎来第70亿人口。当日凌晨,成为象征性的全球第70亿名成员之一的婴儿在菲律宾降生。 ?
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
儿科护理 说课 李国琴.
“八皇后”问题 崔萌萌 吕金华.
初级会计实务 第八章 产品成本核算 主讲人:杨菠.
第二章 语音 第六节 音变 轻 声1.
臺中市政府人事處 退休撫卹理論與實務.
中考阅读 复习备考交流 西安铁一中分校 向连吾.
唐雪峰 四川省疾病预防控制中心 四川省促进基本公共卫生服务均等化指导中心 2015年1月30日
中央广播电视大学开放教育 成本会计(补修)期末复习
人教版义务教育课程标准实验教科书 小学数学四年级上册第七单元《数学广角》 合理安排时间 248.
计算机硕士专业基础—C语言 赵海英
初中《思想品德》课程改革 回顾·现状·展望
中考语文积累 永宁县教研室 步正军 2015.9.
第六节 脑和脊髓的传导通路.
小学数学知识讲座 应用题.
勾股定理 说课人:钱丹.
药店会员制营销.
倒装句之其他句式.
第 22 课 孙中山的民主追求 1 .近代变法救国主张的失败教训: “师夷之长技以制 夷”“中体西用”、兴办洋务、变法维新等的失败,使孙中山
第一章 程序设计入门.
高级语言程序设计 主讲人:陈玉华.
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
程式撰寫流程.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
第五章 指针 5.1 指针的概念和定义 5.2 指针运算 5.3 指针和数组 5.4 字符串指针 5.5 指针数组 5.6 指向指针的指针
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
C语言 程序设计基础与试验 刘新国、2012年秋.
人教版数学四年级(下) 乘法分配律 单击页面即可演示.
计算几何 Computational Geometry
寫作評估 實用文寫作講解 1.
計數式重複敘述 for 迴圈 P
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
C语言复习2----函数.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
公 共 关 系 主编:谢苏.
今天, AC 你 了吗? 2019/4/21.
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
C语言程序设计 李祥 QQ:
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
第3章 空间力系的简化与平衡 §3–1 空间力系的简化 §3–2 空间力系的平衡 §3–3 物体的重心 §3–4 平行力系中心.
第八节 算术运算符和算术表达式.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第七章  数 组.
程式設計--linear search 通訊一甲 B 楊穎穆.
第十二章 位运算.
講題 :課程發展委員會的組織與運作機制 主講人:臺北市立明倫高中 教務主任王文珠.
美丽的旋转.
3-3 随机误差的正态分布 一、 频率分布 在相同条件下对某样品中镍的质量分数(%)进行重复测定,得到90个测定值如下:
高   学科 第五章 曲线运动 1、曲线运动 涪陵一中物理组.
畢氏定理(百牛大祭)的故事 張美玲 製作 資料來源:探索數學的故事(凡異出版社).
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
函式庫補充資料 1.
隨機函數.
102年人事預算編列說明 邁向頂尖大學辦公室製作.
Presentation transcript:

今天, AC 你 了吗? 2018/11/21

(Computational Geometry Basic) 第六讲 计算几何初步 (Computational Geometry Basic) 2018/11/21

第一单元 线 段 属 性 2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

思考: 1、传统的判断线段相交的方法是什么? 2、传统方法和本方法的区别是什么? 2018/11/21

特别提醒: 以上介绍的线段的三个属性,是计算几何的基础,在很多方面都有应用,比如求凸包等等,请务必掌握! 2018/11/21

第二单元 多边形面积 和重心 2018/11/21

基本问题(1): 给定一个简单多边形,求其面积。 输入:多边形(顶点按逆时针顺序排列) 输出:面积S 2018/11/21

思考如下图形: 2018/11/21

Any good idea? 2018/11/21

先讨论最简单的多边形——三角形 2018/11/21

三角形的面积: 在解析几何里, △ABC的面积可以通过如下方法求得: 点坐标 => 边长 => 海伦公式 => 面积 点坐标 => 边长 => 海伦公式 => 面积 2018/11/21

思考:此方法的缺点: 计算量大 精度损失 更好的方法? 2018/11/21

计算几何的方法: 在计算几何里,我们知道,△ABC的面积就是“向量AB”和“向量AC”两个向量叉积的绝对值的一半。其正负表示三角形顶点是在右手系还是左手系。 B C A C B A ABC成左手系,负面积 ABC成右手系,正面积 2018/11/21

大功告成: Area(A,B,C)= 1/2 * (↑AB) × (↑AC) =∣ ∣/2 特别注意: 以上得到是有向面积(有正负)! =∣ ∣/2 特别注意: 以上得到是有向面积(有正负)! Xb – X a Yb –Y a Xc – X a Yc –Y a 2018/11/21

凸多边形的三角形剖分 很自然地,我们会想到以 P1为扇面中心,连接P1Pi就得到N-2个三角形,由于凸性,保证这些三角形全在多边形内,那么,这个凸多边形的有向面积: A=sigma(Ai) (i=1…N-2) P1 P2 P3 P4 P5 P6 A1 A2 A3 A4 2018/11/21

凹多边形的面积? P1 P4 P3 P2 2018/11/21

依然成立!!! 多边形面积公式:A=sigma(Ai) (i=1…N-2) 结论: “有向面积”A比“面积”S其实更本质! 2018/11/21

任意点为扇心的三角形剖分: 我们能把多边形分成N-2个三角形,为什么不能分成N个三角形呢? P3 P2 P4 P0 P1 P5 P6 2018/11/21

前面的三角剖分显然对于多边形内部任意一点都是合适的! 我们可以得到: A=sigma(Ai) ( i=1…N ) 即:A= sigma∣ ∣/2 ( i=1…N ) Xi – X0 Yi –Y0 X(i+1) – X0 Y(i+1) –Y0 2018/11/21

能不能把扇心移到多边形以外呢? P0 P1 P2 P3 P4 2018/11/21

既然内外都可以,为什么不设P0为坐标原点呢? O P1 P2 P3 P4 现在的公式? 2018/11/21

简化的公式: 面积问题搞定! A=sigma∣ ∣/2 ( i=1…N ) Xi Yi X(i+1) Y(i+1) 2018/11/21

基本问题(2): 给定一个简单多边形,求其重心。 输入:多边形(顶点按逆时针顺序排列) 输出:重心点C 2018/11/21

从三角形的重心谈起: 三角形的重心是: (x1+x2+x3) / 3,(y1+y2+y3) / 3 可以推广否? Sigma(xi)/N , sigma(yi)/N (i=1…N) ??? 2018/11/21

看看一个特例: . 2018/11/21

原因: 错误的推广公式是“质点系重心公式”,即如果认为多边形的质量仅分布在其顶点上,且均匀分布,则这个公式是对的。 但是,现在多边形的质量是均匀分布在其内部区域上的,也就是说,是与面积有关的! 2018/11/21

Solution: 剖分成N个三角形,分别求出其重心和面积,这时可以想象,原来质量均匀分布在内部区域上,而现在质量仅仅分布在这N个重心点上(等假变换),这时候就可以利用刚才的质点系重心公式了。 不过,要稍微改一改,改成加权平均数,因为质量不是均匀分布的,每个质点代表其所在三角形,其质量就是该三角形的面积(有向面积!),——这就是权! 2018/11/21

公式: C=sigma(Ai * Ci) / A (i=1…N) Ci=Centroid(△ O Pi Pi+1) C=sigma((↑Pi +↑Pi+1)(↑Pi ×↑Pi+1) ) /(6A) 2018/11/21

全部搞定! 2018/11/21

第三单元 凸包( Convex Hull ) 2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

2018/11/21

凸包模板: //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)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x)); int Compare(const void *p1,const void *p2) POINT *p3,*p4; double m; p3=(POINT *)p1; p4=(POINT *)p2; m=Multiply(a[0],*p3,*p4) ; if(m<0) return 1; else if(m==0&&(Distance(a[0],*p3)<Distance(a[0],*p4))) return 1; else return -1; void Tubao() int i; result[0].x=a[0].x; result[0].y=a[0].y; result[1].x=a[1].x; result[1].y=a[1].y; result[2].x=a[2].x; result[2].y=a[2].y; top=2; for(i=3;i<=n;i++) while(Multiply(result[top-1],result[top],a[i])<=0) top--; result[top+1].x=a[i].x; result[top+1].y=a[i].y; top++; int main() int i,p; double px,py,len,temp; while(scanf("%d",&n)!=EOF,n) for(i=0;i<n;i++) scanf("%lf%lf",&a[i].x,&a[i].y); if(n==1) printf("0.00\n"); continue; else if(n==2) printf("%.2lf\n",Distance(a[0],a[1])); py=-1; if(py==-1 || a[i].y<py) px=a[i].x; py=a[i].y; p=i; else if(a[i].y==py && a[i].x<px) //swap(a[0],a[p]) temp=a[0].x; a[0].x=a[p].x; a[p].x=temp; temp=a[0].y; a[0].y=a[p].y; a[p].y=temp; qsort(&a[1],n-1,sizeof(double)*2,Compare); a[n].x=a[0].x; a[n].y=a[0].y; Tubao(); len=0.0; for(i=0;i<top;i++) len=len+Distance(result[i],result[i+1]); printf("%.2lf\n",len); return 0; 2018/11/21

Any Question? 2018/11/21

Thank you! See you next week. 2018/11/21