You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MATLAB中于大多边形各边旁绘制对应数量的小多边形?

解决MATLAB小多边形重叠问题:将小多边形放置在大多边形各边旁

你的代码仅对大多边形进行了缩放,但所有小多边形的中心都和原大多边形一致,因此必然重叠。要实现目标,需要计算每条边的外侧中心位置,将缩放后的小多边形平移到对应位置。

完整实现代码

n = input("enter number of polygon sides: ");
scalefactor = input("enter scale factor: ");
parentSideLen = 5;
parentCenter = [5 5];

% 创建中心大多边形
parentpoly = nsidedpoly(n, 'Center', parentCenter, 'SideLength', parentSideLen);

% 获取大多边形顶点,闭合数组方便处理每条边
parentVerts = parentpoly.Vertices;
parentVerts = [parentVerts; parentVerts(1,:)];

% 初始化小多边形数组
childpoly = repmat(nsidedpoly(n), 1, n);

for i = 1:n
    % 缩放小多边形
    childpoly(i) = scale(parentpoly, scalefactor);
    
    % 获取当前边的两个顶点
    v1 = parentVerts(i,:);
    v2 = parentVerts(i+1,:);
    
    % 计算边的中点
    edgeMid = mean([v1; v2]);
    
    % 计算垂直于边的外侧单位向量
    edgeDir = v2 - v1;
    perpDir = [-edgeDir(2), edgeDir(1)]; % 逆时针旋转90度得到垂直方向
    perpDir = perpDir / norm(perpDir);
    
    % 计算平移距离:确保小多边形贴在大多边形外侧
    parentApothem = (parentSideLen/2) / tan(pi/n); % 大多边形边心距
    childApothem = (parentSideLen * scalefactor / 2) / tan(pi/n); % 小多边形边心距
    translateDist = parentApothem + childApothem;
    
    % 计算小多边形的目标中心
    childCenter = edgeMid + perpDir * translateDist;
    
    % 平移小多边形到目标位置
    childpoly(i) = translate(childpoly(i), childCenter - parentCenter);
end

% 绘图展示
figure;
hold on;
plot(parentpoly, 'FaceColor', 'lightblue', 'EdgeColor', 'black');
% 用不同颜色绘制小多边形
colors = hsv(n);
for i = 1:n
    plot(childpoly(i), 'FaceColor', colors(i,:), 'EdgeColor', 'black');
end
axis equal;
title('中心大多边形与各边旁小多边形');
hold off;

关键逻辑说明

  • 顶点闭合处理:将顶点数组末尾添加第一个顶点,确保循环时能处理最后一条边(从最后一个顶点回到第一个顶点)
  • 外侧方向计算:通过边的方向向量旋转90度得到垂直向外的方向,归一化后保证方向统一指向正多边形外侧
  • 平移距离计算:利用正多边形边心距公式,确保小多边形的内侧边刚好贴在大多边形的外侧边上,避免重叠或间距过大
  • 平移操作:使用translate函数将缩放后的小多边形从原中心(与大多边形重合)移到计算出的目标中心位置

内容的提问来源于stack exchange,提问作者Bhairav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:20:24