【问题标题】:polygon-offsetting in GNU OctaveGNU Octave 中的多边形偏移
【发布时间】:2019-07-23 13:46:44
【问题描述】:

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

我认为这个主题被称为多边形偏移或缓冲(例如An algorithm for inflating/deflating (offsetting, 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

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

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

【问题讨论】:

  • 您愿意根据有符号距离变换来实现它吗?还是那是矫枉过正?如果是,那么解决方案将成为距离变换上的简单 +/- 轮廓。或者,您可以使用形态扩张然后在 0.5 处进行轮廓化以使外围恢复,大概可以达到类似的结果。当然,以上两者都涉及离散的位置。

标签: octave polygon


【解决方案1】:

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



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

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 2012-10-26
    • 2019-05-30
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    相关资源
    最近更新 更多