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