ACM計算幾何基礎_第1頁
ACM計算幾何基礎_第2頁
ACM計算幾何基礎_第3頁
ACM計算幾何基礎_第4頁
ACM計算幾何基礎_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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、傳統(tǒng)的計算線段相交的方法是什么?2、傳統(tǒng)方法和本方法的區(qū)別是什么?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個三角形,由于凸性,保證這些三角形全在多邊形內(nèi),那么,這個凸多邊形的有向面積:

A=sigma(Ai)(i=1…N-2)P1P2P3P4P5P6A1A2A3A42/3/202323凹多邊形的面積?P1P4P3P22/3/202324依然成立?。。《噙呅蚊娣e公式:A=sigma(Ai)(i=1…N-2)結論:“有向面積”A比“面積”S其實更本質!2/3/202325任意點為扇心的三角形剖分:我們能把多邊形分成N-2個三角形,為什么不能分成N個三角形呢?比如,以多邊形內(nèi)部的一個點為扇心,就可以把多邊形剖分成N個三角形。P0P1P2P6P5P4P32/3/202326前面的三角剖分顯然對于多邊形內(nèi)部任意一點都是合適的!我們可以得到: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既然內(nèi)外都可以,為什么不設P0為坐標原點呢?OP1P2P3P4現(xiàn)在的公式?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原因:錯誤的推廣公式是“質點系重心公式”,即如果認為多邊形的質量僅分布在其頂點上,且均勻分布,則這個公式是對的。但是,現(xiàn)在多邊形的質量是均勻分布在其內(nèi)部區(qū)域上的,也就是說,是與面積有關的!2/3/202334Solution:剖分成N個三角形,分別求出其重心和面積,這時可以想象,原來質量均勻分布在內(nèi)部區(qū)域上,而現(xiàn)在質量僅僅分布在這N個重心點上(等假變換),這時候就可以利用剛才的質點系重心公式了。不過,要稍微改一改,改成加權平均數(shù),因為質量不是均勻分布的,每個質點代表其所在三角形,其質量就是該三角形的面積(有向面積?。?,——這就是權!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,總面積為各個面積相加根據(jù)物理學知識得: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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論