首先,通过定义多边形的顶点坐标(在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;