Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Рекурсия присутствует?
И где эти прикрепленные файлы?
Я код на C++ набрал сам. Строил кривую Безье, но "прилипал" к нулю. То есть я задаю точки далеко от нуля, а он строил из нуля, а потом только обходил предложенные точки. Потом я нашёл Ваш сайт и эту статью. Оказалось, что я забыл возвести t в...
просто я не так понял, здесь мы вращаем точки куба что вращает сам куб. Мне нужно вращать просто 3д объект , данный способ не подходит
Задавайте объект в мировых координатах. Вращайте его относительно мировой системы координат. А при отрисовке преобразуйте в экранные координаты. Посмотрите пример преобразования в экранные координаты.

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Скриншот к примеру
Среда программирования: 
Microsoft Visual Studio 2013
Статья по теме: 

При запуске программы открывается окно, в котором рисуется искомый фрактал.

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

#define GL_GLEXT_PROTOTYPES
#include <windows.h>
#include <GL/gl.h>
#include <glut.h>
#include <GL/glu.h>
#include <math.h>
 
/* Обьявление функции, которая будет рисовать фрактал */
void func(double x, double y, double angle, double len, int deph);
 
/* Функция, прорисовывающая изображение в окне */
void display(void){
	/* Очистка экрана цветом по-умолчанию */
	glClear(GL_COLOR_BUFFER_BIT);
 
	/* Задание цвета для рисования */
	glColor3f(1.0f, 0.2f, 0.5f);
 
	/* Начало рисования. Вершины 2n и 2n+1 будут обьединены в линию*/
	glBegin(GL_LINES);
 
	/* Вызов функции, рисующей фрактал. В функции передаются вершины в буфер */
	func(50, 50, 1.1, 50, 12);
	/* Функция, выгружающая буфер в сцену */
	glEnd();
 
	/*  Прорисовка текущего буфера */
	glFlush();
}
 
/* Функция, определённая выше */
void func(double x, double y, double angle, double len, int deph){
	double angp = 0.5; //изменение угла
	for (int i = -1; i<5; i += 2){
		//если не достигнута глубина рекурсии - продолжить построение фрактала
		if (deph>0)
			func(x + cos(angle + i*angp)*len / 2, y + sin(angle + i*angp)*len / 2, angle + i*angp, len / 2, deph - 1);
		/* В буфер записываются вершины. Эти две вершины будут соединены в прямые между собой*/
		glVertex2d(x, y);
		glVertex2d(x + cos(angle + i*angp)*len / 2, y + sin(angle + i*angp)*len / 2);
	}
}
 
void init(void){
	/* Установка цвета по-умолчанию */
	glClearColor(0.0, 0.0, 0.0, 0.0);
	/* Задаются параметры сцены. Матрица преобразований для проекции, координаты сдвигаются в 0 и границы экрана устанавливаются в заданные*/
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0.0, 100.0, 0.0, 100.0, -100.0, 100.0);
}
/* Позволяет закрыть программу нажатием клавиши "эскейп" */
void processNormalKeys(unsigned char key, int x, int y) {
	if (key == 27)
		exit(0);
}
 
 
int main(int argc, char** argv){
	/* Инициализируются буферы для glut-a*/
	glutInit(&argc, argv);
	/* Задаются режимы смешивания цветов и количество буферов*/
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	/* Задаётся размер окна 500 на 500*/
	glutInitWindowSize(500, 500);
	/* Окно сдвигается на 100 единиц по икс и по игрек */
	glutInitWindowPosition(100, 100);
	/* Создаётся окно с названием, размером и смещениями, которые были указаны */
	glutCreateWindow("Fractal");
	/* Вызывается функция инициализации, задания начальных параметров */
	init();
	/* Устанвливается фукция прорисовки, переданная как параметр */
	glutDisplayFunc(display);
	/* Задаётся функция, которая будет обрабатывать нажатия клавиш*/
	glutKeyboardFunc(processNormalKeys);
	/* Начинается выполнение прорисовки и обработка клавиш*/
	glutMainLoop();
	return 0;
}

Прикрепленный файлРазмер
Pifagor.zip166.29 кб