Благодаря компьютеру мы можем имитировать трехмерные объекты на наших экранах. Трехмерная графика сложная штука. Многие помнят как когда-то рисовали кубик на листе бумаги. Сначала рисуем квадрат, потом продолжаем дорисовывать до куба. Вот такого рода куб я и хочу нарисовать.
Существуют разные способы задания проекций. Чтобы работать с трехмерными изображениями надо знать понятие проекций и немного в них разбираться.
Чтобы нарисовать такой кубик как я хочу, мне поможет Проекция Кабине.
Сам алгоритм рисования куба будет таким:
(Поворот отрезка может быть немного сложен на первых порах, но понять его не самое сложное.)
Итак, чтобы наша программа заработала, нужно определиться чего нам нужно.
1) Нужны — координаты начала отсчета
2) Нужна длина ребра куба
3) Нужна функция, в которой будут задаваться начальные значения вершин куба
4) Нужна функция, которая будет поворачивать отрезок на угол 26.5 градусов
5) Нужна функция, которая будет соединять все точки массива.
6) Нужно написать программу
Я определился так, что коли на мониторе мы в любом случае имеем двумерную плоскость, то мне будет достаточно одной переменной типа TPoint (две точки). Чтобы соединять линии удобно использовать массив, но заранее я не стал считать сколько нужно точек, разобрался по ходу написания программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#include <conio.h> #include <iostream.h> #include <graphics.h> #include <math.h> const int N=9; //Это число точек, которые я собираюсь соединить. struct TPoint{double x,y;} vx[N]; //Массив точек, хранит координаты вершин куба TPoint RotateVector(double xbeg,double ybeg,double xend,double yend,double angle) //Функция поворота отрезка { angle=angle*M_PI/360.0; //Перевод углов в радианы double dx=xend-xbeg; // Вычисляю Координаты вектора double dy=yend-ybeg; double dxn=dx*cos(angle)-dy*sin(angle); //Поворот вектора на angle градусов double dyn=dy*sin(angle)-dy*cos(angle); TPoint T; //Объявил точку. Будет вычисленной координатой T.x=xbeg-dxn; //Прикладываю повернутый вектор к начальной точке T.y=ybeg+dyn; return T; //Возвращаю координаты } /*ФУНКЦИЯ ЗАДАЕТ КООРДИНАТЫ ТОЧЕК ВЕРШИН КУБА*/ void KubInit(int x,int y,int len) //Принимаем начальные x,y и длину { vx[0].x=x; vx[0].y=y; //Точка начала рисования будет совпадать с принятыми x,y vx[1].x=vx[0].x; //Начинаю задавать точки квадрата vx[1].y=vx[0].y+len; vx[2].x=vx[1].x+len; vx[2].y=vx[1].y; vx[3].x=vx[2].x; vx[3].y=vx[2].y-len; vx[4].x=vx[0].x; vx[4].y=vx[0].y; //Закончил задавать точки квадрата //Выполняю поворот вектора для вычисления пятой вершины куба vx[5]=RotateVector(vx[0].x,vx[0].y,vx[1].x,vx[1].y,90-26.5); //Присвоил в vx[5] vx[6].x=vx[5].x; //Начинаю рисовать второй квадрат vx[6].y=vx[5].y+len; vx[7].x=vx[6].x+len; vx[7].y=vx[6].y; vx[8].x=vx[7].x; vx[8].y=vx[7].y-len; vx[9].x=vx[5].x; vx[9].y=vx[5].y; //Закончил вычисления вершин второго квадрата. } /*ФУНКЦИЯ ВЫВОДА КУБА НА ЭКРАН*/ void KubDraw(int x,int y,int len) //Принимает координаты начала рисования и длину ребра куба { rectangle(vx[0].x,vx[0].y,vx[2].x,vx[2].y); //выводим первый квадрат rectangle(vx[5].x,vx[5].y,vx[7].x,vx[7].y); //выводим второй квадрат for (int i=0;i<4;i++) line(vx[i].x,vx[i].y,vx[i+5].x,vx[i+5].y); //соединям вершины квадратов } void main() { int gd=DETECT,gm; initgraph(&gd,&gm,""); int x=getmaxx()/2.0,y=getmaxy()/2.0; //Можно задать свои x,y int len=150; //и длину тоже можно менять KubInit(x,y,len); //Вычисляем координаты вершин KubDraw(x,y,len); //Рисуем Куб getch(); //Ждем нажатия closegraph(); } |
Когда я писал код, то за неопытом контролировал каждую нарисованную линию, выводя её на экран сразу после вычисления очередной точки. Да что линию, даже точки выводил как маленькие окружности, чтоб видеть, что точка легла куда я хотел.
При соединении вершин квадратов использовано то, что я оба квадрата рисовал одинаково (Вниз-Вправо-Вверх-Влево).
Разумеется этот код далеко не идеальный, но приблизительно настолько расписанных примеров мне встречать пока еще не доводилось. Этот пример рисования каркаса куба только один из множества возможных способов. В моем понимании сам алгоритм такого рисования каркаса куба относительно прост, но чтобы хорошо понимать этот код, у читающего должен быть хотя бы небольшой опыт рисования двумерных объектов относительно точек.
А как нормально создать проект что бы код работал? А то пишет не удается найти указанный файл
От компилятора зависит. У меня описано для очень старого. Вам скорее всего нужно или OpenGl или directX. В зависимости от выбора