2013-03-13 67 views
1

我想在matlab中爲給定的簡單多邊形(無凸,無孔)創建一個緩衝區,而不使用bufferm函數。matlab中多邊形的緩衝區

vx = [ 2 4 6 4 2]; % polygon vertices 
vy = [ 2 4 3 2 2]; 
figure; 
% axis equal; 
plot([vx vx(1)],[vy vy(1)],'r'); 
hold on; 
vx = vx(end:-1:1); % Vertices in cw direction 
vy = vy(end:-1:1); 
xctr = mean(vx(1:end-1)); % find centroid of polygon 
yctr = mean(vy(1:end-1)); 
sf = 2; % scale factor to extend polygon 
rx = vx - xctr; % find radius 
ry = vy - yctr; 
angle = atand(ry/rx); % find angle 
new_vx = xctr + rx * cosd(angle) * sf; % find new vertex at a distance of sf 
new_vy = yctr + ry * sind(angle) * sf; 
plot([new_vx new_vx(1)],[new_vy new_vy(1)], 'g'); 

但它錯誤地繪製。任何想法請..

+0

你想接收緩衝區固定寬度?爲什麼沒有寬度值? – 2013-03-13 12:20:30

+0

我已經把它作爲sf = 2 – user1785307 2013-03-13 12:24:13

回答

0

變化角度

angle = atan2(ry,rx); 

new_vx到

new_vx = xctr + abs(rx) .* cos(angle) * sf; 

和new_vy要麼

new_vy = yctr + abs(ry) .* sin(angle) * sf; 

new_vy = yctr + ry * sf; 

取決於你希望看起來如何。

+0

非常感謝!它做到了魔術! – user1785307 2013-03-13 13:48:49

0

看來你在代碼中有幾個問題。

首先是角度計算。 Atand函數返回結果範圍從-90到90.因此,您將在第二和第三象限中出現點問題。這是更好地利用建築,如:

ang = angle(rx + ry*1i) 

第二個問題不正確的使用SF的。您的建設

new_vx = xctr + rx * cosd(angle) * sf; 

使用sf作爲比例因子,但不是距離。真的,你需要在rx和cosd之間加上,例如需要用於new_vy

new_vx = xctr + rx + cos(ang) * sf 

或簡單地

new_vx = vx + sf * cos(ang) 

相同的修改。

另外,真正的緩衝區應該在多邊形的每個頂點附近平滑。但是,您在代碼中沒有此選項。

如果要實現平滑,則需要爲每個多邊形頂點創建兩個新頂點並將它們與弧連接。這些頂點應放置在距離原始頂點距離sf的法向矢量方向上,以便入射到多邊形頂點的邊緣。