Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Racheengel от Апрель 11, 2016, 15:37



Название: Двумерные координаты на трехмерной плоскости
Отправлено: Racheengel от Апрель 11, 2016, 15:37
Всем привет,

каким образом можно получить двумерные координаты точек, принадлежащие плоскости в трехмерном пространстве?

Задача такая: есть точка в 3д-пространстве и нормаль к ней, соответственно есть уравнение плоскости в пространстве.
И есть другие точки, лежащие в пределах данной плоскости. Они также имеют 3д-координаты.

Вопрос в следующем: как получить для этих точек их двумерные координаты на плоскости?
Т.е. грубо говоря лежащая на плоскости точка A(x,y,z) должна стать A'(x',y') и т.д.

Центр координат на плоскости заранее неизвестен. Можно ли его определить, зная, что для некоторых точек есть численное соответствие между 3д и 2д координатами?


Название: Re: Двумерные координаты на трехмерной плоскости
Отправлено: ssoft от Апрель 11, 2016, 15:46
Здесь недостаточно условий.
Точка и нормаль определяют плоскость. Наверное эта точка является началом координат системы x',y' (или нет?). Куда направлены сами оси x' и y' ? Нужно как минимум центр, два вектора и условия для системы координат (правосторонняя/левосторонняя, прямоугольная декартова).


Название: Re: Двумерные координаты на трехмерной плоскости
Отправлено: Racheengel от Апрель 11, 2016, 16:43
Трехмерная система координат: стандартная прямоугольная, x направлена вглубь, y перпендикулярно, z вверх.
Двухмерная система координат: тоже прямоугольная, х - направлена вправо, y - вверх.

x',y' - это просто точка на плоскости, не обязательно начало координат.

В этом и проблема, что начало координат на плоскости - неизвестно.
Есть только несколько точек xyz, которым соответствуют x',y' на плоскости.
Можно ли каким-то образом на основе этой информации найти общее решение для любой точки xyz? Т.е. получить ее x',y' на плоскости?


Название: Re: Двумерные координаты на трехмерной плоскости
Отправлено: ssoft от Апрель 11, 2016, 17:04
Достаточно иметь три точки, не лежащие на одной прямой, чтобы построить матрицу преобразований из системы координат 1 в систему координат 2.

p * A = p'

p - координаты {x,y,z}, A - искомая матрица Aij, p1 - координаты {x', y', 0}

x * A00 + y * A10 + z * A20 = x'
x * A01 + y * A11 + z * A21 = y'
x * A02 + y * A12 + z * A22 = 0

Девять линейных уравнений, девять неизвестных Aij.


Название: Re: Двумерные координаты на трехмерной плоскости
Отправлено: Racheengel от Апрель 11, 2016, 17:27
Ок, спасибо, похоже на то, что нужно :)
Подскажете еще, чем можно было бы найти эти неизвестные? GSL, например?
Понимаю, что есть гугл, но честно говоря, не знаю, как точнее вопрос сформулировать...


Название: Re: Двумерные координаты на трехмерной плоскости
Отправлено: Igors от Апрель 11, 2016, 18:07
Код
C++ (Qt)
// матрица "из локальной в мир"
QMatrix4x4 BuildMatr( const QVector3D pt, const QVector3D & normal )
{
qsrand(0);
QVector3D axisZ = normal.normalized();
QVector3D axisX(qrand(), qrand(), qrand());
QVector3D axisY = QVector3D::crossProduct(axisZ, axizX).normalized();
axisX = QVector3D::crossProduct(axisY, axisZ);
 
QMatrix4x4 m;
m.setRow(0, axisX);
m.setRow(1, axisY);
m.setRow(2, axisZ);
m.setRow(3, QVector4D(pt, 1));
return m;
}
Инвертировав ее получите матрицу "из мира в локальную". Если ее применить к исходной точке - должно получиться (0, 0, 0). Если применить к точке(ам) лежащим в заданной плоскости - их локальные Z должны стать нулевыми. Если не лежат - то и Z будет ненулевое. Это пока все что можно выжать из сказанного Вами

Примечание: никогда не пользовался Qt матрицами, верю написанному в доке (row-major)