【问题标题】:How to plot points outside certain polygon area in MATLAB如何在MATLAB中绘制某个多边形区域之外的点
【发布时间】:2015-05-04 13:20:49
【问题描述】:

我一直在寻找一种方法来绘制多边形区域之外的点(在我的例子中是六边形)。这是我想要实现的场景,我有一个小六边形位于一个大六边形内。图片如下:

在图片中,我创建了一个小六边形(其区域以淡红色表示)并使用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 定义点inside 小多边形,您可以使用相同的方法获取大多边形内部但小多边形外部的点。只需按照这些方式定义 2 个条件:pointvalid = inpolygon(big_polygon) & ~inpolygon(small_polygon).
  • @Hoki,说得好。可以将其发布为答案
  • @SanthanSalai,是的,如果我有更多的“伪代码”可以使用,我可能会这样做,但由于 OP 没有发布任何代码,我不想生成完整的示例示例只是为了说明我的观点。如果 OP 显示他的代码,它可能会很快调整它以做它想做的事情,但我不会从头开始。
  • @loss。如果你能做到这一点,那就太好了(让每个人都清楚问题/答案)。毕竟,这个网站的全部意义在于让其他人从我们的学习中受益。
  • @loss 我认为通过使用inpolygon 的两个测试,正如 Hoki 所建议的,您将能够解决问题。我的评论是,没有必要将建议的答案添加到问题的文本中,但它是针对 Hoki 而不是您 - 就您而言,我认为这是一个很好的(且有趣的)问题。顺便欢迎光临本站!

标签: matlab plot polygon


【解决方案1】:

更新

感谢Hoki的建议,我终于可以解决了。

请注意,我在代码中更改了这部分:

validpoint = inpolygon(point_x,point_y,bhex_x,bhex_y) & ~inpolygon(point_x,point_y,shex_vertices_x2,shex_vertices_y2);

希望这能消除困惑,也能帮助其他用户。我要感谢Hokixenoclast 的帮助。

代码如下:

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');

【讨论】:

    【解决方案2】:

    如果您的内六边形由顶点定义,那么您可以使用inpolygon (link) 来测试给定点是否在其中。

    【讨论】:

      【解决方案3】:

      请在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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-17
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 2014-03-24
        • 2023-03-20
        • 2011-02-18
        • 1970-01-01
        相关资源
        最近更新 更多