1. 程式人生 > >matlab練習程式(簡單多邊形的核)

matlab練習程式(簡單多邊形的核)

還是計算幾何, 多邊形的核可以這樣理解:這個核為原多邊形內部的一個多邊形,站在這個叫核的多邊形中,我們能看到原多邊形的任何一個位置。

演算法步驟如下:

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學習最常見的問題,每天進步一點點,業精於勤荒於嬉

 開啟微信掃一掃哦!