точки карты между двумя треугольниками в трехмерном пространстве

ИЗМЕНИТЬ

Не знаю, важно ли это, но углы треугольника назначения могут отличаться от исходных. Делает ли этот факт преобразование неаффинным? (я не уверен)

альтернативный текст

У меня есть два треугольника в трехмерном пространстве. Учитывая, что я знаю (x, y, z) точки в первом треугольнике, и я знаю векторы V1, V2, V3. Мне нужно найти точку (x',y',z'). Какое преобразование я должен сделать для точки (x, y, z) с векторами V1, V2, V3, чтобы получить эту преобразованную точку во втором треугольнике?

Спасибо за помощь !!!


person Agnius Vasiliauskas    schedule 23.09.2010    source источник
comment
Аффинные преобразования допускают переводы, и поэтому проблема, которую вы поднимаете с углами, сама по себе не играет роли. Линейные преобразования можно использовать для изменения формы, размера и ориентации треугольника без каких-либо реальных проблем. Аффинные преобразования необходимы, когда результирующее линейное преобразование помещает объект в неправильное положение в вашем векторном пространстве, и вам нужно изменить его положение. Я обновил свой ответ, чтобы можно было найти решение без применения каких-либо передовых методов.   -  person andand    schedule 26.09.2010


Ответы (6)


Вам нужно такое матричное преобразование T, что T X = X', где X — матрица, столбцы которой представляют собой координаты вершин первого треугольника, а X' — то же самое для второго треугольника. Умножение каждой стороны на обратную X дает T = X' X-1.

person Steve Emmerson    schedule 23.09.2010
comment
Это то, о чем я думал сначала, но когда я посмотрел на это, стало ясно, что проблема в том виде, в каком она представлена, недостаточно ограничена. Я считаю, что уникальное решение возможно после включения ограничений расстояния, но поиск этого уникального решения требует выпуклого программирования и не может быть решен с использованием описанного вами линейного метода. - person andand; 24.09.2010
comment
@andand Матричное преобразование переводит все три вершины в их аналоги. Это также линейное преобразование; поэтому любая точка внутри первого треугольника будет преобразована во внутреннюю часть второго таким образом, чтобы сохранялось пропорциональное расстояние от вершин. - person Steve Emmerson; 24.09.2010
comment
Предположим, что начало координат — это одна из внутренних точек первого треугольника, но не внутренняя точка второго треугольника. Этого нельзя добиться с помощью линейных преобразований; источник всегда сопоставляется с источником. Поставленная задача требует аффинного (линейного) преобразования, чтобы начало координат в домене можно было сопоставить с чем-то другим, а не с началом в диапазоне. - person andand; 24.09.2010
comment
@andand Ты прав. X и X 'в моем ответе должны быть составлены из векторов от центра масс каждого треугольника (COM) к его вершинам. Затем преобразование точки в треугольнике 1 включает: 1) вычитание COM первого треугольника; 2) применение Т; и 3) добавление вектора смещения от треугольника 1 COM к треугольнику 2 COM. - person Steve Emmerson; 24.09.2010

Я думаю, вы могли бы искать барицентрические координаты?

person tfinniga    schedule 23.09.2010
comment
+1 да. Найдите барицентрические координаты точки в исходном треугольнике, а затем найдите эти барицентрические координаты в целевом треугольнике. - person phkahler; 24.09.2010

проверить комментарии andand для теории

// Qt-код

QMatrix4x4 m;
QMatrix4x4 t1;
QMatrix4x4 t2;

QVector3D v1(0,0,0);
QVector3D v2(0,1,0);
QVector3D v3(1,0,0);
QVector3D v4 = v1 + QVector3D::crossProduct(v2-v1, v3-v1);

QVector3D v1p(0,0,2);
QVector3D v2p(0,3,2);
QVector3D v3p(1,0,1);
QVector3D v4p = v1p + QVector3D::crossProduct(v2p-v1p, v3p-v1p);

t1.setColumn(0, QVector4D(v1, 1));
t1.setColumn(1, QVector4D(v2, 1));
t1.setColumn(2, QVector4D(v3, 1));
t1.setColumn(3, QVector4D(v4, 1));

t2.setColumn(0, QVector4D(v1p, 1));
t2.setColumn(1, QVector4D(v2p, 1));
t2.setColumn(2, QVector4D(v3p, 1));
t2.setColumn(3, QVector4D(v4p, 1));

m = t2 * t1.inverted();

for(float i=0.0; i<2.5; i+=0.05)
{
    QVector4D p(0.2+i,i,0,1);
    QVector4D pp( m * p );

    glBegin(GL_LINE_STRIP);
    glColor4f(1,1,1,1);
    glVertex3d(p.x(), p.y(), p.z());

    glColor4f(1,0,1,1);
    glVertex3d(pp.x(), pp.y(), pp.z());
    glEnd();
}

И видео этого кода в действии: http://www.youtube.com/watch?v=yOU90pBoyZY

person chain    schedule 13.01.2011

Просто добавьте векторы к каждой точке. Точка + Вектор == новая точка. Это в основном противоположно созданию Вектора: V1 == (x1'-x1, y1'-y1, z1'-z1), поэтому (x1', y1', z1') == (x1+ V1x, y1+v1y, z1+V1z).

person KeithS    schedule 23.09.2010
comment
Я не думаю, что это отвечает на вопрос. Я думаю, что OP означает, что (x, y, z) — произвольная точка в треугольнике. - person Colin Fine; 23.09.2010
comment
Да, я тоже чувствую, что это не решение, потому что на точку должны влиять ВСЕ три вектора V1, V2, V3 (потому что все вершины меняются), а не только один V1. - person Agnius Vasiliauskas; 24.09.2010

Позволять

 x = αx1 + βx2 + γx3 

Тогда x' = αx1' + βx2' + γx3'.

x' = α(x1+V1) + β(x2+V2) + γ(x3+V3)
person Colin Fine    schedule 23.09.2010
comment
Это трехмерное линейное преобразование. Задача требует трехмерного аффинного преобразования. - person andand; 24.09.2010
comment
Я не совсем понял. Вы имели в виду: x' = α(x1+V1.x) + β(x2+V2.x) + γ(x3+V3.x) ?? Также Как рассчитать α,β,γ? - person Agnius Vasiliauskas; 24.09.2010

person    schedule
comment
Спасибо за глубокий анализ проблемы. - person Agnius Vasiliauskas; 26.09.2010
comment
Отличный ответ. Я застрял в точке, где у меня было 9 уравнений с 12 неизвестными, когда я нашел ваш пост. У меня есть вопрос: почему y и y' работают как четвертая точка? Я имею в виду, что это не независимый, одинаково хорошо вы могли бы использовать центральные точки треугольников y = mean(x,y,z) (хорошо, хорошо, возможно, вы не могли бы, но я не не понимаю, почему перекрестный продукт лучше) - person Jakub M.; 25.01.2013
comment
Вы можете использовать любой вектор, который линейно не зависит от катетов треугольника. y и y', являющиеся перекрестными произведениями других сторон, удовлетворяют этому ограничению и, по сути, создают симплекс. Использование среднего создает линейно зависимый вектор, поэтому M не будет иметь обратного. - person andand; 25.01.2013