绘制现有3D绘图/数据集中特定高度的点

时间:2015-01-05 13:46:34

标签: matlab plot coordinates

我有一个机器人腿(3个关节),我使用convhull在3D图中绘制了腿的最大范围。现在,我希望能够在整个工作空间中指定一个特定的高度,并创建一个2D图,其中XY坐标位于该高度的工作空间内的所有可能点(3D绘图仅适用于同样可能会更困难。)

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

谢谢。

1 个答案:

答案 0 :(得分:0)

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

我将假设第一行,第二行和第三行表示机器人运动的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行)。

修改

根据您在评论中的询问,您希望在每个值的特定容差范围内找到z的多个值。最简单的方法是在for循环中执行此操作。肯定有其他方法可以实现这种矢量化,但我不会花时间这样做。因此,您必须稍微修改上述配方并执行以下步骤:

  1. 对于每个查询点queryZ
    • 查找数据中的最近点
    • 在此点的容差z内搜索所有tol个点
    • 将这些点添加到列表中
  2. 对所有想要的查询点重复步骤#1
  3. 绘制所有这些点以供显示
  4. 因此,代码看起来像这样:

    %// 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的任何位置意味着位于此索引处的对应点已满足查询中至少一个点匹配的条件。

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


    希望这有帮助!