Russian Qt Forum
Ноябрь 22, 2024, 18:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Двумерные координаты на трехмерной плоскости  (Прочитано 5136 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« : Апрель 11, 2016, 15:37 »

Всем привет,

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

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

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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #1 : Апрель 11, 2016, 15:46 »

Здесь недостаточно условий.
Точка и нормаль определяют плоскость. Наверное эта точка является началом координат системы x',y' (или нет?). Куда направлены сами оси x' и y' ? Нужно как минимум центр, два вектора и условия для системы координат (правосторонняя/левосторонняя, прямоугольная декартова).
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Апрель 11, 2016, 16:43 »

Трехмерная система координат: стандартная прямоугольная, x направлена вглубь, y перпендикулярно, z вверх.
Двухмерная система координат: тоже прямоугольная, х - направлена вправо, y - вверх.

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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #3 : Апрель 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.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Апрель 11, 2016, 17:27 »

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 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)
« Последнее редактирование: Апрель 11, 2016, 18:11 от Igors » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 23.