我有一個機器人腿(3個關節),並使用convhull
繪製了3D繪圖中腿部末端的最大範圍。現在,我希望能夠在整個工作空間中指定一個特定的高度,並在該高度的工作空間內創建一個具有所有可能點的座標的X
和Y
的二維圖(三維圖同樣適用,但可能更難) 。從現有的3D繪圖/數據集繪製特定高度的繪圖點
編輯:忘了提及數據存儲在一個3乘1088矩陣,每行的座標。此外,由於Z
的座標可能與我正在查找的值完全不匹配,所以下一個最接近的點也適用。
謝謝。
我有一個機器人腿(3個關節),並使用convhull
繪製了3D繪圖中腿部末端的最大範圍。現在,我希望能夠在整個工作空間中指定一個特定的高度,並在該高度的工作空間內創建一個具有所有可能點的座標的X
和Y
的二維圖(三維圖同樣適用,但可能更難) 。從現有的3D繪圖/數據集繪製特定高度的繪圖點
編輯:忘了提及數據存儲在一個3乘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
座標進行搜索,找到最接近您想要的座標的位置。我們使用這個位置來提取出最接近的座標是(第4行),然後找到數據矩陣中共享相同座標(第5行)的那些位置。
最後,這些位置用於過濾數據矩陣(第6行和第7行)的x
和y
座標,然後我們用藍色和點標記(第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
邏輯陣列中的任何位置是指位於該索引處的對應點即已滿足查詢中的點中的至少一個要被匹配的標準。最後,我們使用這個邏輯數組來索引我們的數據,抓住所有的有效點並繪製它們。
希望這有助於! 「
@rayryeng你好。這很好,謝謝。我確實有一個問題:爲了獲得數據集,我需要爲手臂使用多組運動(由於約束),然後我將它們組合起來以提供總工作空間。這意味着對於每個運動組不同的高度。所以,你的解決方案的偉大工程,但只從一個子集,發現Z值。我怎樣才能從其他集合中獲取值?是否有可能引入容差或三角洲來找到所有點?如果圖表上有多條線,那沒問題。謝謝。 –
@ConstantinNeacsu - 檢查我的編輯。有一些信息缺失,但我用我最好的猜測和判斷。希望這是你正在尋找的。如果我幫助,考慮接受我的答案! – rayryeng
它完美的作品。非常感謝你。你是一個傳奇。 –
」next next「 - 如同每個X和Y的最接近的Z值,或Z高度的某個閾值內的Z值? – nkjt
最接近的值到Z,存在於我的數據集(所以第二個選項) –