【问题标题】:Plot points at a specific height from an existing 3D plot/data set从现有的 3D 图/数据集中在特定高度绘制点
【发布时间】:2015-01-05 13:46:33
【问题描述】:

我有一条机器人腿(3 个关节),我使用convhull 在 3D 图中绘制了腿末端的最大范围。现在,我希望能够在整个工作区中指定一个特定的高度,并创建一个 2D 图,其中包含该高度工作区内所有可能点的 XY 坐标(3D 图也可以,但可能更难)。

编辑:忘了提到数据存储在一个 3 x 1088 矩阵中,每行都有坐标。此外,由于Z 坐标可能与我正在寻找的值不完全匹配,因此下一个最近点也同样有效。

谢谢。

【问题讨论】:

  • “下一个最接近的” - 如每个 X 和 Y 的最接近 Z 值,或 Z 高度某个阈值内的 Z 值?
  • 最接近 Z 的值,存在于我的数据集中(所以第二个选项)

标签: matlab plot coordinates


【解决方案1】:

如果我正确解释了您的问题,您希望在矩阵中找出与特定 z 坐标匹配的点。如果完全匹配失败,您希望找到与所需查询最接近的 z 坐标。此外,由于您的数据存储在3 x 1088 矩阵中,您可能的意思是说每个 column 是一个坐标,而不是每一行。

我将假设第一、第二和第三行表示机器人运动的xyz 坐标。第一步只是找到所需的z 坐标与矩阵中所有坐标之间的最小距离。一旦找到匹配的坐标,我们只需在矩阵中找到匹配的 z 坐标,将它们隔离出来并仅绘制 xy 坐标。因此,假设您的点矩阵存储在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 行)。

最后,这些位置用于过滤出数据矩阵的 xy 坐标(第 6 行和第 7 行),然后我们用蓝色和点标记(第 8 行)绘制这些点。作为奖励,我们在图上放置了一个标题,显示与您的查询匹配的实际 z 坐标(第 9 行)。

编辑

鉴于您在 cmets 中的查询,您希望在每个值的特定容差范围内找到多个 z 值。最简单的方法是在for 循环中执行此操作。当然还有其他方法可以进行矢量化,但我不会花时间这样做。因此,您必须稍微修改上述公式并执行以下步骤:

  1. 对于每个查询点queryZ
    • 在您的数据中找到最近的点
    • 在该点的公差tol 内搜索所有z
    • 将这些点添加到列表中
  2. 对所有需要的查询点重复第 1 步
  3. 绘制所有这些点以供显示

因此,代码如下所示:

%// 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

第一步是不言自明的。我们首先定义一组您正在寻找的z 坐标,定义相似性容差并提取数据的z 坐标。接下来,对于我们查询集中的每个点,我们找到最接近您的数据的z 坐标,然后对于这个最接近的坐标,我们搜索在这个匹配点的指定容差范围内的点。我们使用这些位置(不是坐标)标记到一个逻辑数组中,其中true 表示该点已满足匹配标准,否则false。最后,逻辑数组中设置为true 的任何位置都意味着位于该索引处的对应点已满足与查询中至少一个点匹配的条件。

最后,我们使用这个逻辑数组来索引我们的数据,抓取所有有效点并绘制它们。


希望这会有所帮助!

【讨论】:

  • 嗨@rayryeng。这很好用,谢谢。不过我确实有一个问题:为了获得数据集,我需要对手臂使用多组运动(由于限制),然后将它们组合起来以提供整个工作空间。这意味着每个运动集都有不同的高度:因此,您的解决方案效果很好,但只能从一个子集中找到 Z 值。我怎样才能从其他集合中获取值?是否可以引入一个公差或增量来找到所有点?如果图表上有不止一条线,那也没关系。谢谢。
  • @ConstantinNeacsu - 检查我的编辑。缺少一些信息,但我使用了我最好的猜测和判断。希望这就是你要找的。如果我提供帮助,请考虑接受我的回答!
  • @ConstantinNeacsu ahaha 谢谢 :) 很高兴它成功了。祝你好运!
猜你喜欢
  • 2021-04-07
  • 2012-03-14
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多