https://habr.com/ru/post/471194/- Python
- Алгоритмы
- Математика
Привет.
Наверняка всем доводилось быть свидетелями оценки на глазок степени сходства ребенка с родителями: что-нибудь типа «вылитый папа, но на маму тоже похож!!!»

(
взято отсюда)
Как в примере на изображении, можно оценить степень похожести в процентах. Можно задействовать еще родственников, для более точного описания лица малыша в виде взвешенной суммы лиц родни…
И будет это выглядеть и восприниматься вполне естественно для «обычного» человека, не связанного с антропологией, или, например, криминалистикой. Для профессионала в области анализа и распознавания лиц, человеческое лицо представляется, скорее, набором параметров. То есть, точкой (набор координат) в некотором пространстве с базисом (оси, соответствующие параметрам). И если описывать лицо ребенка в сравнении с его родственниками, то скорее всего, точка, соответствующая лицу ребенка окажется в этом пространстве параметров внутри выпуклой оболочки облака точек, соответствующих лицам ближайших родственников (но это не точно).
Собственное, к чему я это все… Эти два подхода к описанию лиц соответствуют двум системам координат:
- барицентрической, описание точки в пространстве (в нашем примере: лица) через взвешенную смесь других точек;
- аффинной, описание точки в пространстве через координаты в некотором базисе.
Так что же такое барицентрические координаты?
Пусть в

-мерном пространстве заданы

точка

с радиус-векторами

,

. Причем, ни одна из точек не лежит в линейной оболочке радиус-векторов остальных точек… Проще говоря, совсем просто: пусть эти точки образуют фигуру, которую нельзя полноценно представить в пространстве с размерностью меньше

.
В случае одномерного пространства (линия), нам необходимы 2 не совпадающие точки, случае двумерного пространства — невырожденный треугольник, в случае трехмерного — тетраэдр.
Тогда любая точка пространства

может быть представлена радиус-вектором

:
Набор

и есть барицентрические координаты.
Чем барицентрические координаты лучше/хуже аффинных?
Пожалуй, начнем с относительных недостатков:
- в барицентрическом представлении нам необходимо на одну координату больше, чем в аффинном;
- расстояние между точками, заданными барицентрически, нельзя напрямую вычислять в этих координатах.
Отчасти первый недостаток компенсируется тем, что не смотря на необходимость использования

барицентрической координаты при описании точки в

-мерном пространстве, количество степеней не повышается. Барицентрические координаты, определенные в формуле (1), связаны соотношением:
Что касается второго недостатка, если есть необходимость вычисления расстояния между точками, представленными барицентрически, то имеет смысл посчитать скалярные произведения

и использовать аналог расстояния Махаланобиса.
Каковы же бонусы от использования барицентрических координат?
- Барицентрические координаты инвариантны к аффинным преобразованиям пространства. Это свойство используется, например, для линейной интерполяции в компьютерной графике. Пусть в вершинах треугольного элемента поверхности определены текстурные координаты
и нормали
(
), тогда каждая точка этого участка поверхности будет обладать барицентрическими координатами
, ее текстурные координаты
и нормаль
могут быть вычислены как:


- По барицентрическим координатам легко определить, принадлежит ли точка
части пространства, ограниченной многогранником с вершинами
: это выполняется только в том случае, если
. Равенство i-й барицентрической координаты 1 означает, что точка
совпадает с
. Если несколько барицентричесих координат равны 0, то это означает, что точка принадлежит подпространству, натянутому на радиус-вектора остальных точек, соответствующие координаты которых больше 0.
Наверное, они очень сложно вычисляются?
Не сложнее, чем любое линейное преобразование системы координат. Потому что по сути вычисление барицентрических координат таковым преобразованием и является.
Перепишем радиус-вектора точек в следующем виде:

, где

— радус-вектора в системе координат с центром в точке

.
Тогда формулу (1) можно переписать в следующем виде:
Раскроем скобки в сумме:
Согласно свойства (2):
Соответственно:

,
где
Учитывая (2), ограничимся вычислением первых n барицентрических координат. Представим переход в барицентрические координаты как линейное преобразование:

,
где

— вектор n барицентрических координат (кроме последней),

— матрица преобразования.
Учитывая свойства барицентрического представления, если в качестве

подставить один из векторов

(

), то мы получим вектор с нулевыми компонентами, кроме одной i-й, которая будет равна 1.
Если матрицу

умножить на матрицу

, составленную по столбцам из

, то мы должны получить единичную матрицу (матрицу с единицами на главной диагонали и нулями в остальных элементах):

,
где

,

— единичная матрица (

— символ Кронекера: 1, если

, иначе — 0).
Из (10) находим

:
Таким образом, имея набор из точек с радиус-векторами

,

мы можем вычислить матрицу для преобразования в барицентрические координаты:
Используя эту матрицу, мы можем получить первые

барицентрических координат точки

с радиус-вектором

:
Вновь воспользовавшись соотношением (2), получим последнюю барицентрическую координату:
Заключение
Может с первого взгляда барицентрика и кажется неуклюжей и сложной. Но на самом деле, это очень удобный и незаменимый во многих задачах инструмент, к которому довольно быстро привыкаешь. Потому, что тут нет никакой магии, это линейная алгебра в чистом виде!