Цель
У меня есть суп из треугольников. Я хочу получить наибольшую медиану как вектор для каждого треугольника.
Состояние работы
Начальная точка:
- Массив точек ( n, 3), например, [x, y, z]
- Массив индексов точек треугольника (n, 3), ссылающихся на массив точек выше, например, [[0,1,2], [2,3 , 4] ...]
Я объединяю обе эти две матрицы, содержащие реальные трехмерные координаты точки. Затем я вычисляю медианные векторы и их длины.
/ Edit: я обновил код до своей текущей версии
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 используется для определения целевого медианного вектора.
Задача
Старый: Однако меня как-то смущает размерность и в настоящее время не удается заставить это работать или понять, верен ли результат. Кто-нибудь знает, как сделать это правильно и / или если этот подход эффективен?
Моя цель была бы конструкцией 3 медианы в виде [n_polygons, 3 (из-за 3 медиан), 2 (начальная и конечная точка), 3 (xyz)]
Используя информацию о максимальной длине, я хотел бы уменьшить ее до [ n_polygons, 2 (начальная и конечная точка), 3 (xyz)]
Используя это импровизированное значение для l oop в функции, я могу создать вывод. Но должен быть более «чистый» матричный метод. Использование медиан [[, maxlengths,:,:] приводит к форме [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[:,:]]