Octave GNU倍频程中的多边形偏移

Octave GNU倍频程中的多边形偏移,octave,polygon,Octave,Polygon,我有一个简单的,不自相交的多边形链,并希望创建第二个多边形链与固定距离的平行线 我认为这个主题被称为多边形偏移或缓冲(例如查找) MATLAB有bufferm和polybuffer,但它们都没有在GNU倍频程中实现 我已经开始自己的实现: 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 3

我有一个简单的,不自相交的多边形链,并希望创建第二个多边形链与固定距离的平行线

我认为这个主题被称为多边形偏移或缓冲(例如查找)

MATLAB有
bufferm
polybuffer
,但它们都没有在GNU倍频程中实现

我已经开始自己的实现:

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
全部关闭
rotm=@(a)[cos(a)-sin(a);sin(a)cos(a)];
h=3;#与现有多边形的距离
p=[1 5 18.7 21 34;
36.1 36.1 42.1 22.5 16.0 13];
dp=diff(p,[],2);
a=atan2(dp(2,:),dp(1,:);
da=差值(a);
水平=abs(da)<16*eps;
f=2*h./sin(da)。*sin(da/2);
f(水平)=h;
f=[h f h];
r=a(1:end-1)+diff(a)/2;
r=pi/2+[a(1)ra(end)];
p2=零(尺寸(p));
对于k=1:列(p)
p2(:,k)=p(:,k)+rotm(r(k))*[f(k);0];
线条([p(1,k);p2(1,k)],[p(2,k);p2(2,k)],“颜色”,“品红色”);
外循环
线条(p(1,:),p(2,:),“颜色”,“绿色”);
线条(p2(1,:),p2(2,:),“颜色”,“红色”);
轴相等
网格化

但在这一点上,我真的认为可能有一个更简单的方法来做到这一点

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

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

来自的图像,第16章:二维直骨架和多边形偏移



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

来自的图像,第16章:二维直骨架和多边形偏移



您是否愿意用有符号距离变换来实现它?还是说这太过分了?如果是,则解决方案将成为距离变换上的简单+/-轮廓。或者,你也可以通过形态学扩张,然后在0.5的范围内进行轮廓化,从而恢复边缘,从而获得类似的结果。当然,上述两种方法都涉及离散位置。您愿意用有符号距离变换来实现它吗?还是说这太过分了?如果是,则解决方案将成为距离变换上的简单+/-轮廓。或者,你也可以通过形态学扩张,然后在0.5的范围内进行轮廓化,从而恢复边缘,从而获得类似的结果。当然,上述两种情况都涉及离散的位置。