Как нарисовать объемный треугольник

OpenGL в C++ для Ch—

….. В переводе на нормальный язык этот заголовок звучит так:

Графическая библиотека OpenGL в С++ для Дремучих Чайников

….. Еще в первой половине прошлого века образцом сложности и запутанности была квантовая механика. Даже специалисты до конца не понимали этой науки. У одного из ее основателей Энрико Ферми спросили, есть ли критерий, по которому можно определить, знает человек квантовую механику или нет. Он ответил:

«Знает, если сможет на пальцах объяснить её суть своей секретарше».

….. В связи с этим у меня возникла идея попробовать

………………..неувязнув в подробностях,
………………..незапутавшись в придаточных предложениях,
………………..неомрачая изложение материала отсутствием юмора

научить Дремучего Чайника рисовать в OpenGLлинии, эллипсы, гиперболы, а также
………………………раскрашивать светящиеся шары,
…………………………………наносить на них текстуру, и всё это двигать и вращать!

Как рисовать объёмный треугольник на бумаге

….. Разработчики Графической библиотеки OpenGL создали эффективную программу для рисования, однако они сильно намудрили. Следуя совету Энрико Ферми объяснить на пальцах своей (или чужой) секретарше, где надо провести, например, белую линию очень не просто и наверняка без бокала вина не обойдется. Кроме того, трудно предсказать, чем все это закончится! И тем не менее, я берусь научить  Дремучих Чайниковнемного порисовать перед сном!

OpenGL: несколько уроков рисования для Дремучих Чайников

….. Чтобы «провести по ней белую линию» по совету лауреата Нобелевской премии Анатоля Франса начнём изучать Графическую библиотеку OpenGL по учебнику, который привезли на осле.

….. Совершенствуем ОС Windows. C Билла Гейтса «причитается»! Рисуем белую линию, эллипс, гиперболу. Убеждаемся, что красота спасёт мир и на примере Венеры Милосской наблюдаем, что с этой красотой потом произойдет.

OpenGL: рисуем и раскрашиваем светящиеся шары

….. Дорогие Дремучие Чайники, давайте побеседуем с Прекрасной Дамой по имени OpenGL о светящихся шарах, не используя стеки атрибутов и индексы трафарета! На кой черт вам знать, где у дамы расположен аппендикс?

….. Нарисуем и полюбуемся как выглядят шары в придуманных разработчиками фоновой и диффузной моделях освещения! Полюбуемся сияющими моделями зеркальных шаров, освещённых снизу и сбоку и познакомимся с «операторами-невидимками».

….. А в заключение изобразим Автопортрет Дремучего Чайника в направленном розовом и голубом свете.

OpenGL: текстура и Дремучие Чайники

….. Создаём из картинки текстуру, накладываем её на окружность и эллипс, рисуем «Царевну Лебедь». Запрещаем центуриону бросать камни в Марию Магдалину — сажаем его за решётку.

….. А чтобы не показалось мало, накрываем 3D чайник папирусом из пирамиды Хеопса, на шар наносим American Beauty художницы Кэри Фрут и заставляем всё это вращаться!

Как нарисовать равносторонний треугольник, используя только линейку и карандаш? Этот способ позволяет быстро сделать рисунок правильного или равнобедренного треугольника.

Как нарисовать объемный треугольник

Как нарисовать равнобедренный треугольник

Рисунок начинаем с основания. Длину основания подбираем такой, чтобы ее удобно было делить пополам (берем четное количество клеточек). Вершину треугольника отмечаем  ровно над серединой основания:

 

 

Если нужен равнобедренный треугольник, у которого боковая сторона больше основания, вершину ставим повыше:

 

 

Если требуется треугольник, основание которого больше боковой стороны, то вершину отмечаем ниже:

 

 

Как нарисовать равносторонний треугольник

От конца основания откладываем отрезок равной ему длины так, чтобы второй конец этого отрезка расположился ровно над серединой основания. Соединяем вершину треугольника с другим концом основания:

 

 

Бонус.

Если в задаче о равнобедренном треугольнике речь идет о высоте, биссектрисе и медиане, проведенным к основанию, достаточно соединить вершину треугольника с отмеченной серединой основания:

 

Совет 1: Как нарисовать треугольник

Среда программирования: 

Статья по теме: 

Данная программа демонстрирует Т-квадрат. При запуске программы выполняется построение.
Алгоритм:
На вход функции вырисовки drowtT подаются координаты центра квадрата, длина его стороны(в пикселях) и количество итераций;
Вычисляются координаты вершин квадрата и по ним вырисовывается квадрат;
Если количество итераций не равно 0, то запускаем для каждой вершины функцию drowT, уменьшая длину стороны в половину.

Код программы: 

