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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2010, 09:52   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Алгоритм проектирования 3D на 2D

Всем привет!
Экспериментирую с Аттракторами

Вот что у меня получилось. Но хочу посмотреть на него в объёме.
Ну, т.е.мне нудна функция, которая преобразовывала-бы 3-х мерные координаты в 2-х мерные в зависимосте от вертикального и горизонтального углов.
Написал шаблон функции
Код:
function point3DTo2D(const X, Y, Z: integer; const horAngle,
  vertAngle: smallInt): tPoint;
begin
   result.X := round(X * cos(horAngle * pi/180) + Z * cos(vertAngle * pi/180));
   result.Y :=  round(Y * sin(vertAngle * pi/180) + Z * sin(horAngle * pi/180));

   result.X := result.X + fieldCenter.X;
   result.Y := result.Y + fieldCenter.Y;
end;
Ну не получается в общем, не силён я в пространственном мышлении. Помогите а кому не трудно.

3DTesting.rar - Это просто наработка временная
Сам проект в Attractor3D.rar
Вложения
Тип файла: rar 3DTesting.rar (693.1 Кб, 36 просмотров)
Тип файла: rar Attractor3D.rar (451.4 Кб, 31 просмотров)
Altera вне форума Ответить с цитированием
Старый 25.06.2010, 12:06   #2
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,033
По умолчанию

Это проектирование с 3д на 2д с перспективой(n-ее коэффициент).
x`= 0.5 * screen_width + N * x/z
y`= 0.5 * screen_width + N * y/z

Но у тебя, насколько я понял у тебя все угловой системе координат?
Levsha100 вне форума Ответить с цитированием
Старый 25.06.2010, 13:11   #3
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Да, я хочу, чтобы фигуру можно было бы вращать в 2-х измерениях, по вертелале и по горизонтале.
Altera вне форума Ответить с цитированием
Старый 25.06.2010, 22:48   #4
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

http://programmersforum.ru/showthread.php?t=97522
Полярная система координат!
Угол по горизонтали есть широта(latitude = [0, 2*pi)) а угол по вертикали есть долгота(longitude = [0, pi])
latitude - угол фи
longitude - угол тета

Код:
p = sqrt(x*x+y*y+z*z);
latitude = atan2(y,x);
longitude = atan2(sqrt(x*x+y*y),z);

latitude += deltaX;
longitude += deltaY;

if(latitude > 2*pi) latitude = latitude - 2*pi;
f(latitude < 0) latitude = latitude + 2*pi;
if(longitude > pi) longitude = longitude - pi;
if(longitude < 0) longitude = longitude + pi;

x = p*cos(latitude)*sin(longitude);
y = p*sin(latitude)*sin(longitude);
z = p*cos(longitude);
И дальше все просто, по формулам которые есть на картинках вычисляем широту и долготу для каждой точки и меняем ее на опр. значение. А потом делаем обратную перегонку в x,y,z и проецируем на экран.

Возможно можно проще, надо подумать...

Последний раз редактировалось Kostia; 25.06.2010 в 22:51.
Kostia вне форума Ответить с цитированием
Старый 25.06.2010, 23:47   #5
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Спасибо, Kostia, буду разбираться. Ну просто очень хочется реализовать алгоритм.
Altera вне форума Ответить с цитированием
Старый 26.06.2010, 08:58   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Аттрактор в 3D с исходниками
alexBlack вне форума Ответить с цитированием
Старый 27.06.2010, 09:04   #7
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
Замечательно. Попробую разобраться в исходнике!
Altera вне форума Ответить с цитированием
Старый 29.06.2010, 09:57   #8
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Блин, всё равно не получается. Проблема в переводе координат из декартовой системы в сферическую.
Там четверти надо учитывать. Вроде сделал всё как надо, но нормально не получается. По горизонтали крутит ещё более менее неплохо а вот по вертикале, просто метаморфозы какие-то....

Функция получения четверти
Код:
function getQuarter(const X, Y: real): byte;
begin
  if (X >= 0) then
  begin
    if (Y >= 0) then
      result := 1
    else
    if (Y < 0) then
      result := 4;
  end
  else
  if (X < 0) then
  begin
    if (Y > 0) then
      result := 2
    else
    if (Y <= 0) then
      result := 3;
  end;
end;
А вот перевода из декартовой системы в сферическую
Код:
function cartesToSpher(const X, Y, Z: real): tSpherPointRec;
begin
  result.r := sqrt(X * X + Y * Y + Z * Z);

  if result.r = 0 then
  begin
    result.OAngle := 0;
    result.FAngle := 0;
  end
  else
  begin
    result.OAngle := arccos(Z / result.r);

    if X = 0 then
      result.FAngle := pi / 2
    else
      result.FAngle := arcTan(Y / X);
  end;
end;
Проблема в том, что если, например, Y и X отрицательные, то arcTan(Y / X) вернёт тоже значение что и для положительных. С arcCos аналогичная туёвина.
Вложения
Тип файла: rar Project3D.rar (331.0 Кб, 20 просмотров)
Altera вне форума Ответить с цитированием
Старый 29.06.2010, 11:38   #9
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Попробовал разобраться, но быстро запутался в математических выкладках. С матрицами все получается гораздо проще. В архиве простой пример вращения куба (работают две клавиши - right, up). Если отбросить матричные преобразования, то кода всего 90 строк. Можно, конечно, развернуть умножения матриц и получить явные формулы, но лучше сразу привыкать к матрицам. Так будет проще переход на DirectX/OpenGL
Вложения
Тип файла: rar test3D.rar (172.7 Кб, 32 просмотров)
alexBlack вне форума Ответить с цитированием
Старый 29.06.2010, 12:33   #10
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
Попробовал разобраться, но быстро запутался в математических выкладках. С матрицами все получается гораздо проще. В архиве простой пример вращения куба (работают две клавиши - right, up). Если отбросить матричные преобразования, то кода всего 90 строк. Можно, конечно, развернуть умножения матриц и получить явные формулы, но лучше сразу привыкать к матрицам. Так будет проще переход на DirectX/OpenGL
Круто, но как-то двигается он не правильно: если куб перевернуть, то он крутится не вправо а влево. При запуске, когда куб в исходной положении он, при нажатии "вправо", крутится почему-то по часовой стрелке а не по горизонтале, к тому же с матрицами как-то возни много. Попробую конечно азобраться...

Вот по вертикале всегда вращается правильно

Помое-му ничего сложного в моих математических выкладках нету. Вот что не понятного например?

Последний раз редактировалось Altera; 29.06.2010 в 12:37.
Altera вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описание и обсуждение шаблонов проектирования (паттерны) atomicxp Общие вопросы по программированию, компьютерный форум 35 20.01.2018 21:42
использование платного ПО для проектирования Domanoff Свободное общение 4 11.06.2010 13:33
Волновой алгоритм (алгоритм Ли) MrRockchip Общие вопросы C/C++ 4 10.05.2010 13:26
Case инструменты проектирования. Levsha100 Свободное общение 5 06.12.2009 03:12
Занесение данных в StringGrid на этапе проектирования формы program123 Компоненты Delphi 2 16.02.2009 23:00