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

Figure contains an axes object. The axes object 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

Многоугольники состояния чтения в геопространственную таблицу. Создайте подтаблицу, которая содержит Калифорнийский многоугольник. Отобразите многоугольник на карте.

states = readgeotable("usastatehi.shp");
row = states.Name == "California";
california = states(row,:);

figure
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")

Извлеките координаты широты и долготы Калифорнийского многоугольника из геопространственной таблицы.

T = geotable2table(california,["Latitude","Longitude"]);
[lat,lon] = polyjoin(T.Latitude',T.Longitude');

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

[loni,lati] = polyxpoly(lon,lat,lonc,latc);
plotm(lati,loni,"bo")

Входные параметры

свернуть все

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

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

свернуть все

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

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

Советы

  • Если интервал между точками является большим, пересечения, вычисленные polyxpoly функционируйте и пересечения, показанные на отображении карты, могут отличаться. Это - результат различий между прямыми линиями в неспроектированных и спроектированных координатах. Точно так же могут быть различия между polyxpoly результат и пересечения, которые принимают большие круги или локсодромы между точками.

Смотрите также

| | | | |

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