Intersection points for lines or polygon edges

collapse all in page

## Syntax

`[xi,yi] = polyxpoly(x1,y1,x2,y2)`

`[xi,yi,ii] = polyxpoly(___)`

`[xi,yi] = polyxpoly(___,'unique')`

## Description

example

`[xi,yi] = polyxpoly(x1,y1,x2,y2)`

returns the intersection points of two polylines in a planar, Cartesian system, with vertices defined by `x1`

, `y1`

, `x2`

and `y2`

. The output arguments, `xi`

and `yi`

, contain the *x*- and *y*-coordinates of each point at which a segment of the first polyline intersects a segment of the second. In the case of overlapping, collinear segments, the intersection is actually a line segment rather than a point, and both endpoints are included in `xi`

, `yi`

.

`[xi,yi,ii] = polyxpoly(___)`

returns a two-column array of line segment indices corresponding to the intersection points. The *k*-th row of `ii`

indicates which polyline segments give rise to the intersection point `xi(k)`

, `yi(k)`

.

To remember how these indices work, just think of segments and vertices as fence sections and posts. The *i*-th fence section connects the *i*-th post to the (*i*+1)-th post. In general, letting *i* and *j* denote the scalar values comprised by the *k*-th row of `ii`

, the intersection indicated by that row occurs where the *i*-th segment of the first polyline intersects the *j*-th segment of the second polyline. But when an intersection falls precisely on a vertex of the first polyline, then *i* is the index of that vertex. Likewise with the second polyline and the index *j*. In the case of an intersection at the *i*-th vertex of the first line, for example, `xi(k)`

equals `x1(i)`

and `yi(k)`

equals `y1(i)`

. In the case of intersections between vertices, *i* and *j* can be interpreted as follows: the segment connecting `x1(i)`

, `y1(i)`

to `x1(i+1)`

, `y1(i+1)`

intersects the segment connecting `x2(j)`

, `y2(j)`

to `x2(j+1)`

, `y2(j+1)`

at the point `xi(k)`

, `yi(k)`

.

example

`[xi,yi] = polyxpoly(___,'unique')`

filters out duplicate intersections, which may result if the input polylines are self-intersecting.

## Examples

collapse all

### Find Intersection Points Between Rectangle and Polyline

Open Live Script

Define and fill a rectangular area in the plane.

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

Define and display a two-part polyline.

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

Intersect the polyline with the rectangle.

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

Display the intersection points; note that the point (12, 8) appears twice because of a self-intersection near the end of the first part of the polyline.

[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

You can suppress this duplicate point by using the `'unique'`

option.

`[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

### Find Intersection Points Between State Border and Small Circle

Open Live Script

Read state polygons into a geospatial table. Create a subtable that contains the California polygon. Display the polygon on a map.

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

Define a small circle centered off the coast of California.

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

Extract the latitude and longitude coordinates of the California polygon from the geospatial table.

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

Find the intersection points between the state of California and the small circle.

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

## Input Arguments

collapse all

`x1`

, `y1`

, `x2`

, `y2`

— Coordinates of polylines

numeric vector

*x*- or *y*-coordinates of points in the first or second polyline, specified as a numeric vector. For a given polyline, the *x*- and *y*-coordinate vectors must be the same length.

## Output Arguments

collapse all

`xi`

, `yi`

— Coordinates of intersection points

numeric column vector

*x*- or *y*-coordinates of intersection points, specified as a numeric column vector.

`ii`

— line segment indices

numeric vector

Line segment indices of intersection points, specified as a numeric vector.

## Tips

If the spacing between points is large, the intersections calculated by the

`polyxpoly`

function and the intersections shown on a map display might be different. This is a result of differences between straight lines in the unprojected and projected coordinates. Similarly, there might be differences between the`polyxpoly`

result and intersections that assume great circles or rhumb lines between points.

## Version History

**Introduced before R2006a**

## See Also

crossfix | gcxgc | gcxsc | navfix | rhxrh | scxsc

## MATLAB Command

You clicked a link that corresponds to this MATLAB command:

Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.

Select a Web Site

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

You can also select a web site from the following list:

### Americas

- América Latina (Español)
- Canada (English)
- United States (English)

### Europe

- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)

- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- Deutsch
- English
- Français

- United Kingdom (English)

Contact your local office