inpolygon

Points located inside or on edge of polygonal region

Syntax

  • in = inpolygon(xq,yq,xv,yv) example
  • [in,on] = inpolygon(xq,yq,xv,yv) example

Description

example

in = inpolygon(xq,yq,xv,yv) returns in indicating if the query points specified by xq and yq are inside or on the edge of the polygon area defined by xv and yv.

example

[in,on] = inpolygon(xq,yq,xv,yv) also returns on indicating if the query points are on the edge of the polygon area.

Examples

expand all

Points Inside Convex Polygon

Define a pentagon and a set of points. Then, determine which points lie inside (or on the edge) of the pentagon.

Define the x and y coordinates of polygon vertices to create a pentagon.

L = linspace(0,2.*pi,6);
xv = cos(L)';
yv = sin(L)';

Define x and y coordinates of 250 random query points. Initialize the random-number generator to make the output of randn repeatable.

rng default
xq = randn(250,1);
yq = randn(250,1);

Determine whether each point lies inside or on the edge of the polygon area. Also determine whether any of the points lie on the edge of the polygon area.

[in,on] = inpolygon(xq,yq,xv,yv);

Determine the number of points lying inside or on the edge of the polygon area.

numel(xq(in))
ans =

    80

Determine the number of points lying on the edge of the polygon area.

numel(xq(on))
ans =

     0

Since there are no points lying on the edge of the polygon area, all 80 points identified by xq(in), yq(in) are strictly inside the polygon area.

Determine the number of points lying outside the polygon area (not inside or on the edge).

numel(xq(~in))
ans =

   170

Plot the polygon and the query points. Display the points inside the polygon with a red plus. Display the points outside the polygon with a blue circle.

figure

plot(xv,yv) % polygon
axis equal

hold on
plot(xq(in),yq(in),'r+') % points inside
plot(xq(~in),yq(~in),'bo') % points outside
hold off

Points Inside Multiply Connected Polygon

Find the points inside a square with a square hole.

Define a square region with a square hole. Specify the vertices of the outer loop in a counterclockwise direction, and specify the vertices for the inner loop in a clockwise direction. Use NaN to separate the coordinates for the outer and inner loops.

xv = [1 4 4 1 1 NaN 2 2 3 3 2];
yv = [1 1 4 4 1 NaN 2 3 3 2 2];

Define x and y coordinates of 500 random points. Initialize the random-number generator to make the output of randn repeatable.

rng default
xq = rand(500,1)*5;
yq = rand(500,1)*5;

Determine whether each point lies inside or on the edge of the polygon area.

in = inpolygon(xq,yq,xv,yv);

Plot the polygon and the query points. Display the points inside the polygon with a red plus. Display the points outside the polygon with a blue circle.

figure

plot(xv,yv,'LineWidth',2) % polygon
axis equal

hold on
plot(xq(in),yq(in),'r+') % points inside
plot(xq(~in),yq(~in),'bo') % points outside
hold off

Query points in the square hole are outside the polygon.

Points Inside Self-Intersecting Polygon

Define the x and y coordinates for a pentagram.

xv = [0.5;0.2;1.0;0;0.8;0.5];
yv = [1.0;0.1;0.7;0.7;0.1;1];

Define the x and y coordinates of 12 query points.

xq = [0.1;0.5;0.9;0.2;0.4;0.5;0.5;0.9;0.6;0.8;0.7;0.2];
yq = [0.4;0.6;0.9;0.7;0.3;0.8;0.2;0.4;0.4;0.6;0.2;0.6];

Determine whether each point lies inside or on the edge of the polygon area. Also determine whether any of the points lie on the edge of the polygon area.

[in,on] = inpolygon(xq,yq,xv,yv);

Determine the number of points lying inside or on the edge of the polygon area.

numel(xq(in))
ans =

     8

Determine the number of points lying on the edge of the polygon area.

numel(xq(on))
ans =

     2

Determine the number of points lying outside the polygon area (not inside or on the edge).

numel(xq(~in))
ans =

     4

Plot the polygon and the points. Display the points strictly inside the polygon with a red plus. Display the points on the edge with a black asterisk. Display the points outside the polygon with a blue circle.

figure

plot(xv,yv) % polygon

hold on
plot(xq(in&~on),yq(in&~on),'r+') % points strictly inside
plot(xq(on),yq(on),'k*') % points on edge
plot(xq(~in),yq(~in),'bo') % points outside
hold off

Six points lie inside the polygon. Two points lie on the edge of the polygon. Four points lie outside the polygon.

Input Arguments

expand all

xq — x-coordinates of query pointsscalar | vector | matrix | multidimensional array

x-coordinates of query points, specified as a scalar, vector, matrix, or multidimensional array.

The size of xq must match the size of yq.

Data Types: double | single

yq — y-coordinates of query pointsscalar | vector | matrix | multidimensional array

y-coordinates of query points, specified as a scalar, vector, matrix, or multidimensional array.

The size of yq must match the size of xq.

Data Types: double | single

xv — x-coordinates of polygon verticesvector

x-coordinates of polygon vertices, specified as a vector.

The size of xv must match the size of yv.

To specify vertices of multiply connected or disjoint polygons, separate the coordinates for distinct loops with NaN. Additionally for multiply connected polygons, you must orient the vertices for external and internal loops in opposite directions.

The polygon cannot be self-intersecting and multiply connected due to the ambiguity associated with self-intersections and loop orientations.

Data Types: double | single

yv — y-coordinates of polygon verticesvector

y-coordinates of polygon vertices, specified as a vector.

The size of yv must match the size of xv.

To specify vertices of multiply connected or disjoint polygons, separate the coordinates for distinct loops with NaN. Additionally for multiply connected polygons, you must orient the vertices for external and internal loops in opposite directions.

The polygon cannot be self-intersecting and multiply connected due to the ambiguity associated with self-intersections and loop orientations.

Data Types: double | single

Output Arguments

expand all

in — Indicator for points inside or on edge of polygon arealogical array

Indicator for the points inside or on the edge of the polygon area, returned as a logical array. in is the same size as xq and yq.

  • A logical 1 (true) indicates that the corresponding query point is inside the polygonal region or on the edge of the polygon boundary.

  • A logical 0 (false) indicates that the corresponding query point is outside the polygonal region.

Therefore, you can use in to index into xq and yq to identify query points of interest.

xq(in), yq(in)Query points inside or on the edge of the polygon area
xq(~in), yq(~in)Query points outside the polygonal region

on — Indicator for points on edge of polygon arealogical array

Indicator for the points on the edge of the polygon area, returned as a logical array. on is the same size as xq and yq.

  • A logical 1 (true) indicates that the corresponding query point is on the polygon boundary.

  • A logical 0 (false) indicates that the corresponding query point is inside or outside the polygon boundary.

Therefore, you can use on and in to index into xq and yq identify query points of interest.

xq(on), yq(on)Query points on the polygon boundary
xq(~on), yq(~on)Query points inside or outside the polygon boundary
xq(in&~on), yq(in&~on)Query points strictly inside the polygonal region

See Also

Was this topic helpful?