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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2009, 20:08   #1
T_a_m_a_r_a_
Новичок
Джуниор
 
Регистрация: 16.01.2009
Сообщений: 2
По умолчанию курсовая, трёхмерные кубики с картинками (С++)

Мне нужно написать курсовую на c++ используя WinAPI. Курсовая трехмерные кубики с картинками.
Нужно:
1. Используя координаты такого типа
Это координаты вершин
A[0][0]=-100; A[0][1]=100; A[0][2]=-100; A[0][3]=1;
A[1][0]=100; A[1][1]=100; A[1][2]=-100; A[1][3]=1;
A[2][0]=100; A[2][1]=100; A[2][2]=100; A[2][3]=1;
A[3][0]=-100; A[3][1]=100; A[3][2]=100; A[3][3]=1;
A[10][0]=-100; A[10][1]=-100; A[10][2]=-100; A[10][3]=1;
A[15][0]=100; A[15][1]=-100; A[15][2]=-100; A[15][3]=1;
A[20][0]=100; A[20][1]=-100; A[20][2]=100; A[20][3]=1;
A[25][0]=-100; A[25][1]=-100; A[25][2]=100; A[25][3]=1;
как понять эти координаты?
Здесь рисует куб, но выглядит он не очень (верхняя крышка в виде трапеции), надо сделать её параллелограммом. Рисуем соединяя вершины, образуя грани.
E[0][0]=3; E[0][1]=0;
E[1][0]=0; E[1][1]=1;
E[2][0]=1; E[2][1]=2;
E[3][0]=2; E[3][1]=3;
E[4][0]=3; E[4][1]=25;
E[5][0]=2; E[5][1]=20;
E[6][0]=1; E[6][1]=15;
E[7][0]=0; E[7][1]=10;
E[8][0]=25; E[8][1]=10;
E[9][0]=10; E[9][1]=15;
E[10][0]=15; E[10][1]=20;
E[11][0]=20; E[11][1]=25;
Как с помощью них нарисовать нужный нам куб?
2. И нарисую я кубик, и как мне к нему приклеить картинки. Загрузить я их могу. Как исказить изображение чтобы, оно стало параллелограммом(StretchBlt-?).
T_a_m_a_r_a_ вне форума Ответить с цитированием
Старый 16.01.2009, 21:41   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

Цитата:
Сообщение от T_a_m_a_r_a_ Посмотреть сообщение
как понять эти координаты?
Это вероятно так называемые однородные координаты А(x,y,z,1)
Цитата:
Сообщение от T_a_m_a_r_a_ Посмотреть сообщение
Как с помощью них нарисовать нужный нам куб?
Почитайте литературу про преобразования в трехмерном пространстве.
Например, посмотрите в книге Шикина и Борескова (названия к сожалению не помню).
Для отсечения невидимых граней самый простой алгоритм z-буфера.
Цитата:
Сообщение от T_a_m_a_r_a_ Посмотреть сообщение
2. И нарисую я кубик, и как мне к нему приклеить картинки. Загрузить я их могу. Как исказить изображение чтобы, оно стало параллелограммом(StretchBlt-?).
Тут тоже не так всё просто. Один из вариантов:
"Сканируем" горизонтальными линиями грани куба. Для каждой точки этой линии находим соответствующую точку в битмапе и выводим пиксель соответствующего цвета. И так закрашиваем каждую грань. Тоже в литературе должен быть описан. Двумя словами так это всё не опишешь
pu4koff вне форума Ответить с цитированием
Старый 20.01.2009, 22:21   #3
T_a_m_a_r_a_
Новичок
Джуниор
 
Регистрация: 16.01.2009
Сообщений: 2
По умолчанию

То что ты написал(pu4koff), это метод построчного сканирования. Я искала в интернете. Но не смогла найти код, хотя бы примерный код на си++(нужно без использования классов).
1. Как вообще просканировать куб по линиям? С помощью каких функций?
2. Есть ли программный код этого метода? Если да то где его взять?
3. нужно ли использовать следующую функцию?
Использование GetDIBits

Приведённый в этой статье код использует GetDIBits, поэтому работает довольно быстро, так как использует 32-битное представление битмапа. Все операции производятся в локальной памяти в отличие от медленных вызовов API функций GetPixel и BitBlt.

