1

我想在 matlab 中为给定的简单多边形(无凸面,无孔)创建一个缓冲区,而不使用 bufferm 函数。

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');

但它绘制错误。任何想法请..

4

2 回答 2

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;

取决于您希望它的外观。

于 2013-03-13T13:35:27.473 回答
0

看来您的代码有几个问题。

首先是角度计算。Atand 函数返回的结果在 -90 到 90 的范围内。因此,您将遇到第二象限和第三象限的点问题。最好使用如下结构:

ang = angle(rx + ry*1i)

错误使用 sf 的第二个问题。你的建筑

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

使用 sf 作为比例因子,但不作为距离。真的,你需要在 rx 和 cosd 之间加上,例如

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

或者干脆

new_vx = vx + sf * cos(ang)

new_vy 也需要同样的修改。

此外,实际缓冲区在多边形的每个顶点附近应该是平滑的。但是,您在代码中没有此选项。

如果要实现平滑,则需要为每个多边形顶点创建两个新顶点并将它们与弧连接。对于入射到多边形顶点的边缘,这些顶点应放置在距原始顶点的距离 sf 上,沿法线向量方向。

于 2013-03-13T13:45:04.793 回答