目的我有一湯三角形多邊形。我想檢索每個三角形的最大中位數作為向量。工作狀態起點:點數組 (n,3),例如 [x,y,z]引用上述點數組的三角形點索引數組 (n, 3),例如 [[0,1,2],[2,3,4]...]我將兩個包含真實3D點坐標的單個矩陣組合在一起。然后我計算中位數向量及其長度。/編輯:我將代碼更新為我的當前版本def calcMedians(polygon): # C -> AB = C-(A + 0.5(B-A)) # B -> AC = B - (A + 0.5(C-A)) # A -> BC = A - (B dim = np.shape(polygon) medians = np.zeros((dim[0],3,2,dim[1])) medians[:,0,0] = polygon[:,2] medians[:,0,1] = polygon[:,0] + 0.5*(polygon[:,1]-polygon[:,0]) medians[:,1,0] = polygon[:,1] medians[:,1,1] = polygon[:,0] + 0.5*(polygon[:,2]-polygon[:,0]) medians[:,2,0] = polygon[:,0] medians[:,2,1] = polygon[:,1] + 0.5*(polygon[:,2]-polygon[:,1]) m1 = np.linalg.norm(medians[:,0,0]-medians[:,0,1],axis=1) m2 = np.linalg.norm(medians[:,1,0]-medians[:,1,1],axis=1) m3 = np.linalg.norm(medians[:,2,0]-medians[:,2,1],axis=1) medianlengths = np.vstack((m1,m2,m3)).T maxlengths = np.argmax(medianlengths,axis=1) final = np.zeros((dim[0],2,dim[1])) dim = np.shape(medians) for i in range(0,dim[0]): idx = maxlengths[i] final[i] = medians[i,idx] return final現在,我首先使用空矩陣創建最終的中值向量矩陣。長度使用np.linalg.norm計算并收集在矩陣中。對于此矩陣,argmax 方法用于識別目標中值向量。問題Old:但是,我對維度感到困惑,目前無法使其工作或了解結果是否正確。有人知道如何正確地做到這一點和/或這種方法是否有效?我的目標是以[n_polygons,3(由于3個中位數),2(起點和終點),3(xyz)]的形式構造3個中位數。使用最大長度信息,我想將其簡化為[n_polygons,2(起點和終點),3(xyz)]在函數中使用這個臨時的 for 循環,我可以創建輸出。但是必須有一個更“干凈”的矩陣方法。使用中位數[:,最大長度,:,:]會導致形狀為[4,n_polygons,2,3]而不是[n_polygons,2,3],我不明白為什么。兩個三角形的中位數的示例圖像:不幸的是,我沒有一個大型的示例性數據集,但我想這可以很快生成。上圖中的示例數據集是:polygons = np.array([[0,1,2],[0,3,2]])
points = np.array([[0,0],
[1,0],
[1,1],
[0,1]])
polygons3d = points[polygons[:,:]]
1 回答

慕桂英3389331
TA貢獻2036條經驗 獲得超8個贊
最長的中位數表示最短的三角形邊。查看此處,將中位數長度公式重寫為
M[i] = Sqrt(2(a^2+b^2+c^2)-3*side[i]^2) / 2
因此,您可以僅使用邊長來簡化計算(也許您已經擁有它們)
關于 3D 坐標 - 只需在不垂直于點平面的任何坐標平面上使用投影 - 忽略一個維度(選擇具有最低值范圍的維度)
添加回答
舉報
0/150
提交
取消