Python 三角形多边形求最大中值的有效方法

Python 三角形多边形求最大中值的有效方法,python,math,geometry,Python,Math,Geometry,目标 我有一碗三角形多边形汤。我想检索每个三角形的最大中值作为向量 工作状态 起点: 点阵列(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

目标

我有一碗三角形多边形汤。我想检索每个三角形的最大中值作为向量

工作状态

起点:

  • 点阵列(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_多边形,3(由于3个中间点),2(起点和终点),3(xyz)]的形式构建3个中间点

使用“最大长度”信息,我想将其缩减为[n_多边形,2(起点和终点),3(xyz)]

使用函数中的这个临时for循环,我可以创建输出。但必须有一个更“干净”的矩阵方法来解决这个问题。使用中位数[:,maxLength,:,:]会导致[4,n_多边形,2,3]的形状,而不是[n_多边形,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[:,:]]

最长的中间值表示最短的三角形边。并将中值长度公式改写为

M[i] = Sqrt(2(a^2+b^2+c^2)-3*side[i]^2) / 2
因此,您可以仅使用边长来简化计算(可能您已经有了边长)


关于三维坐标-只需在不垂直于点平面的任何坐标平面上使用投影-忽略一个维度(选择值范围最小的维度)

谢谢@MBo的回答。我知道阿波罗尼尔斯定理,但我不确定这种方法是否在改进我的方法。我没有三角形边长,以后也不需要。我稍后需要的是中值的向量。那么为什么不先计算中值,然后计算长度,而不是计算三角形边,最大中值,然后是中值向量呢?我目前的主要问题是如何将中值向量信息和最大长度信息组合到[n_多边形,2]向量中,其中2表示中值的起点和终点