主要内容

pointLocation

包含点的三角形或四面体

说明

ID = pointLocation(TR,P) 返回包含 P 中查询点的三角形或四面体的 ID。矩阵 P 中的每行都包含一个查询点的坐标。

示例

ID = pointLocation(TR,x,y) 将二维查询点的 x 坐标和 y 坐标指定为单独的列向量。

ID = pointLocation(TR,x,y,z) 将三维查询点的 x 坐标、y 坐标和 z 坐标指定为单独的列向量。

对于上述任意语法,[ID,B] = pointLocation(___) 还会返回每个查询点相对于包含它的三角形或四面体的重心坐标。

示例

示例

全部折叠

查找三角剖分中包围一组查询点的三角形。

定义三角剖分的点和连接。

TP = [2.5 8.0;
      6.5 8.0;
      2.5 5.0;
      6.5 5.0;
      1.0 6.5;
      8.0 6.5];
C = [5 3 1;
     3 2 1;
     3 4 2;
     4 6 2];
TR = triangulation(C,TP);

定义两个查询点。

P = [2.25 7; 6 6.5];

绘图三角剖分和查询点。

triplot(TR)
hold on
plot(P(:,1),P(:,2),"k*")
ylim([4 9])
xlim([0 9])

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

确定包围每个查询点的三角形的 ID。

ID = pointLocation(TR,P)
ID = 2×1

     1
     3

用红色突出显示包围查询点的三角形。

triplot(TR.ConnectivityList(ID,:),TP(:,1),TP(:,2),"r")

Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers

查找三维三角剖分中包围一组查询点的四面体。

基于一组三维点创建德劳内三角剖分。

rng default
x = rand([20 1]);
y = rand([20 1]);
z = rand([20 1]);
TR = delaunayTriangulation(x,y,z);

查找包围查询点的四面体的 ID 并计算查询点的重心坐标。

P = [0.7 0.6 0.3;
     0.5 0.5 0.5];
[ID,B] = pointLocation(TR,P)
ID = 2×1

     9
     8

B = 2×4

    0.2046    0.0893    0.5721    0.1340
    0.1900    0.1495    0.6422    0.0183

确定哪些查询点位于二维三角剖分的三角形的边和顶点上。

定义三角剖分的点和连接。

TP = [2.5 8.0;
      6.5 8.0;
      2.5 5.0;
      6.5 5.0;
      1.0 6.5;
      8.0 6.5];
C = [5 3 1;
     3 2 1;
     3 4 2;
     4 6 2];
TR = triangulation(C,TP);

定义查询点。

P = [2.25 7;
    6 6.5;
    2.5 8.0;
    4.5 5.0;
    8 6.5
    7.5 7.5];

查找每个查询点相对于包含该点的三角形的重心坐标。对于三角剖分外部的点,pointLocation 返回 NaN

[~,B] = pointLocation(TR,P)
B = 6×3

    0.1667    0.2500    0.5833
    0.1250    0.3750    0.5000
         0         0    1.0000
    0.5000    0.5000    0.0000
         0    1.0000         0
       NaN       NaN       NaN

使用重心坐标确定查询点是位于顶点上、边上、三角形内还是三角剖分外。如果查询点位于顶点上,则其重心坐标之一为 1,其他坐标为 0。如果查询点位于边上但不与顶点重合,则其重心坐标之一为 0,其他坐标均不为 1。对于三角剖分外的查询点,重心坐标为 NaN

M = size(B,1);
loc = cell(M,2);
tol = 1e-10;

for i = 1:M
    b = B(i,:);
    loc{i,1} = P(i,1:2);
    if ismembertol(1,b,tol)
        loc{i,2} = "Vertex";
    elseif ismembertol(0,b,tol)
        loc{i,2} = "Edge";
    elseif isnan(B(i))
        loc{i,2} = "Outside";
    else
        loc{i,2} = "Triangle";
    end
end
loc
loc=6×2 cell array
    {[     2.2500 7]}    {["Triangle"]}
    {[     6 6.5000]}    {["Triangle"]}
    {[     2.5000 8]}    {["Vertex"  ]}
    {[     4.5000 5]}    {["Edge"    ]}
    {[     8 6.5000]}    {["Vertex"  ]}
    {[7.5000 7.5000]}    {["Outside" ]}

绘图三角剖分和查询点。

triplot(TR)
hold on
plot(P(:,1),P(:,2),'k*')

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

输入参数

全部折叠

三角剖分表示法,指定为标量 triangulationdelaunayTriangulation 对象。

数据类型: triangulation | delaunayTriangulation

查询点,指定为 2 列矩阵(二维)或 3 列矩阵(三维)。P 包含查询点的 x 坐标和 y 坐标,还可能包含 z 坐标。

数据类型: double

查询点的 x 坐标,指定为列向量。

数据类型: double

查询点的 y 坐标,指定为列向量。

数据类型: double

查询点的 z 坐标,指定为列向量。

数据类型: double

输出参量

全部折叠

包含查询点的三角形或四面体的三角形或四面体 ID,以列向量形式返回。三角形或四面体 ID 是 ConnectivityList 属性中对应三角形或四面体的行号。

如果查询点位于两个或多个三角形或四面体的边界上,将返回最大 ID。

ID 包含不位于三角剖分的三角形或四面体中的点的 NaN 值。

数据类型: double

每个查询点相对于包含它的三角形或四面体的重心坐标,以 3 列矩阵(二维)或 4 列矩阵(三维)形式返回。

  • 如果查询点在顶点上,则其重心坐标之一为 1,其他为 0。

  • 如果查询点在边上,则其重心坐标之一为 0,其他均不为 1。

  • 如果查询点在三角形内,则其所有重心坐标均为非零值。

  • 如果查询点在三角剖分外,则所有重心坐标均为 NaN

数据类型: double

扩展功能

全部展开

基于线程的环境
使用 MATLAB® backgroundPool 在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool 加快代码运行速度。

版本历史记录

在 R2013a 中推出

全部展开