我想在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');
但它错误地说。任何想法都会.. ..
答案 0 :(得分:0)
将角度更改为
angle = atan2(ry,rx);
new_vx to
new_vx = xctr + abs(rx) .* cos(angle) * sf;
和new_vy到
new_vy = yctr + abs(ry) .* sin(angle) * sf;
或
new_vy = yctr + ry * sf;
取决于您希望它的外观。
答案 1 :(得分: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上。