octave - GNU Octave 中的多边形偏移
问题描述
我有一个简单的、非自相交的多边形链,并且想要创建第二个具有固定距离平行线的多边形链。
我认为这个主题被称为多边形偏移或缓冲(这可以找到例如An algorithm for inflating/deflating (offset, 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
但那时我真的认为可能有更简单的方法来做到这一点。
有没有更简单的方法或一些已经实现的功能可能会有所帮助?(顺便说一句,我还没有矢量化代码)
解决方案
推荐阅读
- c++ - 类的全局实例与命名空间
- html - 加载后如何一起自动播放两个 HTML5 视频?
- http - 如何在 Dart 中编码 URL?
- javascript - 在 Azure Functions Typescript 中使用 IBinder?
- android - Kotlin - requestLocationUpdates() 方法的方法参数中的问题
- python - Pyinstaller 在运行时创建数据文件
- python - Python 文档最终对 return 有误导性的解释
- oracle - Couchbase 中的 Oracle/SQL 用户定义函数等效项
- angular - Angular 8,Firebase angular fire2 如何找到可观察的状态变化
- javascript - 如何使用 ajax 返回 .NET Core 中的 ViewComponents 列表进行分页?