Я искал способ построения точек за пределами области многоугольника (шестиугольник в моем случае). Вот сценарий, который я хочу достичь, у меня есть маленький шестиугольник, расположенный внутри большого шестиугольника. Картина выглядит следующим образом:Как строить точки за пределами определенной области полигона в 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' определить точку _inside_ небольшой полигон, вы можете просто использовать тот же метод получает некоторую точку внутри большой, но за пределами маленькой. Просто определите 2 условия по этим строкам: 'pointvalid = inpolygon (big_polygon) & ~ inpolygon (small_polygon)'. – Hoki
@Hoki, хорошо пункт. мог бы опубликовать его как ответ –
@SanthanSalai, да, возможно, если бы у меня было больше, чем «псевдокод», но, поскольку OP не отправлял никакого кода, я не хотел генерировать полный образец пример, чтобы показать свою точку зрения. Если OP показывает его код, он может очень быстро настроить его, чтобы делать то, что он хочет, но я не буду делать это с нуля. – Hoki