如何在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
相关产品推荐
相关产品推荐

