如何在 MATLAB 中绘制某些多边形区域外的点
How to plot points outside certain polygon area in MATLAB
我一直在寻找一种方法来绘制多边形区域(在我的例子中是六边形)之外的点。这是我想要实现的场景,我有一个位于大六边形内的小六边形。图片如下:
在图片中,我创建了一个小六边形(区域以淡红色表示)并使用 inpolygon
在其中生成了一个随机点(在我的例子中是三个点)。当我想在大六边形(以淡紫色表示)中绘制点(红色三角形)而不触及小六边形区域 时,问题就出现了。我已经在网上四处寻找这个简单的解决方案 3 天,但无济于事。
如果能得到任何帮助或指导,我将不胜感激。非常感谢!
我的代码如下:
clear
clc
bighexagon = 20;
smallhexagon = 4;
axis_min = 0;
axis_max = 40;
axis([axis_min axis_max axis_min axis_max],'square');
hold on
L = linspace(30,390,7);
bhex_x = bighexagon * (1+cosd(L))';
bhex_y = bighexagon*(1+sind(L))';
L2 = linspace(30,390,7);
shex_x = smallhexagon * (1+cosd(L2))';
shex_y = smallhexagon * (1+sind(L2))';
plot(bhex_x,bhex_y,'LineWidth',3);
%---Move small hexagon into big hexagon
shex_vertices_x2(:,1) = shex_x + 16;
shex_vertices_y2(:,1) = shex_y + 16;
plot(shex_vertices_x2(:,1),shex_vertices_y2(:,1),'--k','LineWidth',3);
%---Plot points in small hexagon
no = 3;
point_x2 = (smallhexagon+20) - rand(1,9*no)*2*smallhexagon;
point_y2 = (smallhexagon+20) - rand(1,9*no)*2*smallhexagon;
inside = inpolygon(point_x2,point_y2,shex_vertices_x2,shex_vertices_y2);
point_x2 = point_x2(inside);
point_y2 = point_y2(inside);
idx2 = randperm(length(point_x2));
point_x2 = point_x2(idx2(1:no));
point_y2 = point_y2(idx2(1:no));
plot(point_x2,point_y2,'ro','MarkerSize',1.5,'LineWidth',1, ...
'MarkerFaceColor','r');
%---Plot points in big hexagon
no2 = 4;
point_x = (bighexagon+20) - rand(1,9*no2)*2*bighexagon;
point_y = (bighexagon+20) - rand(1,9*no2)*2*bighexagon;
inside2 = inpolygon(point_x,point_y,bhex_x,bhex_y);
point_x = point_x(inside2);
point_y = point_y(inside2);
idx = randperm(length(point_x));
point_x = point_x(idx(1:no2));
point_y = point_y(idx(1:no2));
plot(point_x,point_y,'g^','MarkerSize',3,'LineWidth',3, ...
'MarkerFaceColor','g');
如果您的内六边形是由顶点定义的,那么您可以使用 inpolygon
(link) 来测试给定点是否在其中。
更新
感谢Hoki
的建议,终于搞定了。
注意我在代码里面改了这部分:
validpoint = inpolygon(point_x,point_y,bhex_x,bhex_y) & ~inpolygon(point_x,point_y,shex_vertices_x2,shex_vertices_y2);
希望这能消除混淆并帮助其他用户。我要感谢 Hoki
和 xenoclast
的帮助。
代码如下:
clear
clc
bighexagon = 20;
smallhexagon = 4;
axis_min = 0;
axis_max = 40;
axis([axis_min axis_max axis_min axis_max],'square');
hold on
L = linspace(30,390,7);
bhex_x = bighexagon * (1+cosd(L))';
bhex_y = bighexagon*(1+sind(L))';
L2 = linspace(30,390,7);
shex_x = smallhexagon * (1+cosd(L2))';
shex_y = smallhexagon * (1+sind(L2))';
plot(bhex_x,bhex_y,'LineWidth',3);
%---Move small hexagon into big hexagon
shex_vertices_x2(:,1) = shex_x + 16;
shex_vertices_y2(:,1) = shex_y + 16;
plot(shex_vertices_x2(:,1),shex_vertices_y2(:,1),'--k','LineWidth',3);
%---Plot points in small hexagon
no = 3;
point_x2 = (smallhexagon+20) - rand(1,9*no)*2*smallhexagon;
point_y2 = (smallhexagon+20) - rand(1,9*no)*2*smallhexagon;
inside = inpolygon(point_x2,point_y2,shex_vertices_x2,shex_vertices_y2);
point_x2 = point_x2(inside);
point_y2 = point_y2(inside);
idx2 = randperm(length(point_x2));
point_x2 = point_x2(idx2(1:no));
point_y2 = point_y2(idx2(1:no));
plot(point_x2,point_y2,'ro','MarkerSize',1.5,'LineWidth',1, ...
'MarkerFaceColor','r');
%---Plot points in big hexagon
no2 = 30;
point_x = (bighexagon+20) - rand(1,9*no2)*2*bighexagon;
point_y = (bighexagon+20) - rand(1,9*no2)*2*bighexagon;
%---As per Hoki's suggestion, it ensure the points are outside the small hexagon
validpoint = inpolygon(point_x,point_y,bhex_x,bhex_y) & ...
~inpolygon(point_x,point_y,shex_vertices_x2,shex_vertices_y2);
point_x = point_x(validpoint);
point_y = point_y(validpoint);
idx = randperm(length(point_x));
point_x = point_x(idx(1:no2));
point_y = point_y(idx(1:no2));
plot(point_x,point_y,'g^','MarkerSize',3,'LineWidth',3, ...
'MarkerFaceColor','g');
请在inside2 = inpolygon(point_x,point_y,bhex_x,bhex_y);
后添加以下两行进行检查
in1 = inpolygon(point_x,point_y,shex_vertices_x2,shex_vertices_y2);
inside2= logical(inside2-in1);
我一直在寻找一种方法来绘制多边形区域(在我的例子中是六边形)之外的点。这是我想要实现的场景,我有一个位于大六边形内的小六边形。图片如下:
在图片中,我创建了一个小六边形(区域以淡红色表示)并使用 inpolygon
在其中生成了一个随机点(在我的例子中是三个点)。当我想在大六边形(以淡紫色表示)中绘制点(红色三角形)而不触及小六边形区域 时,问题就出现了。我已经在网上四处寻找这个简单的解决方案 3 天,但无济于事。
如果能得到任何帮助或指导,我将不胜感激。非常感谢!
我的代码如下:
clear
clc
bighexagon = 20;
smallhexagon = 4;
axis_min = 0;
axis_max = 40;
axis([axis_min axis_max axis_min axis_max],'square');
hold on
L = linspace(30,390,7);
bhex_x = bighexagon * (1+cosd(L))';
bhex_y = bighexagon*(1+sind(L))';
L2 = linspace(30,390,7);
shex_x = smallhexagon * (1+cosd(L2))';
shex_y = smallhexagon * (1+sind(L2))';
plot(bhex_x,bhex_y,'LineWidth',3);
%---Move small hexagon into big hexagon
shex_vertices_x2(:,1) = shex_x + 16;
shex_vertices_y2(:,1) = shex_y + 16;
plot(shex_vertices_x2(:,1),shex_vertices_y2(:,1),'--k','LineWidth',3);
%---Plot points in small hexagon
no = 3;
point_x2 = (smallhexagon+20) - rand(1,9*no)*2*smallhexagon;
point_y2 = (smallhexagon+20) - rand(1,9*no)*2*smallhexagon;
inside = inpolygon(point_x2,point_y2,shex_vertices_x2,shex_vertices_y2);
point_x2 = point_x2(inside);
point_y2 = point_y2(inside);
idx2 = randperm(length(point_x2));
point_x2 = point_x2(idx2(1:no));
point_y2 = point_y2(idx2(1:no));
plot(point_x2,point_y2,'ro','MarkerSize',1.5,'LineWidth',1, ...
'MarkerFaceColor','r');
%---Plot points in big hexagon
no2 = 4;
point_x = (bighexagon+20) - rand(1,9*no2)*2*bighexagon;
point_y = (bighexagon+20) - rand(1,9*no2)*2*bighexagon;
inside2 = inpolygon(point_x,point_y,bhex_x,bhex_y);
point_x = point_x(inside2);
point_y = point_y(inside2);
idx = randperm(length(point_x));
point_x = point_x(idx(1:no2));
point_y = point_y(idx(1:no2));
plot(point_x,point_y,'g^','MarkerSize',3,'LineWidth',3, ...
'MarkerFaceColor','g');
如果您的内六边形是由顶点定义的,那么您可以使用 inpolygon
(link) 来测试给定点是否在其中。
更新
感谢Hoki
的建议,终于搞定了。
注意我在代码里面改了这部分:
validpoint = inpolygon(point_x,point_y,bhex_x,bhex_y) & ~inpolygon(point_x,point_y,shex_vertices_x2,shex_vertices_y2);
希望这能消除混淆并帮助其他用户。我要感谢 Hoki
和 xenoclast
的帮助。
代码如下:
clear
clc
bighexagon = 20;
smallhexagon = 4;
axis_min = 0;
axis_max = 40;
axis([axis_min axis_max axis_min axis_max],'square');
hold on
L = linspace(30,390,7);
bhex_x = bighexagon * (1+cosd(L))';
bhex_y = bighexagon*(1+sind(L))';
L2 = linspace(30,390,7);
shex_x = smallhexagon * (1+cosd(L2))';
shex_y = smallhexagon * (1+sind(L2))';
plot(bhex_x,bhex_y,'LineWidth',3);
%---Move small hexagon into big hexagon
shex_vertices_x2(:,1) = shex_x + 16;
shex_vertices_y2(:,1) = shex_y + 16;
plot(shex_vertices_x2(:,1),shex_vertices_y2(:,1),'--k','LineWidth',3);
%---Plot points in small hexagon
no = 3;
point_x2 = (smallhexagon+20) - rand(1,9*no)*2*smallhexagon;
point_y2 = (smallhexagon+20) - rand(1,9*no)*2*smallhexagon;
inside = inpolygon(point_x2,point_y2,shex_vertices_x2,shex_vertices_y2);
point_x2 = point_x2(inside);
point_y2 = point_y2(inside);
idx2 = randperm(length(point_x2));
point_x2 = point_x2(idx2(1:no));
point_y2 = point_y2(idx2(1:no));
plot(point_x2,point_y2,'ro','MarkerSize',1.5,'LineWidth',1, ...
'MarkerFaceColor','r');
%---Plot points in big hexagon
no2 = 30;
point_x = (bighexagon+20) - rand(1,9*no2)*2*bighexagon;
point_y = (bighexagon+20) - rand(1,9*no2)*2*bighexagon;
%---As per Hoki's suggestion, it ensure the points are outside the small hexagon
validpoint = inpolygon(point_x,point_y,bhex_x,bhex_y) & ...
~inpolygon(point_x,point_y,shex_vertices_x2,shex_vertices_y2);
point_x = point_x(validpoint);
point_y = point_y(validpoint);
idx = randperm(length(point_x));
point_x = point_x(idx(1:no2));
point_y = point_y(idx(1:no2));
plot(point_x,point_y,'g^','MarkerSize',3,'LineWidth',3, ...
'MarkerFaceColor','g');
请在inside2 = inpolygon(point_x,point_y,bhex_x,bhex_y);
in1 = inpolygon(point_x,point_y,shex_vertices_x2,shex_vertices_y2);
inside2= logical(inside2-in1);