# inpolygon
位于多边形区域边缘内部或边缘上的点
函数库: TyMath
# 语法
# 说明
i, = inpolygon(xq,yq,xv,yv) 返回 i,以指明 xq 和 yq 所指定的查询点是在 xv 和 yv 定义的多边形区域的边缘内部还是在边缘上。示例
i,o = inpolygon(xq,yq,xv,yv) 还返回 o 以指明查询点是否位于多边形区域的边缘。示例
# 示例
凸多边形内的点
定义一个五边形和一个点集。然后,确定哪些点位于五边形的内部(或边缘上)。
定义多边形顶点的 x 和 y 坐标以创建五角形。
using TyMath
using TyPlot
L = LinRange(0, 2 * pi, 6);
xv = cos.(L);
yv = sin.(L);
定义 250 个随机查询点的 x 和 y 坐标。初始化随机数生成器以使 randn 的输出可重复。
rng = MT19937ar(5489);
xq = randn(rng, 250);
yq = randn(rng, 250);
确定每个点是位于多边形区域边缘内部还是边缘上。还确定任何点是否位于多边形区域的边缘。
i, o = inpolygon(xq, yq, xv, yv);
确定位于多边形区域边缘内部或边缘上的点数。
length(xq[i])
80
确定位于多边形区域边缘上的点数。
length(xq[o])
0
由于多边形区域边缘上没有点,因此用 xq[i], yq[i] 标识的所有 80 个点完全位于多边形区域内部。
确定位于多边形区域外部的点数(不在边缘内部或边缘上)。
length(xq[.!i])
170
绘制多边形和查询点。显示多边形内部的点时带有一个红色加号。显示多边形外部的点时带有一个蓝色圆形。
figure()
plot(xv,yv)
hold("on")
plot(xq[i],yq[i],"r+") # points inside
plot(xq[.!i],yq[.!i],"bo") # points outside
hold("off")
axis("equal")
多连通多边形内的点
查找带有方孔的方形内的点。
定义一个带有方孔的方形区域。按逆时针方向指定外循环的顶点,并按顺时针方向指定内循环的顶点。使用 NaN 隔开外循环和内循环的坐标。
using TyMath
using TyPlot
xv = [1; 4; 4; 1; 1; NaN; 2; 2; 3; 3; 2];
yv = [1; 1; 4; 4; 1; NaN; 2; 3; 3; 2; 2];
定义 500 个随机点的 x 和 y 坐标。初始化随机数生成器以使 randn 的输出可重复。
rng = MT19937ar(5489);
xq = rand(rng, 500) * 5;
yq = rand(rng, 500) * 5;
确定每个点是位于多边形区域边缘内部还是边缘上。
i, o = inpolygon(xq, yq, xv, yv);
绘制多边形和查询点。显示多边形内部的点时带有一个红色加号。显示多边形外部的点时带有一个蓝色圆形。
figure()
plot(xv,yv,linewidth=2)
hold("on")
plot(xq[i],yq[i],"r+") # points inside
plot(xq[.!i],yq[.!i],"bo") # points outside
hold("off")
axis("equal")
方孔内的查询点在多边形外部。
自交多边形内的点
定义五角形的 x 和 y 坐标。
using TyMath
using TyPlot
xv = [0.5; 0.2; 1.0; 0; 0.8; 0.5];
yv = [1.0; 0.1; 0.7; 0.7; 0.1; 1];
定义 12 个查询点的 x 和 y 坐标。
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];
确定每个点是位于多边形区域边缘内部还是边缘上。还确定任何点是否位于多边形区域的边缘。
i, o = inpolygon(xq, yq, xv, yv);
确定位于多边形区域边缘内部或边缘上的点数。
length(xq[i])
8
确定位于多边形区域边缘上的点数。
length(xq[o])
2
确定位于多边形区域外部的点数(不在边缘内部或边缘上)。
length(xq[.!i])
4
绘制多边形和点。显示完全在多边形内部的点时带有一个红色加号。显示边缘上的点时带有一个黑色星号。显示多边形外部的点时带有一个蓝色圆形。
figure()
plot(xv,yv)
hold("on")
plot(xq[@. i&!o],yq[@. i&!o],"r+") # points strictly inside
plot(xq[o],yq[o],"k*") # points on edge
plot(xq[.!i],yq[.!i],"bo") # points outside
6 个点位于多边形内部。两个点位于多边形的边缘上。四个点位于多边形外部。
# 输入参数
xq — 查询点的 x 坐标标量 | 向量 | 矩阵 | 多维数组
查询点的 x 坐标,指定为标量、向量、矩阵或多维数组。
xq 的大小必须与 yq 的大小匹配。
数据类型: Int64 | Int32 | Int16 | Int128 | Float16 | Float32 | Float64 | UInt8 | UInt16 | UInt32 | UInt64
yq — 查询点的 y 坐标标量 | 向量 | 矩阵 | 多维数组
查询点的 y 坐标,指定为标量、向量、矩阵或多维数组。
yq 的大小必须与 xq 的大小匹配。
数据类型: Int64 | Int32 | Int16 | Int128 | Float16 | Float32 | Float64 | UInt8 | UInt16 | UInt32 | UInt64
xv — 多边形顶点的 x 坐标向量
多边形顶点的 x 坐标,指定为向量。
xv 的大小必须与 yv 的大小匹配。
要指定多连通或不相交的多边形的顶点,请通过 NaN 隔开不同循环的坐标。另外,对于多连通多边形,必须使外部和内部循环的顶点朝着相反的方向。
由于与自相交和循环方向相关的多义性,多边形不能自相交和多连通。
数据类型: Int64 | Int32 | Int16 | Int128 | Float16 | Float32 | Float64 | UInt8 | UInt16 | UInt32 | UInt64
xv — 多边形顶点的 y 坐标向量
多边形顶点的 y 坐标,指定为向量。
yv 的大小必须与 xv 的大小匹配。
要指定多连通或不相交的多边形的顶点,请通过 NaN 隔开不同循环的坐标。另外,对于多连通多边形,必须使外部和内部循环的顶点朝着相反的方向。
由于与自相交和循环方向相关的多义性,多边形不能自相交和多连通。
数据类型: Int64 | Int32 | Int16 | Int128 | Float16 | Float32 | Float64 | UInt8 | UInt16 | UInt32 | UInt64
# 输出参数
i — 在多边形区域边缘内部或边缘上的点的指示符逻辑数组
在多边形区域边缘内部或边缘上的点的指示符,以逻辑数组的形式返回。i 的大小与 xq 和 yq 相同。
逻辑值 1 (true) 用于指明相应的查询点是在多边形区域内部还是在多边形边界的边缘。
逻辑值 0 (false) 用于指明相应的查询点是在多边形区域的外部。
因此,可以使用 i 创建指向 xq 和 yq 的索引,以标识相关的查询点。
| 公式 | 说明 |
|---|---|
| xq[i], yq[i] | 在多边形区域边缘内部或边缘上的查询点 |
| xq[.!i], yq[.!i] | 在多边形区域外部的查询点 |
o — 多边形区域边缘上的点的指示符逻辑数组
多边形区域边缘上的点的指示符,以逻辑数组的形式返回。o 的大小与 xq 和 yq 相同。
逻辑值 1 (true) 用于指明相应的查询点是在多边形边界上。
逻辑值 0 (false) 用于指明相应的查询点是在多边形边界的内部还是外部。
因此,可以使用 o 和 i 创建指向 xq 和 yq 的索引,以标识相关的查询点。
| 公式 | 说明 |
|---|---|
| xq[o], yq[o] | 在多边形边界上的查询点 |
| xq[.!o], yq[.!o] | 位于多边形边界内部或外部的查询点 |
| xq[@. i&!o], yq[@. i&!o) | 完全在多边形区域内部的查询点 |