Краткий ответ: это сложнее, чем кажется на первый взгляд, и природа ограничений, которые вы накладываете на проблему, требует более сложных приемов, чем вы думаете.
Итак, для пояснения я собираюсь немного изменить вашу запись. Рассмотрим 3 пары векторов (они соответствуют вашим вершинам двух треугольников в вашей задаче):
<b><i>u</i></b> = <u<sub>0</sub>, u<sub>1</sub>, u<sub>2</sub>, 1>
<b><i>u'</i></b> = <u<sub>0</sub>', u<sub>1</sub>', u<sub>2</sub>', 1>
<b><i>v</i></b> = <v<sub>0</sub>, v<sub>1</sub>, v<sub>2</sub>, 1>
<b><i>v'</i></b> = <v<sub>0</sub>', v<sub>1</sub>', v<sub>2</sub>', 1>
<b><i>w</i></b> = <w<sub>0</sub>, w<sub>1</sub>, w<sub>2</sub>, 1>
<b><i>w'</i></b> = <w<sub>0</sub>', w<sub>1</sub>', w<sub>2</sub>', 1>
Обычно ваша проблема решается путем идентификации линейного преобразования формы:
|a<sub>0,0</sub> a<sub>0,1</sub> a<sub>0,2</sub> a<sub>0,3</sub>|
A = |a<sub>1,0</sub> a<sub>1,1</sub> a<sub>1,2</sub> a<sub>1,3</sub>|
|a<sub>2,0</sub> a<sub>2,1</sub> a<sub>2,2</sub> a<sub>2,3</sub>|
|0<sub> </sub> 0<sub> </sub> 0<sub> </sub> 1<sub> </sub>|
такой, что:
<b>A<i>u</i></b> = <b><i>u'</i></b>
<b>A<i>v</i></b> = <b><i>v'</i></b>
<b>A<i>w</i></b> = <b><i>w'</i></b>
Эта формулировка необходима, потому что преобразование кажется трехмерным аффинным преобразованием, а не трехмерным линейным преобразованием. Если бы это было линейное преобразование, любой треугольник, содержащий начало координат, обязательно отображался бы в другой треугольник, содержащий начало координат. Расширение до 4-мерного пространства позволяет использовать 4-D линейное преобразование для выполнения 3-D аффинного преобразования.
Тем не менее, первое, что следует отметить, это то, что эта проблема недооценена (9 уравнений с 12 неизвестными); нет уникального решения. Их на самом деле бесконечно много. Тем не менее, ваша проблема несколько более ограничена, так что есть некоторая надежда. У вас есть дополнительные ограничения, заданные вектором
<b><i>p</i></b> = <p<sub>0</sub>, p<sub>1</sub>, p<sub>2</sub>, 1>
найти
<b>A<i>p</i></b> = <b><i>p'</i></b> = <p<sub>0</sub>', p<sub>1</sub>', p<sub>2</sub>', 1>
такой, что (используя ваши векторы определения a , b и c )
|<b><i>u</b></i> - <b><i>p</b></i>| |<b><i>u'</b></i> - <b><i>p'</b></i>|
------- = ---------
|<b><i>u</b></i> - <b><i>a</b></i>| |<b><i>u'</b></i> - <b>A<i>a</b></i>|
|<b><i>v</b></i> - <b><i>p</b></i>| |<b><i>v'</b></i> - <b><i>p'</b></i>|
------- = ---------
|<b><i>v</b></i> - <b><i>b</b></i>| |<b><i>v'</b></i> - <b>A<i>b</b></i>|
|<b><i>w</b></i> - <b><i>p</b></i>| |<b><i>w'</b></i> - <b><i>p'</b></i>|
------- = ---------
|<b><i>w</b></i> - <b><i>c</b></i>| |<b><i>w'</b></i> - <b>A<i>c</b></i>|
Хотя это создает дополнительное ограничение для вашей проблемы, оно меняет его с того, которое можно легко решить с помощью линейных методов, на то, которое требует выпуклого программирования для поиска уникального решения.
Тем не менее, вот некоторые возможные подходы:
- Для решения проблемы используйте выпуклое программирование. Хотя решить их труднее, чем линейные, на самом деле их не так сложно решить.
- Вернитесь к 2D-случаю, а не к 3D-случаю. Это можно сделать, не прибегая к нелинейным ограничениям, накладываемым этими измерениями расстояния.
- Выберите четвертую точку и вместо работы с треугольниками работайте над тетраэдрами. Это снова удаляет нелинейность из задачи.
ОБНОВЛЕНИЕ: Я задумался над этим и нашел способ генерировать правильное аффинное преобразование без использования выпуклого программирования. Это можно сделать, генерируя четвертую вершину для каждого из треугольников, называемых <b><i>y</b></i>
и <b><i>y'</b></i>
:
<b><i>y</b></i> = <b><i>u</b></i> + (<b><i>v</b></i>-<b><i>u</b></i>)×(<b><i>w</b></i>-<b><i>u</b></i>)
<b><i>y'</b></i> = <b><i>u'</b></i> + (<b><i>v'</b></i>-<b><i>u'</b></i>)×(<b><i>w'</b></i>-<b><i>u'</b></i>)
, где ×
- это трехмерное перекрестное произведение двух векторов (т. Е. Пропустите конечную 1 в каждом векторе; но не забудьте добавить 1 к y и y ', как только вы их вычислите). Оттуда вы можете применить стандартную технику создания матриц M и M 'из векторов столбцов:
<b>M</b> = <<b><i>u</b></i>, <b><i>v</b></i>, <b><i>w</b></i>, <b><i>y</b></i>>
<b>M'</b> = <<b><i>u'</b></i>, <b><i>v'</b></i>, <b><i>w'</b></i>, <b><i>y'</b></i>>
и используйте метод, предложенный Стивом Эммерсоном (в 4-D, а не 3-D):
<b>AM</b> = <b>M'</b>
<b>AMM</b><sup>-1</sup> = <b>M'M</b><sup>-1</sup>
<b>A</b> = <b>M'M</b><sup>-1</sup>