pBGR MyGetDibBits(HDC hdcSrc, HBITMAP hBmpSrc, int nx, int ny)
{
BITMAPINFO bi;
BOOL bRes;
pBGR buf;

bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = nx;
bi.bmiHeader.biHeight = - ny;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = nx * 4 * ny;
bi.bmiHeader.biClrUsed = 0;
bi.bmiHeader.biClrImportant = 0;

buf = (pBGR) malloc(nx * 4 * ny);
bRes = GetDIBits(hdcSrc, hBmpSrc, 0, ny, buf, &bi,
DIB_RGB_COLORS);
if (!bRes) {
free(buf);
buf = 0;
}
return buf;
}
4. Читала "компьютерная графика. Полигональные модели" - Шикина, Борескова. Там описана процедура вставки отрезка в упорядоченный список отрезков текущей строки.(Вариант построчного сканирования: метод S-буфера). Для каждой строки экрана поддерживается список отрезков граней, задающий фактически для каждого пиксела видимую в этом пикселе грань. Но суть в том, что пример пограммы написан с использованием классов, а мой препод настоятельно рекомендовал классы не использовать.
4.1 Можно ли как-нибудь реализовать без классов. И как?
4.2 Если честно этот код мне немного непонятен.
5. Если можно скиньте какую-нибудь ссылочку, где можно еще почитать?
T_a_m_a_r_a_ вне форума Ответить с цитированием
Старый 21.01.2009, 16:22   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

Я уже не помню где я искал инфу в своё время. Только я делал без текстур. Только с освещением было дело. Возможно на www.algolist.ru что-то было про это.

3D модели (в данном случае кубы) состоят из полигонов. Для простоты возьмём полигон, состоящий из 3 рёбер, соединяющих 3 вершины. Треугольный в общем.
Для каждой вершины даны координаты в 3D пространстве. Расчитываем для них экранные 2D координаты. Сортируем их по возрастанию по экранной координате y. Так у нас точка A будет самая верхняя, точка C - самая нижняя. B - по середине. горизонтальной линией, проходящей через точку B разбиваем этот треугольник на 2: ABO и CBO см. рисунок.
Для каждой точки находим соответствующие им координаты на текстуре. Допустим вершине A соответствует пиксель [10;5] на картинке и т.д.
Дальше по отдельности проходим по этим двум треугольникам горизонтальными сканирующими линиями и посредством интерполяции находим соответствие каждой из точек треугольника координаты текстуры.
примерный код:
x.screen - координата вершины x на экране
Код:
вершина a,b,c;
float dx1,dx2, x1, x2, dtx1, dty1, dtx2, dty2, tx1, ty1, tx2, ty2, dtx, dty, texture_x, texture_y;
// Сортировка вершин
...
// Заполняем треугольник ABO сверху вниз
if (a.screen.y != b.screen.y) // Если точки а и b находятся не на одной горизонтальной линии
{
  // Изменение координаты x от одной сканирующей линии к другой
  dx1 = (b.screen.x - a.screen.x)/(b.screen.y - a.screen.y); // Сторона AB
  dx2 = (c.screen.x - a.screen.x)/(c.screen.y - a.screen.y); // Сторона AO
  // Изменение координат на текстуре от одной сканирующей линии к другой
  dtx1 = (b.texture.x - a.texture.x)/(b.screen.y - a.screen.y); // Сторона AB
  dty1 = (b.texture.y - a.texture.y)/(b.screen.y - a.screen.y);
  dtx2 = ... // Сторона AO
  dty2 = ...
  // Начинаем из самой верхней точки a
  x1 = a.screen.x;
  x2 = a.screen.x;
  // Координаты текстуры для вершины а
  tx1 = a.texture.x;
  ty1 = a.texture.y;
  tx2 = tx1;
  ty2 = ty1;
  // Сканируем треугольник линиями от точки a до точки b
  for (y = a.screen.y; y <= b.screen.y; y++)
  {
    // Определяем Самую левую и самую правую точку треугольника на этой сканирующей линии
    left = min(x1,x2);
    right = max(x1,x2);
    // Смещение координат текстуры "внутри" сканирующей линии
    dtx = (tx2 - tx1) / (x2 - x1);
    dty = (ty2 - ty1) / (x2 - x1);

    texture_x = tx1;
    texture_y = ty1;
    for (x = l; x <= r; x++)
    {
      Цвет = текстура[texture_x][texture_y];
      ВывестиТочку(x, y, Цвет);
      texture_x += dtx;
      texture_y += dty;
    }
    x1 += dx1;
    x2 += dx2;
    tx1 += dtx1;
    ty1 += dty1;
    tx2 += dtx2;
    ty2 += dty2;
  }
}

// Заполняем треугольник CBO свнизу вверх
if (c.screen.y != b.screen.y) // Если точки c и b находятся не на одной горизонтальной линии
{
...
}
ЗЫ. Чота как-то сложно и непонятно всё у меня получилось
Изображения
Тип файла: gif треугольник.GIF (2.5 Кб, 150 просмотров)
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с картинками sava28 HTML и CSS 3 05.08.2008 16:23
Кубики. Visual Prolog. VIP52 Помощь студентам 1 30.05.2008 15:36
бд с картинками TaTT DoGG БД в Delphi 3 28.04.2008 08:21
Помогите студенту МГКИТ задача про кубики plexter Паскаль, Turbo Pascal, PascalABC.NET 2 10.06.2007 16:07
про кубики ара Помощь студентам 1 14.05.2007 07:29