我有一个机器人腿(3个关节),我使用convhull
在3D图中绘制了腿的最大范围。现在,我希望能够在整个工作空间中指定一个特定的高度,并创建一个2D图,其中X
和Y
坐标位于该高度的工作空间内的所有可能点(3D绘图仅适用于同样可能会更困难。)
编辑:忘了提到数据存储在3×1088矩阵中,每行有坐标。此外,由于Z
坐标可能与我正在寻找的值不完全匹配,因此下一个最近的点也可以正常工作。
谢谢。
答案 0 :(得分:0)
如果我正确解释您的问题,您希望将矩阵中与特定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
:
z
内搜索所有tol
个点因此,代码看起来像这样:
%// 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
的任何位置意味着位于此索引处的对应点已满足查询中至少一个点匹配的条件。
最后,我们使用这个逻辑数组索引我们的数据,获取所有有效点并绘制它们。
希望这有帮助!