多边形边界扩大算法 基于MATLAB

  首先,通过定义多边形的顶点坐标(在paths、paths1和paths2变量中)和外延大小(extra和extra2变量),确定多边形的形状和外延量。

对于每个多边形:
使用迭代的方式遍历多边形的每个顶点。对于每个顶点,计算与相邻边的单位向量,并根据指定的外延大小计算扩展向量的长度。使用单位向量和扩展长度计算扩展向量。将扩展向量与原始顶点相加,得到扩展后的顶点坐标。将扩展后的顶点坐标存储在相应的多边形变量中(polygon、polygon1和polygon2)。

绘制多边形:
使用plot函数绘制原始多边形的边界。
使用fill函数绘制原始多边形的填充区域,并设置透明度。
使用plot函数绘制扩展后多边形的边界。
使用fill函数绘制扩展后多边形的填充区域,并设置透明度。
重复以上步骤,绘制每个多边形的原始形状和扩展后的形状

在这里插入图片描述

主代码:

clc
clear

paths = [1, 1; 1,2; 1.5,3;2,1]; % 多边形顶点坐标
extra = 0.2; % 外延大小

len = size(paths, 1);
polygon = zeros(len, 2);

% 绘制原始图形
figure;
hold on;
pathss = [paths; paths(1,:)];
plot(pathss(:, 1), pathss(:, 2), ‘r-’, ‘LineWidth’, 2);

for i = 1:len
point = paths(i, : );
point1 = paths(mod(i - 2, len) + 1, : );
point2 = paths(mod(i, len) + 1, : );
vector1 = point1 - point;
vector2 = point2 - point;
length1 = norm(vector1);
length2 = norm(vector2);
unit_vector1 = vector1 / length1;
unit_vector2 = vector2 / length2;
vector_len = -extra / sqrt((1 - dot(unit_vector1, unit_vector2)) / 2);
vector = unit_vector1 + unit_vector2;
n = vector_len / norm(vector);
unit_vector = vector * n;
polygonX = unit_vector(1) + point(1);
polygonY = unit_vector(2) + point(2);
polygon(i, : ) = [polygonX, polygonY];
end

% 添加首尾相连的顶点
polygon = [polygon; polygon(1,:)];

%%
paths1 = [3,4; 2.5,5;3,5.5;3.5,5;4,4]; % 多边形顶点坐标
extra = 0.2; % 外延大小

len1 = size(paths1, 1);
polygon1 = zeros(len1, 2);

% 绘制原始图形

hold on;
pathss1 = [paths1; paths1(1,:)];
plot(pathss1(:, 1), pathss1(:, 2), ‘r-’, ‘LineWidth’, 2);

for i = 1:len1
point1 = paths1(i, : );
point11 = paths1(mod(i - 2, len1) + 1, : );
point21 = paths1(mod(i, len1) + 1, : );
vector11 = point11 - point1;
vector21 = point21 - point1;
length11 = norm(vector11);
length21 = norm(vector21);
unit_vector11 = vector11 / length11;
unit_vector21 = vector21 / length21;
vector_len1 = -extra / sqrt((1 - dot(unit_vector11, unit_vector21)) / 2);
vector1 = unit_vector11 + unit_vector21;
n1 = vector_len1 / norm(vector1);
unit_vector1 = vector1 * n1;
polygonX1 = unit_vector1(1) + point1(1);
polygonY1 = unit_vector1(2) + point1(2);
polygon1(i, : ) = [polygonX1, polygonY1];
end

% 添加首尾相连的顶点
polygon1 = [polygon1; polygon1(1,:)];

%%
paths2 = [5,2;5.5,4;6,4;7,2.5;7,1;5.5,1]; % 多边形顶点坐标
extra2 = 0.5; % 外延大小

len2 = size(paths2, 1);
polygon2 = zeros(len2, 2);

% 绘制原始图形
hold on;
pathss2 = [paths2; paths2(1,:)];
plot(pathss2(:, 1), pathss2(:, 2), ‘r-’, ‘LineWidth’, 2);
for i = 1:len2
point2 = paths2(i, : );
point12 = paths2(mod(i - 2, len2) + 1, : );
point22 = paths2(mod(i, len2) + 1, : );
vector12 = point12 - point2;
vector22 = point22 - point2;
length12 = norm(vector12);
length22 = norm(vector22);
unit_vector12 = vector12 / length12;
unit_vector22 = vector22 / length22;
vector_len2 = -extra2 / sqrt((1 - dot(unit_vector12, unit_vector22)) / 2);
vector2 = unit_vector12 + unit_vector22;
n2 = vector_len2 / norm(vector2);
unit_vector2 = vector2 * n2;
polygonX2 = unit_vector2(1) + point2(1);
polygonY2 = unit_vector2(2) + point2(2);
polygon2(i, : ) = [polygonX2, polygonY2];
end
% 添加首尾相连的顶点
polygon2 = [polygon2; polygon2(1,:)];

% 绘制外延后的多边形
fill(polygon(:, 1), polygon(:, 2), ‘b’, ‘FaceAlpha’, 0.3);
plot(polygon(:, 1), polygon(:, 2), ‘b-’, ‘LineWidth’, 2);
fill(pathss(:, 1), pathss(:, 2), ‘r’, ‘FaceAlpha’, 0.3);

fill(polygon1(:, 1), polygon1(:, 2), ‘b’, ‘FaceAlpha’, 0.3);
plot(polygon1(:, 1), polygon1(:, 2), ‘b-’, ‘LineWidth’, 2);
fill(pathss1(:, 1), pathss1(:, 2), ‘r’, ‘FaceAlpha’, 0.3);

fill(polygon2(:, 1), polygon2(:, 2), ‘b’, ‘FaceAlpha’, 0.3);
plot(polygon2(:, 1), polygon2(:, 2), ‘b-’, ‘LineWidth’, 2);
fill(pathss2(:, 1), pathss2(:, 2), ‘r’, ‘FaceAlpha’, 0.3);
axis equal;
hold off;

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自动化Cc努力学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值