【发布时间】:2019-07-23 13:46:44
【问题描述】:
我有一个简单的、非自相交的多边形链,并想创建第二条具有固定距离平行线的多边形链。
我认为这个主题被称为多边形偏移或缓冲(例如An algorithm for inflating/deflating (offsetting, buffering) polygons)
MATLAB 有 bufferm 和 polybuffer,但它们都没有在 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 处进行轮廓化以使外围恢复,大概可以达到类似的结果。当然,以上两者都涉及离散的位置。