Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2012, 01:03   #1
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию Вопрос по математике

Здравствуйте!
Это конечно форум программистов, но полагаю, что все программисты разбираются в математике.
Сразу перейду к делу. Есть некоторое трехмерное пространство точек. В нем существует некоторая плоскость. Необходимо точки этой плоскости перевести из 3D в 2D. Не просто сделать проекцию на две оставшиеся оси а перейти к новому пространству. Как я понял, мне необходимо найти наименьшее собственное число плоскости и соответствующий ему вектор, который и станет, новой осью в новой системе координат, так как этот вектор должен показывать направление пространства. Извините за невнятное изложение мыслей, не силен в математике.
Буду благодарен за любые высказанные соображения по этому поводу. Прошу объяснить как можно популярнее.
Заранее спасибо.
Leiph вне форума Ответить с цитированием
Старый 12.06.2012, 01:48   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Я понимаю нужно перспективное отображение плоскости на эээ... монитор xD?
Или вы хотите чтобы отображение точек пространства шло на плоскость и потом показать это все на экране монитора. Что впрочем можно свести к первой задачи за счет преобразований над пространством.

Кажись понял. В общем если плоскость не сложная, а обычный прямоугольник. То нужно развернуть все пространство таким образом, чтобы эта плоскость встала в x, y, z = 0 с помощью матричных преобразований каждой точки в пространстве(матрица поворота, переноса, масшатбирования). Ну а далее, если требуется перспективное отображение на эту плоскость, то ее можно масштабировать в (-1, -1, 1, 1) для простоты, а для ортогональной проекции можно все оставить как есть и построить матрицы отображений

Код:
inline const Matrix4x4f GLPerspective(float fov, float aspect, float zNear, float zFar)
{
	const float f = 1 / tanf(fov * math_radians / 2),
	            A = (zFar + zNear) / (zNear - zFar),
	            B = (2 * zFar * zNear) / (zNear - zFar);

	return Matrix4x4f(f / aspect, 0, 0, 0,
					  0, f, 0, 0,
					  0, 0, A, B,
					  0, 0, -1, 0);
}

inline const Matrix4x4f GLOrtho(float left, float right, float bottom, float top, float zNear, float zFar)
{
	const float tx = - (right + left) / (right - left),
	            ty = - (top + bottom) / (top - bottom),
	            tz = - (zFar + zNear) / (zFar - zNear);

	return Matrix4x4f(2 / (right - left), 0, 0, tx,
					  0, 2 / (top - bottom), 0, ty,
					  0, 0, -2 / (zFar - zNear), tz,
					  0, 0, 0, 1);
}
Далее после всех вращений пространства каждая точка пространства имеет координаты v' = (x', y', z', w' = 1)(четвертую координату добавляем только после преобразований над пространством), а плоскость есть наш монитор =). v'' = v' * ModelViewProjectionMatrix, а конечная координата точки v''' = v'' / v''.w. v'''.x и v'''.y и должно будет быть отображением точки в пространстве на вашу плоскость и все это можно отобразить на мониторе xD. Если не наврал.

Последний раз редактировалось Kostia; 12.06.2012 в 02:39.
Kostia вне форума Ответить с цитированием
Старый 12.06.2012, 02:17   #3
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию

В трехмерном пространстве найдена некоторая плоскость и необходимо точки принадлежащие этой плоскости переместить в двумерное пространство. Каждой точке плоскости с координатами x,y,z по какому то правилу сопоставить новые координаты x,y. Вот в чем задача.
Leiph вне форума Ответить с цитированием
Старый 12.06.2012, 02:33   #4
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

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

Мы, к сожалению, проходили только переход в полярную и ортогональные системы - я помню там все это как-то очень хитро и мудрено было...Может быть, в Интернете есть что-то подходящее - пока я нашла, к сожалению, только переход от параметрической системы (там где синус и косинус) в декартовую систему.... Если бы Вы задали это вопрос пораньше, могла бы у преподавателей спросить - аж самой интересно....

PS Я попытаюсь найти что-нибудь для Вас, может попадется пример...

Вот есть в главе Преобразования координат в 2D
http://gamedev3d.narod.ru/book1/chap1/chap1.html
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan

Последний раз редактировалось Blondy; 12.06.2012 в 02:42.
Blondy вне форума Ответить с цитированием
Старый 12.06.2012, 02:38   #5
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Если точки уже принадлежат плоскости, то проблем в отображении нет. Находите нормаль к плоскости, есть вектор (0,0,1), находите углы вращения, чтобы направление нормали совпало с (0,0,1), множите точки на плоскости на соответствующие матрицы поворота, а затем переносите новые точки в (x', y', 0), так чтобы они уместились на мониторе, если требуется.

Последний раз редактировалось Kostia; 12.06.2012 в 02:46.
Kostia вне форума Ответить с цитированием
Старый 12.06.2012, 03:01   #6
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию

Kostia, я понял вашу идею. Спасибо. Думаю попробую. А не подскажете есть ли в OpenGL средство позволяющее добраться до координат точек после применения к ним различных поворотов. Если вращать некий предмет функцией glRotatef, то в массиве изначальных координат ведь ничего не измениться. А как добыть координаты точек после применения вращения?
Извините за невнятность, но думаю Вы меня поймете)
Leiph вне форума Ответить с цитированием
Старый 12.06.2012, 03:11   #7
Leiph
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 20
По умолчанию

Blondy, спасибо за участие, но в статье речь идет о преобразовании координат не к 2D ,а так сказать, внутри 2D. Как растянуть сжать или повернуть точки двумерного пространства.
Leiph вне форума Ответить с цитированием
Старый 12.06.2012, 03:30   #8
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Leiph, нужно самостоятельно множить точки на матрицы, если требуется узнать их новые координаты. Можно воспользоваться уже готовой библиотекой opengl mathematics, http://habrahabr.ru/post/138731/
PS: в статье которую указала Blondy, написано все верно, там только нет формулы непосредственного отображения 3D точек в соответствии с матрицей проекции.
Kostia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программы по математике novivirus Софт 0 30.05.2011 06:56
Задача по прикладнойм математике Bustle Свободное общение 1 01.02.2011 23:55
Справочник по математике rzn1 Софт 0 13.04.2010 21:31
Графика в математике 5. Dirt Фриланс 6 05.01.2010 16:49
пара функций по математике. blackstersl Свободное общение 5 21.04.2009 15:01