exponenta event banner

polyxpoly

Точки пересечения линий или кромок многоугольников

Описание

пример

[xi,yi] = polyxpoly(x1,y1,x2,y2) возвращает точки пересечения двух полилиний в плоской декартовой системе с вершинами, определенными x1, y1, x2 и y2. Выходные аргументы, xi и yi, содержат координаты x и y каждой точки, в которой сегмент первой полилинии пересекает сегмент второй. В случае перекрытия коллинеарных сегментов пересечение фактически является отрезком линии, а не точкой, и обе конечные точки включены в xi, yi.

[xi,yi,ii] = polyxpoly(___) возвращает массив из двух столбцов индексов линейных сегментов, соответствующих точкам пересечения. K-й ряд ii указывает, какие сегменты полилинии порождают точку пересечения xi(k), yi(k).

Чтобы вспомнить, как работают эти индексы, просто думайте о сегментах и вершинах как о секциях и постах забора. I-й участок ограждения соединяет i-й пост с (i + 1) -м пост. в общем, позволяя i и j обозначать скалярные значения, содержащиеся в k-й строке iiпересечение, обозначенное этой строкой, происходит там, где i-й сегмент первой полилинии пересекает j-й сегмент второй полилинии. Но когда пересечение падает именно на вершину первой полилинии, то i является индексом этой вершины. Аналогично со второй полилинией и индексом j. В случае пересечения в i-й вершине первой прямой, например, xi(k) равняется x1(i) и yi(k) равняется y1(i). В случае пересечений между вершинами i и j можно интерпретировать следующим образом: сегмент, соединяющий x1(i), y1(i) кому x1(i+1), y1(i+1) пересекает сегмент, соединяющий x2(j), y2(j) кому x2(j+1), y2(j+1) в точке xi(k), yi(k).

пример

[xi,yi] = polyxpoly(___,'unique') отфильтровывает повторяющиеся пересечения, в результате чего входные полилинии могут быть самопересекающимися.

Примеры

свернуть все

Определите и заполните прямоугольную область в плоскости.

xlimit = [3 13];
ylimit = [2  8];
xbox = xlimit([1 1 2 2 1]);
ybox = ylimit([1 2 2 1 1]);
mapshow(xbox,ybox,'DisplayType','polygon','LineStyle','none')

Определение и отображение двухкомпонентной полилинии.

x = [0 6  4  8 8 10 14 10 14 NaN 4 4 6 9 15];
y = [4 6 10 11 7  6 10 10  6 NaN 0 3 4 3  6];
mapshow(x,y,'Marker','+')

Пересечение полилинии с прямоугольником.

[xi,yi] = polyxpoly(x,y,xbox,ybox);
mapshow(xi,yi,'DisplayType','point','Marker','o')

Figure contains an axes. The axes contains 3 objects of type patch, line.

Отображение точек пересечения; обратите внимание, что точка (12, 8) появляется дважды из-за самопересечения вблизи конца первой части полилинии.

[xi yi]
ans = 8×2

    3.0000    5.0000
    5.0000    8.0000
    8.0000    8.0000
   12.0000    8.0000
   12.0000    8.0000
   13.0000    7.0000
   13.0000    5.0000
    4.0000    2.0000

Эту повторяющуюся точку можно подавить с помощью 'unique' вариант.

[xi,yi] = polyxpoly(x,y,xbox,ybox,'unique');
[xi yi]
ans = 7×2

    3.0000    5.0000
    5.0000    8.0000
    8.0000    8.0000
   12.0000    8.0000
   13.0000    7.0000
   13.0000    5.0000
    4.0000    2.0000

Отображение карты штата Калифорния.

california = shaperead('usastatehi',...
   'UseGeoCoords',true,...
   'Selector',{@(name) strcmpi(name,'California'),'Name'});
usamap('california')
geoshow(california,'FaceColor','none')

Определите небольшой круг с центром у побережья Калифорнии.

lat0 = 37;
lon0 = -122;
rad = 500;
[latc,lonc] = scircle1(lat0,lon0,km2deg(rad));
plotm(lat0,lon0,'r*')
plotm(latc,lonc,'r')

Найдите точки пересечения между штатом Калифорния и небольшим кругом.

[loni, lati] = polyxpoly(lonc, latc, ...
   california.Lon',california.Lat');
plotm(lati, loni, 'bo')

Входные аргументы

свернуть все

x - или y-координаты точек в первой или второй полилинии, заданные как числовой вектор. Для данной полилинии векторы координат x и y должны иметь одинаковую длину.

Выходные аргументы

свернуть все

x - или y-координаты точек пересечения, заданные в виде числового вектора столбца.

Индексы отрезков точек пересечения, заданные как числовой вектор.

См. также

| | | | |

Представлен до R2006a