首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >matlab中多边形的缓冲区

matlab中多边形的缓冲区
EN

Stack Overflow用户
提问于 2013-03-13 20:01:02
回答 2查看 1.1K关注 0票数 1

我想在matlab中为给定的简单多边形(没有凸,没有洞)创建一个缓冲区,而不使用bufferm函数。

代码语言:javascript
运行
复制
vx = [ 2 4 6 4 2]; %  polygon vertices
vy = [ 2 4 3 2 2];
figure;
% axis equal;
plot([vx vx(1)],[vy vy(1)],'r');
hold on;
vx = vx(end:-1:1); % Vertices in cw direction
vy = vy(end:-1:1);
xctr = mean(vx(1:end-1)); % find centroid of polygon
yctr = mean(vy(1:end-1));
sf = 2; % scale factor to extend polygon
rx = vx - xctr; % find radius
ry = vy - yctr;
angle = atand(ry/rx); % find angle
new_vx = xctr + rx * cosd(angle) * sf; % find new vertex at a distance of sf
new_vy = yctr + ry * sind(angle) * sf;
plot([new_vx new_vx(1)],[new_vy new_vy(1)], 'g');

但它的计划是错误的。有任何想法,请..

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-13 21:35:27

将角度更改为

代码语言:javascript
运行
复制
angle = atan2(ry,rx);

new_vx to

代码语言:javascript
运行
复制
new_vx = xctr + abs(rx) .* cos(angle) * sf;

并将new_vy设置为

代码语言:javascript
运行
复制
new_vy = yctr + abs(ry) .* sin(angle) * sf;

代码语言:javascript
运行
复制
new_vy = yctr + ry * sf;

这取决于你希望它看起来是什么样子。

票数 0
EN

Stack Overflow用户

发布于 2013-03-13 21:45:05

看起来你在代码中有几个问题。

第一个是角度计算。Atand函数返回的结果范围从-90到90。因此,对于第二个和第三个象限中的点,您将遇到问题。最好使用下面这样的结构:

代码语言:javascript
运行
复制
ang = angle(rx + ry*1i)

不正确使用sf的第二个问题。你的结构

代码语言:javascript
运行
复制
new_vx = xctr + rx * cosd(angle) * sf;

使用sf作为缩放因子,但不使用距离。真的,你需要在rx和cosd之间加,例如

代码语言:javascript
运行
复制
new_vx = xctr + rx + cos(ang) * sf

或者简单地说

代码语言:javascript
运行
复制
new_vx = vx + sf * cos(ang)

new_vy也需要做同样的修改。

另外,真实的缓冲区在多边形的每个顶点附近应该是平滑的。但是,您在代码中没有此选项。

如果你想实现平滑,你需要为每个多边形顶点创建两个新的顶点,并用圆弧连接它们。这些顶点应该放置在与多边形顶点关联的边的法向量方向上与原始顶点的距离sf上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15384741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档