Найти веса от существующей точки, чтобы расположить точку относительно треугольника, используя взвешенное среднее - PullRequest
0 голосов
/ 17 октября 2018

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

import numpy as np
triangle = np.arange(9)
triangle.shape = (3,3)
weights = np.array([1, 0.3, 20])
point = np.average(triangle, weights=weights, axis=0)

Теперь у меня есть точка, расположенная в треугольнике с использованием взвешенного среднего.Мой вопрос, как сделать обратное.Если у меня есть треугольник, и у меня уже есть точка, расположенная внутри него, могу ли я получить весовые коэффициенты из отношения между точкой и треугольником, которые позволили бы мне использовать средневзвешенное значение для изменения положения точки?Например, если треугольник сместился, и я хочу, чтобы точка двигалась, оставаясь в той же позиции относительно треугольника.Я понимаю, что это можно сделать с помощью барицентрического расчета.Я надеюсь, что есть более простой способ со средневзвешенным значением.

1 Ответ

0 голосов
/ 17 октября 2018

Предполагая, что точки хранятся в строках triangle, и точки не все лежат в одной строке, вы можете использовать:

weights = np.linalg.solve(triangle.T, point)

Вот пример.Я буду использовать модифицированную версию вашего triangle, чтобы точки не были в линии:

In [57]: triangle
Out[57]: 
array([[9, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

Используя тот же weights, вычислите point как средневзвешенное значение строк triangle:

In [58]: weights
Out[58]: array([ 1. ,  0.3, 20. ])

In [59]: point = np.average(triangle, weights=weights, axis=0)

In [60]: point
Out[60]: array([6.09859155, 6.67605634, 7.67605634])

Теперь переверните процесс: с учетом point и triangle найдите веса:

In [61]: w = np.linalg.solve(triangle.T, point)

In [62]: w
Out[62]: array([0.04694836, 0.01408451, 0.93896714])

Обратите внимание, что w нормализовано, поэтому его сумма равна 1Если мы нормализуем weights, мы видим, что оно соответствует w:

In [63]: weights / weights.sum()
Out[63]: array([0.04694836, 0.01408451, 0.93896714])
...