2015-05-04 2 views
2

Я искал способ построения точек за пределами области многоугольника (шестиугольник в моем случае). Вот сценарий, который я хочу достичь, у меня есть маленький шестиугольник, расположенный внутри большого шестиугольника. Картина выглядит следующим образом:Как строить точки за пределами определенной области полигона в MATLAB

Points outside the small hexagon

В картине, я создал небольшой шестигранник (которого площадь, указанную в бледно-красный) и генерировать случайные точки (три в моем случае) внутри него с помощью 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'); 
+4

, если вы использовали 'inpolygon' определить точку _inside_ небольшой полигон, вы можете просто использовать тот же метод получает некоторую точку внутри большой, но за пределами маленькой. Просто определите 2 условия по этим строкам: 'pointvalid = inpolygon (big_polygon) & ~ inpolygon (small_polygon)'. – Hoki

+1

@Hoki, хорошо пункт. мог бы опубликовать его как ответ –

+1

@SanthanSalai, да, возможно, если бы у меня было больше, чем «псевдокод», но, поскольку OP не отправлял никакого кода, я не хотел генерировать полный образец пример, чтобы показать свою точку зрения. Если OP показывает его код, он может очень быстро настроить его, чтобы делать то, что он хочет, но я не буду делать это с нуля. – Hoki

ответ

2

UPDATE

Благодаря предложению Hoki «s, я, наконец, смог работать его.

Обратите внимание, что я изменю эту часть внутри кода:

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

Если ваш внутренний шестигранник определяется вершинами, то вы могли бы использовать inpolygon (link), чтобы проверить, является ли данная точка находится внутри него или нет.

1

Pls проверить, добавив следующие две строки после 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); 
Смежные вопросы