polyxpoly

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

Описание

пример

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

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

Чтобы помнить, как эти индексы работают, только думайте о сегментах и вершинах как разделы забора и сообщения. i-th раздел забора соединяется, i-th отправляют на (i +1)-th сообщение. В общем случае разрешение i и j обозначает скалярные значения, состоявшие k-th строка ii, пересечение, обозначенное той строкой, происходит, где i-th сегмент первой ломаной линии пересекает j-th сегмент второй ломаной линии. Но когда пересечение падает точно на вершину первой ломаной линии, затем i является индексом той вершины. Аналогично со второй ломаной линией и индексом j. В случае пересечения в i-th вершина первой линии, например, 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')

Задайте и отобразите ломаную линию 2D части.

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

Отобразите точки пересечения; обратите внимание, что точка (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