Эффективный способ получения максимальных медиан треугольников - PullRequest
0 голосов
/ 17 февраля 2020

Цель

У меня есть суп из треугольников. Я хочу получить наибольшую медиану как вектор для каждого треугольника.

Состояние работы

Начальная точка:

  • Массив точек ( 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], и я не понимаю, почему.

Пример изображения для медианы двух треугольников:

Example image for medians of two triangles

К сожалению, у меня нет большого примерного набора данных, но я предполагаю, что он может быть сгенерирован довольно быстро. Пример набора данных из рисунка, показанного выше:

polygons = np.array([[0,1,2],[0,3,2]])
points = np.array([[0,0],
          [1,0],
          [1,1],
          [0,1]])
polygons3d = points[polygons[:,:]]

1 Ответ

0 голосов
/ 17 февраля 2020

Самая длинная медиана для самой короткой стороны треугольника. Смотрите здесь и переписывайте формулу средней длины как

M[i] = Sqrt(2(a^2+b^2+c^2)-3*side[i]^2) / 2

Таким образом, вы можете немного упростить вычисления, используя только длины сторон (возможно, они у вас уже есть)

Относительно трехмерных координат - просто используйте проекцию на любую координатную плоскость, не перпендикулярную вашей точечной плоскости - игнорируйте одно измерение (выберите измерение с наименьшим диапазоном значений)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...