Как получить вершины, которые составляют меньший треугольник с точки зрения барицентрических координат? - PullRequest
0 голосов
/ 28 мая 2019

эта запись обсуждает преобразование из барицентрических координат в декартовы.

enter image description here

кажется, что фигура (fig_1) только иллюстрирует 3 балла

B (0,0,1), A (0,1,0), C (1,0,0)

Я пытаюсь понять преобразование, вот мой код

x_inner = np.array([0.375, 0.5  , 0.625, 0.375])
y_inner = np.array([0.21650635, 0.4330127 , 0.21650635, 0.21650635])
x_outer = np.array([0. , 0.5, 1. , 0. ])
y_outer = np.array([0.       , 0.8660254, 0.       , 0.       ])
plt.plot(x_outer,y_outer)
plt.plot(x_inner,y_inner,c='tab:orange')
plt.scatter(x_outer, y_outer)
plt.scatter(x_inner, y_inner)

значения составляют массив координат взяты из оригинального post .

вот вывод.

enter image description here

внутренний оранжевый треугольник состоит из 3 вершин, которые соответствуют точкам (1 / 4,1 / 4,1 / 2), (1 / 4,1 / 2,1/4), (1 / 2,1 / 4,1 / 4) в исходных барицентрических координатах.

вопрос в том, как получить меньший треугольник, как 1/10 оранжевого.

ps: извините, что fig_1 не соответствует истинным значениям.

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Рассмотрим треугольник ABC и масштабный коэффициент r> 0.

Центром ABC является G := (A + B + C) / 3. Мы хотим выполнить равномерное масштабирование с помощью r, чтобы фиксировать G. Это преобразование задается как h(V) := G + (V - G) * r.

Чтобы получить масштабированный треугольник A'B'C ', мы применяем h к каждой из вершин ABC:

A' := h(A) = A * (1+2*r)/3 + B * (1-r)/3   + C * (1-r)/3
B' := h(B) = A * (1-r)/3   + B * (1+2*r)/3 + C * (1-r)/3
C' := h(C) = A * (1-r)/3   + B * (1-r)/3   + C * (1+2*r)/3

Коэффициенты выше являются барицентрическими координатами.

В случае вашего внутреннего треугольника r = 1 / 4.

1 голос
/ 28 мая 2019

Пусть мы хотим построить маленький треугольник, похожий на большой, с центром в том же центре.Центроид является точкой медианного пересечения, он делит их в соотношении 2:1 и имеет BC (барицентрические координаты) (1/3, 1/3, 1/3).

Вершина такого маленького треугольника в первой медиане имеет BC, как (g,f,f), где g+f+f=1, во второй медиане (f,g,f) и (f,f,g) в третьей.Мы видим, что для g=1/3 размер треугольника равен нулю (коэффициент cf= 0), для g=1 треугольник равен большому треугольнику (cf = 0).

Для промежуточных значений достаточно выполнить линейную интерполяцию

 cf = (g - 1/3) * 3/2 = 3/2 * g - 1/2 = (3 * g - 1) / 2
 vice versa
 g = (cf + 1/2) * 2/3 = (2 * cf + 1) / 3
 f = (1 - g) / 2

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

cf = 1/2
g = 2/3
f = 1/6
(2/3, 1/6, 1/6)     (1/6, 2/3, 1/6)     (1/6, 1/6, 2/3)

Обратите внимание, что для g<1/3 мы получим маленький треугольник с инвертированной ориентацией (ср. Минус)

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