matlab練習程式(簡單多邊形的核)
阿新 • • 發佈:2019-01-01
還是計算幾何, 多邊形的核可以這樣理解:這個核為原多邊形內部的一個多邊形,站在這個叫核的多邊形中,我們能看到原多邊形的任何一個位置。
演算法步驟如下:
1.根據原多邊形最大和最小的x,y初始化核多邊形,就是個矩形。
2.計算多邊形當前處理的點的凹凸性。
3.用當前點與其後繼點構成直線,判斷當前點的前驅點在該直線的左邊或右邊。
4.用該直線將原核多邊形分為兩個部分,選擇其中一個部分作為處理下一個點將用到的核,選擇的依據有以下兩點:
1)如果當前點為凸點,那麼選擇的核與3步中前驅點的所在方向相同。
2)如果當前點為凹點,那麼選擇的核與3步中前驅點的所在方向相反。
在程式設計中正好是三個標記連乘為正。
5.使用新的核,計算下一個點,迴圈第2步直到遍歷所有點。
結果如下:
matlab程式碼如下:
clear all;close all;clc; n=20; p=rand(n,2); p=createSimplyPoly(p); n=n+1; p(n,:)=p(1,:); maxX=max(p(:,1)); minX=min(p(:,1)); maxY=max(p(:,2)); minY=min(p(:,2)); core=[minX minY; %初始化核 minX maxY; maxX maxY; maxX minY; minX minY]; for i=2:n [m ~]=size(core); p_pre=p(i-1,:); %多邊形當前點的前一個點 p_cur=p(i,:); %多邊形當前點 if i~=n %如果回到第一個點,那麼下一個點則為第二個點 p_nxt=p(i+1,:); else p_nxt=p(2,:); end k=(p_nxt(2)-p_cur(2))/(p_nxt(1)-p_cur(1)); %當前點與下一個點構成的多邊形的其中一邊 b=p_cur(2)-k*p_cur(1); flag=k*p_pre(1)-p_pre(2)+b; %標記當前點的前一個點在該邊的左邊或右邊 v1=p_pre-p_cur; %計算當期點的凹凸性 v2=p_nxt-p_cur; r=det([v1;v2]); %大於0為凸,反之為凹 re=[]; for j=1:m-1 core_cur_flag=core(j,1)*k-core(j,2)+b; %標記當前核中的點在邊的左邊或右邊 core_nxt_flag=core(j+1,1)*k-core(j+1,2)+b; %標記下一個核中的點在邊的左邊或右邊 if r*core_cur_flag*flag>0 %噹噹前多邊形點為凸點,且前一個點和核的點同方向或當前多邊形點為凹點,且前一個點和核的點是反方向時標記該點為新核的點
re=[core(j,:);re]; end if core_cur_flag*core_nxt_flag<=0 %標記多邊形邊與核的邊的交點為新核的點 if core(j,1)~=core(j+1,1) kbar=(core(j,2)-core(j+1,2))/(core(j,1)-core(j+1,1)); bbar=core(j,2)-kbar*core(j,1); xx=-(b-bbar)/(k-kbar); yy=-(-bbar*k+b*kbar)/(k-kbar); else xx=core(j,1); yy=k*xx+b; end re=[xx yy;re]; end end core=re; core(size(core,1)+1,:)=core(1,:); %多邊形第一個點和最後一個點相同 end hold on; plot(p(:,1),p(:,2)); plot(core(:,1),core(:,2),'r') axis equal;
createSimplyPoly函式在這裡,因為生成簡單多邊形策略的問題,這裡幾乎所有的多邊形都會有核存在的。
部分可能除0的地方沒有處理。
參考:
http://wenku.baidu.com/view/65c7d523192e45361066f5e7.html
關注公眾號: MATLAB基於模型的設計 (ID:xaxymaker) ,每天推送MATLAB學習最常見的問題,每天進步一點點,業精於勤荒於嬉。
開啟微信掃一掃哦!