ACM计算几何基础_第1页
ACM计算几何基础_第2页
ACM计算几何基础_第3页
ACM计算几何基础_第4页
ACM计算几何基础_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ACM程序设计2/3/20231第五讲计算几何初步(ComputationalGeometryBasic)2/3/20232第一单元线段属性2/3/20233P0p1是否在p0p2的顺时针方向上?P0p1和p1p2在p1点向是向左转还是向右转?P1p2和p3p4是否相交?2/3/20234叉积——线段算法的中心可把叉积定义为以下行列式也可把叉积看做以下平行四边形的面积2/3/202352/3/20236P0p1是否在p0p2的顺时针方向上?2/3/20237P0p1和p1p2在p1点向是向左转还是向右转?2/3/20238P1p2和p3p4是否相交?2/3/202392/3/2023102/3/202311思考:1、传统的计算线段相交的方法是什么?2、传统方法和本方法的区别是什么?2/3/202312特别提醒:以上介绍的线段的三个属性,是计算几何的基础,在很多方面都有应用,比如求凸包等等,请务必掌握!2/3/202313第二单元多边形面积和重心2/3/202314基本问题(1):给定一个简单多边形,求其面积。输入:多边形(顶点按逆时针顺序排列)输出:面积S2/3/202315思考如下图形:2/3/202316Anygoodidea?2/3/202317先看最简单的多边形——三角形2/3/202318三角形的面积:在解析几何里,△ABC的面积可以通过如下方法求得:点坐标=>边长=>海伦公式=>面积2/3/202319思考:此方法的缺点:计算量大精度损失更好的方法?2/3/202320计算几何的方法:在计算几何里,我们知道,△ABC的面积就是“向量AB”和“向量AC”两个向量叉积的绝对值的一半。其正负表示三角形顶点是在右手系还是左手系。ABC成左手系,负面积ABC成右手系,正面积BCACBA2/3/202321大功告成:

Area(A,B,C)=1/2*(↑AB)×(↑AC)

=∣

∣/2特别注意:以上得到是有向面积(有正负)!Xb–XaYb–YaXc–XaYc–Ya2/3/202322凸多边形的三角形剖分很自然地,我们会想到以P1为扇面中心,连接P1Pi就得到N-2个三角形,由于凸性,保证这些三角形全在多边形内,那么,这个凸多边形的有向面积:

A=sigma(Ai)(i=1…N-2)P1P2P3P4P5P6A1A2A3A42/3/202323凹多边形的面积?P1P4P3P22/3/202324依然成立!!!多边形面积公式:A=sigma(Ai)(i=1…N-2)结论:“有向面积”A比“面积”S其实更本质!2/3/202325任意点为扇心的三角形剖分:我们能把多边形分成N-2个三角形,为什么不能分成N个三角形呢?比如,以多边形内部的一个点为扇心,就可以把多边形剖分成N个三角形。P0P1P2P6P5P4P32/3/202326前面的三角剖分显然对于多边形内部任意一点都是合适的!我们可以得到:A=sigma(Ai)(i=1…N

)即:A=sigma∣

∣/2

(i=1…N

)Xi–X0Yi–Y0X(i+1)–X0Y(i+1)–Y02/3/202327能否把扇心移到多边形以外呢?P0P1P2P3P42/3/202328既然内外都可以,为什么不设P0为坐标原点呢?OP1P2P3P4现在的公式?2/3/202329简化的公式:A=sigma∣

∣/2(i=1…N

)XiYiX(i+1)Y(i+1)面积问题搞定!2/3/202330基本问题(2):给定一个简单多边形,求其重心。输入:多边形(顶点按逆时针顺序排列)输出:重心点C2/3/202331从三角形的重心谈起:三角形的重心是:

(x1+x2+x3)/3,(y1+y2+y3)/3可以推广否?Sigma(xi)/N,sigma(yi)/N(i=1…N)???2/3/202332看看一个特例:.2/3/202333原因:错误的推广公式是“质点系重心公式”,即如果认为多边形的质量仅分布在其顶点上,且均匀分布,则这个公式是对的。但是,现在多边形的质量是均匀分布在其内部区域上的,也就是说,是与面积有关的!2/3/202334Solution:剖分成N个三角形,分别求出其重心和面积,这时可以想象,原来质量均匀分布在内部区域上,而现在质量仅仅分布在这N个重心点上(等假变换),这时候就可以利用刚才的质点系重心公式了。不过,要稍微改一改,改成加权平均数,因为质量不是均匀分布的,每个质点代表其所在三角形,其质量就是该三角形的面积(有向面积!),——这就是权!2/3/202335公式:C=sigma(Ai*Ci)/A(i=1…N)Ci=Centroid(△OPiPi+1)=

(O+↑Pi+↑Pi+1)/3C=sigma((↑Pi+↑Pi+1)(↑Pi×↑Pi+1))/(6A)2/3/202336分别求出每个三角形的面积Ai,总面积为各个面积相加根据物理学知识得:n个点(xi,yi)每个重量是mi,则重心是

X=(x1*M1+x2*M2+...+xn*Mn)/(M1+M2+....+Mn)Y=(y1*M1+y2*M2+...+yn*Mn)/(M1+M2+....+Mn)由于密度均匀,所以这里重量mi都用面积Ai代替。2/3/202337全部搞定!2/3/202338第三单元凸包(ConvexHull)2/3/2023392/3/2023402/3/2023412/3/2023422/3/2023432/3/2023442/3/2023452/3/2023462/3/2023472/3/2023482/3/2023492/3/2023502/3/2023512/3/2023522/3/2023532/3/2023542/3/2023552/3/2023562/3/2023572/3/2023582/3/2023592/3/2023602/3/2023612/3/2023622/3/2023632/3/2023642/3/2023652/3/202366凸包模板://xiaoxia版#include<stdio.h>#include<math.h>#include<stdlib.h>typedef

struct{ doublex; doubley;}POINT;POINTresult[102]; //保存凸包上的点POINTa[102]; int

n,top;doubleDistance(POINTp1,POINTp2) //两点间的距离{ returnsqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}doubleMultiply(POINTp1,POINTp2,POINTp3)//叉积{ return((p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x));}int

Compare(constvoid*p1,constvoid*p2){ POINT*p3,*p4; doublem;p3=(POINT*)p1;p4=(POINT*)p2; m=Multiply(a[0],*p3,*p4);

if(m<0)return1; elseif(m==0&&(Distance(a[0],*p3)<Distance(a[0],*p4))) return1; elsereturn-1;}voidTubao(){

inti;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>2) top--;result[top+1].x=a[i].x;result[top+1].y=a[i].y;top++;}}intmain(){

int

i,p;doublepx,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;}elseif(n==2){printf("%.2lf\n",Distance(a[0],a[1]));continue;}

py=-1;

for(i=0;i<n;i++) {

if(py==-1||a[i].y<py){

px=a[i].x;

py=a[i].y; p=i;}elseif(a[i].y==py&&a[i].x<px){

px=a[i].x;

py=a[i].y; p=i;} } //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<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论