在现有 3D plot/data 集的特定高度绘制点
Plot points at a specific height from an existing 3D plot/data set
我有一条机器人腿(3 个关节),我使用 convhull
在 3D 图中绘制了腿末端的最大范围。现在,我希望能够在整个工作空间内指定一个特定的高度,并使用工作空间内所有可能点在该高度的 X
和 Y
坐标创建一个 2D 图(3D 图仅适用也一样,但可能更难)。
编辑:忘记提及数据存储在一个 3 x 1088 矩阵中,每行都有坐标。此外,由于 Z
坐标可能与我要查找的值不完全匹配,因此下一个最接近的点也同样有效。
谢谢。
如果我对您的问题的解释正确,您希望在矩阵中分离出与特定 z
坐标匹配的点。如果无法完全匹配,您希望找到 最接近 z 坐标的查询。此外,由于您的数据存储在 3 x 1088
矩阵中,您可能想说每个 列 是一个坐标,而不是每一行。
我假设第一行、第二行和第三行分别表示机器人运动的 x
、y
和 z
坐标。第一步只是找到所需 z
坐标与矩阵中所有坐标之间的最小距离。找到匹配坐标后,我们只需在矩阵中找到匹配的那些 z 坐标,将它们分离出来并仅绘制 x
和 y
坐标。因此,假设您的点矩阵存储在 data
中,而您的查询 z
坐标存储在 queryZ
中,请执行以下操作:
queryZ = 2.0; %// 1
zPoints = data(3,:); %// 2
[~,loc] = min(abs(queryZ - zPoints)); %// 3
minZ = zPoints(loc); %// 4
ind = data(3,:) == minZ; %// 5
xPoints = data(1,ind); %// 6
yPoints = data(2,ind); %// 7
plot(xPoints, yPoints, 'b.'); %// 8
title(['Points found for ' num2str(minZ)]); %// 9
代码的第一行声明了您要搜索的 z
坐标。接下来的两行提取数据的 z
坐标,然后使用 min
并搜索 z
坐标并找到最接近所需 z
的位置协调。我们使用这个位置来提取最近的 z
坐标(第 4 行),然后在数据矩阵中找到共享相同 z
坐标的那些位置(第 5 行)。
最后,这些位置用于过滤掉数据矩阵的 x
和 y
坐标(第 6 行和第 7 行),然后我们用蓝色和点标记绘制这些点(第 8 行)。作为奖励,我们在图上放置了一个标题,向您显示与您的查询匹配的实际 z
坐标(第 9 行)。
编辑
鉴于您在评论中的询问,您希望在每个值的特定公差范围内找到 z
的多个值。最简单的方法是在 for
循环中执行此操作。当然还有其他方法可以进行矢量化,但我不会花时间这样做。因此,您必须稍微修改上述公式并执行以下步骤:
- 对于每个查询点
queryZ
:
- 找到数据中最近的点
- 搜索此点
tol
公差范围内的所有 z
个点
- 将这些点添加到列表中
- 对所有需要的查询点重复步骤#1
- 绘制所有这些点以供显示
因此,代码看起来像这样:
%// Step #1
queryZ = [2.0 1.0 -1.0 -2.0]; %// Define desired z points
tol = 0.001; %// Define tolerance here
zPoints = data(3,:); %// Extract out z points
%// Step #2
loc = false(numel(zPoints));
for idx = 1 : numel(queryZ)
z = queryZ(idx); %// Get query point
[~,minInd] = min(abs(z - zPoints)); %// Find closest point to query
minZ = zPoints(minInd);
loc(abs(minZ - zPoints) < tol) = true; %// Find indices within tolerance wrt closest point
%// Set to true
end
%// Step #3
xPoints = data(1,ind); %// 6
yPoints = data(2,ind); %// 7
plot(xPoints, yPoints, 'b.'); %// 8
第一步是self-explanatory。我们首先定义一堆您正在寻找的 z
坐标,定义相似度容差并提取数据的 z
坐标。接下来,对于我们查询集中的每个点,我们找到最接近您的数据的 z
坐标,然后根据这个最接近的坐标,我们搜索在这个匹配点的指定公差范围内的点。我们使用这些位置(不是坐标)标记成一个逻辑数组,其中 true
表示该点已满足匹配条件,否则 false
。最后,逻辑数组中任何设置为 true
的位置都意味着位于该索引处的对应点已满足要与您查询中的至少一个点匹配的条件。
最后,我们使用这个逻辑数组来索引我们的数据,获取所有有效点并绘制它们。
希望对您有所帮助!
我有一条机器人腿(3 个关节),我使用 convhull
在 3D 图中绘制了腿末端的最大范围。现在,我希望能够在整个工作空间内指定一个特定的高度,并使用工作空间内所有可能点在该高度的 X
和 Y
坐标创建一个 2D 图(3D 图仅适用也一样,但可能更难)。
编辑:忘记提及数据存储在一个 3 x 1088 矩阵中,每行都有坐标。此外,由于 Z
坐标可能与我要查找的值不完全匹配,因此下一个最接近的点也同样有效。
谢谢。
如果我对您的问题的解释正确,您希望在矩阵中分离出与特定 z
坐标匹配的点。如果无法完全匹配,您希望找到 最接近 z 坐标的查询。此外,由于您的数据存储在 3 x 1088
矩阵中,您可能想说每个 列 是一个坐标,而不是每一行。
我假设第一行、第二行和第三行分别表示机器人运动的 x
、y
和 z
坐标。第一步只是找到所需 z
坐标与矩阵中所有坐标之间的最小距离。找到匹配坐标后,我们只需在矩阵中找到匹配的那些 z 坐标,将它们分离出来并仅绘制 x
和 y
坐标。因此,假设您的点矩阵存储在 data
中,而您的查询 z
坐标存储在 queryZ
中,请执行以下操作:
queryZ = 2.0; %// 1
zPoints = data(3,:); %// 2
[~,loc] = min(abs(queryZ - zPoints)); %// 3
minZ = zPoints(loc); %// 4
ind = data(3,:) == minZ; %// 5
xPoints = data(1,ind); %// 6
yPoints = data(2,ind); %// 7
plot(xPoints, yPoints, 'b.'); %// 8
title(['Points found for ' num2str(minZ)]); %// 9
代码的第一行声明了您要搜索的 z
坐标。接下来的两行提取数据的 z
坐标,然后使用 min
并搜索 z
坐标并找到最接近所需 z
的位置协调。我们使用这个位置来提取最近的 z
坐标(第 4 行),然后在数据矩阵中找到共享相同 z
坐标的那些位置(第 5 行)。
最后,这些位置用于过滤掉数据矩阵的 x
和 y
坐标(第 6 行和第 7 行),然后我们用蓝色和点标记绘制这些点(第 8 行)。作为奖励,我们在图上放置了一个标题,向您显示与您的查询匹配的实际 z
坐标(第 9 行)。
编辑
鉴于您在评论中的询问,您希望在每个值的特定公差范围内找到 z
的多个值。最简单的方法是在 for
循环中执行此操作。当然还有其他方法可以进行矢量化,但我不会花时间这样做。因此,您必须稍微修改上述公式并执行以下步骤:
- 对于每个查询点
queryZ
:- 找到数据中最近的点
- 搜索此点
tol
公差范围内的所有z
个点 - 将这些点添加到列表中
- 对所有需要的查询点重复步骤#1
- 绘制所有这些点以供显示
因此,代码看起来像这样:
%// Step #1
queryZ = [2.0 1.0 -1.0 -2.0]; %// Define desired z points
tol = 0.001; %// Define tolerance here
zPoints = data(3,:); %// Extract out z points
%// Step #2
loc = false(numel(zPoints));
for idx = 1 : numel(queryZ)
z = queryZ(idx); %// Get query point
[~,minInd] = min(abs(z - zPoints)); %// Find closest point to query
minZ = zPoints(minInd);
loc(abs(minZ - zPoints) < tol) = true; %// Find indices within tolerance wrt closest point
%// Set to true
end
%// Step #3
xPoints = data(1,ind); %// 6
yPoints = data(2,ind); %// 7
plot(xPoints, yPoints, 'b.'); %// 8
第一步是self-explanatory。我们首先定义一堆您正在寻找的 z
坐标,定义相似度容差并提取数据的 z
坐标。接下来,对于我们查询集中的每个点,我们找到最接近您的数据的 z
坐标,然后根据这个最接近的坐标,我们搜索在这个匹配点的指定公差范围内的点。我们使用这些位置(不是坐标)标记成一个逻辑数组,其中 true
表示该点已满足匹配条件,否则 false
。最后,逻辑数组中任何设置为 true
的位置都意味着位于该索引处的对应点已满足要与您查询中的至少一个点匹配的条件。
最后,我们使用这个逻辑数组来索引我们的数据,获取所有有效点并绘制它们。
希望对您有所帮助!