首页 > 解决方案 > GNU Octave 中的多边形偏移

问题描述

我有一个简单的、非自相交的多边形链,并且想要创建第二个具有固定距离平行线的多边形链。

我认为这个主题被称为多边形偏移或缓冲(这可以找到例如An algorithm for inflating/deflating (offset, buffering) polygons

MATLAB 有buffermpolybuffer但没有一个是在 GNU Octave 中实现的。

我已经开始了自己的实现:

close all
rotm = @(a) [cos(a) -sin(a); sin(a) cos(a)];
h = 3; # distance from existing polygon
p = [1 5 18.7 21 34 34;
     36.1 36.1 42.1 22.5 16.0 13];
dp = diff(p, [], 2);
a = atan2 (dp (2, :), dp(1, :)); 
da = diff (a);
horiz = abs (da) < 16 * eps;
f = 2 * h./sin(da).*sin(da/2);
f(horiz) = h;
f = [h f h];
r = a(1:end-1) + diff(a)/2;
r = pi/2 + [a(1) r a(end)];
p2 = zeros(size(p));

for k=1:columns(p)
  p2(:,k) = p(:,k) + rotm(r(k)) * [f(k); 0];
  line ([p(1, k);p2(1,k)], [p(2, k);p2(2,k)], "color", "magenta");
endfor

line (p(1, :), p(2, :), "color", "green");
line (p2(1, :), p2(2, :), "color", "red");
axis equal
grid on

生成的图

但那时我真的认为可能有更简单的方法来做到这一点。

有没有更简单的方法或一些已经实现的功能可能会有所帮助?(顺便说一句,我还没有矢量化代码)

标签: octavepolygon

解决方案


这并不像最初看起来那么简单。例如,偏移复杂多边形涉及偏移之间的碰撞:


CGAL
图片来自CGAL 手册,第 16 章:2D 直骨架和多边形偏移



推荐阅读