#include <glut.h>   void drowT(int x, int y, int l, int it){int X1 = x — l /2;//координаты вершинint X2 = x + l /2;int Y1 = y — l /2;int Y2 = y + l /2; glColor3f(0.7/ it, 0.7/ it, 0.7); glVertex2i(X1, Y1); glVertex2i(X1, Y2); glVertex2i(X2, Y2); glVertex2i(X2, Y1);if(it !=0){ drowT(X1, Y1, l /2, it -1);//вызов рекурсии для каждой из вершин drowT(X1, Y2, l /2, it -1);//квадрата drowT(X2, Y2, l /2, it -1); drowT(X2, Y1, l /2, it -1);}}   void reshape(int w, int h){ glClearColor(1.0, 1.0, 1.0, 0.0); glViewport(0, 0, w, h);   glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, w, 0, h);   glMatrixMode(GL_MODELVIEW); glLoadIdentity();}   void display(){ glClear(GL_COLOR_BUFFER_BIT);   glBegin(GL_QUADS); drowT(400, 400, 400, 10);//вызов функции вырисовки glEnd();   glutSwapBuffers();}   int main(int argc, char*argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(800, 800);   glutCreateWindow("Levy");   glutDisplayFunc(display); glutReshapeFunc(reshape);   glutMainLoop();}

На этом C++ уроке мы рассмотрим рисование окружности в OpenGL. Вообще, окружность можно представить как многоугольник с очень большим количеством сторон. Чем сторон будет больше, тем более сглаженной будет окружность. Текст функции drawCircle.

void drawCircle(float x, float y, float r, int amountSegments) { glBegin(GL_LINE_LOOP); for(int i = 0; i < amountSegments; i++) { float angle = 2.0 * 3.1415926 * float(i) / float(amountSegments); float dx = r * cosf(angle); float dy = r * sinf(angle); glVertex2f(x + dx, y + dy); } glEnd(); }

Для начала нарисуем квадрат. Вызываем функцию drawCircle и укажем количеством сторон 4. Например, drawCircle(90, 100, 40, 4). Начальная точка будет иметь координаты 90;100, радиус 40, количество сторон 4.

Начальная точка с координатами 90;100 будет являться центром квадрата.

Поэтапное создание лёгких 3D-рисунков карандашом

Теперь нарисуем окружность. Уже укажем количество сторон 30. То есть drawCircle(90, 100, 40, 30).

Полный код программы

#include "glut.h" #include <cmath> void drawCircle(float x, float y, float r, int amountSegments) { glBegin(GL_LINE_LOOP); for(int i = 0; i < amountSegments; i++) { float angle = 2.0 * 3.1415926 * float(i) / float(amountSegments); float dx = r * cosf(angle); float dy = r * sinf(angle); glVertex2f(x + dx, y + dy); } glEnd(); } void display() { glClear(GL_COLOR_BUFFER_BIT); drawCircle(90, 100, 40, 30); glFlush(); } void main() { glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 140); glutCreateWindow("OpenGL window"); glClearColor(0, 0, 1, 1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 200, 200, 0); glutDisplayFunc(display); glutMainLoop(); }

Вы можете оставить комментарий ниже.

В принципе, при наличии центра и 2-х точек присутствие радиуса излишне — его можно вычислить.

Рисование треугольников в трехмерном пространстве в OpenGL

Собственно, решение на сегодня известно только одно — аппроксимировать окружность отрезками, используя её параметрическое задание ( x(t), y(t), z(t) ) и выбрав на ней несколько равноотстоящих по углу точек. Если у нас дуга — просто меняем параметр не от 0 до 2*PI, а от начального до конечного угла (их придётся как-нть посчитать).

А параметрическое задание произвольной окружности, зная центр, плоскость и радиус (последние 2 вещи вычисляются из центра и 2-х точек), можно попробовать получить из параметрического задания единичной окружности x=cos(t), y=sin(t), z=0, учитывая, что точки любой окружности можно получить из точек единичной окружности линейным преобразованием:
(x1(t), y1(t), z1(t), 1) = M(4,4) * (cos(t), sin(t), 0, 1)

Вот пример, как этот метод применяется для отыскания параметрического представления окружности по известным точкам.
http://www.gamedev.ru/projects/forum/?id=58615&page=5 (пост #73)
Там, правда, для другой цели и несколько другие начальные данные (предполагается, что окружность лежит на сфере с центром в начале координат, указывается точкой, лежащей на оси, и точкой, лежащей на радиусе), но в качестве иллюстрации общего принципа логической последовательности может и сгодиться.

(добавка)
>Если у нас дуга — просто меняем параметр не от 0 до 2*PI, а от начального до конечного угла (их придётся как-нть посчитать).

Собственно, почему "как-нть" — если найдём матрицу M, то очень даже просто: считаем матрицу, обратную к M (обратное преобразование), умножаем её на векторы начальной и конечной точек — таким образом, мы преобразуем их в точки на окружности (x=cos(t), y=sin(t), z=0), и далее очевидным образом применяем арксинус и арккосинус.

Добавить комментарий

Закрыть меню