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

Вход на сайт

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

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

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

Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.
Спасибо за статью. Я не Ваш студент. Но мне она помогла написать функцию для Канторова множества на Python для черепашки: import turtle def kanter(x, y, d):     if d > 1:         turtle...

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

Рейтинг@Mail.ru Яндекс.Метрика
Язык программирования: 
C/C++
Среда программирования: 
Eclipse Mars.2(4.5.2)

#include <cmath>
#include <vector>
#include <GL/glut.h>
#define WIDTH 500
#define HEIGHT 500
 
using namespace std;
 
int theta = 0; //угол поворота
 
struct Point {
	double x, y; //координаты точки
} point;
vector <Point> spiral; //массив точек
 
//получение координат точек
void build_spiral () {
	//построение спирали на отрезке [0, 67pi] с шагом 1 градус
	for ( double phi = 0; phi <= 67 * M_PI; phi +=  M_PI / 180 ) {
		//уравнение архимедовой спирали в декартовых координатах
		point.x = phi * cos (phi);
		point.y = phi * sin (phi);
		spiral.push_back (point);
	}
}
 
void reshape ( int w, int h ) {
	glViewport ( 0, 0, WIDTH, HEIGHT ); //область вывода
	glLoadIdentity (); //замена текущей матрицы на единичную
	gluOrtho2D ( -WIDTH / 2, WIDTH / 2,  -HEIGHT / 2, HEIGHT / 2 ); //плоскость отсечения
	glMatrixMode ( GL_MODELVIEW ); //матрица преобразований
}
 
void display () {
	glClear ( GL_COLOR_BUFFER_BIT ); //очистка текущего буфера цвета
	glClearColor ( 1.0, 1.0, 1.0, 1.0 ); //цвет фона(RGBA, белый)
	glColor3ub ( 0, 0, 0 ); //цвет рисования(RGB, черный)
	glPushMatrix (); //поместить текущую матрицу в стек матриц
	glRotatef ( theta, 0, 0, 1 ); //повернуть текущую матрицу
	glScaled ( 1.7, 1.7, 1 ); //масштабирование
	glLineWidth ( 5 ); //толщина линии
	//сглаживание
        glHint ( GL_LINE_SMOOTH_HINT, GL_NICEST );
        glEnable ( GL_LINE_SMOOTH );
        glEnable ( GL_BLEND );
        glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
	glBegin ( GL_LINES );
	for ( unsigned i = 1; i < spiral.size(); i ++ ) {
		glVertex2d ( spiral[i].x, spiral[i].y );
		glVertex2d ( spiral[i - 1].x, spiral[i - 1].y );
	}
	glEnd ();
	//построение окружности в центре окна
	glBegin ( GL_TRIANGLE_FAN );
	glVertex2d ( 0, 0 ); //центр
	for( int i = 0; i <= 50; i++ ) {
		double phi = (double)i / 50.0 * M_PI * 2.0;
		glVertex2d ( 2.5 * cos ( phi ), 2.5 * sin ( phi ) );
	}
	glEnd ();
	glPopMatrix (); //вытолкнуть последнюю матрицу из текущего стека матриц
	glutSwapBuffers (); //переключение буфера кадра
}
 
void timer ( int state ) {
	theta = (theta - 45) % 360; //поворачиваем спираль на 45 градусов по часовой стрелке
	glutPostRedisplay(); //вызываем функцию перерисовки окна
	glutTimerFunc ( 80, timer, 0);
}
 
int main ( int argc, char** argv ) {
	glutInit( &argc, argv ); //инициализация OpenGL Utility Toolkit
	glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB ); //режим окна(двойной буфер и RGB-палитра)
	glutInitWindowSize ( WIDTH, HEIGHT ); //установка размеров окна(ширина и высота в пикселях)
	glutInitWindowPosition ( 200, 30 );//положение окна относительно левого верхнего угла экрана
	glutCreateWindow ( "Spiral" ); //создание окна
	build_spiral(); //получение координат спирали
	glutReshapeFunc ( reshape );  //перерисовка окна
	glutDisplayFunc ( display );//инициализация функции, отвечающей за рисование в окне
	glutTimerFunc ( 80, timer, 0); //таймер, срабатывает каждые 80 мс
	glutMainLoop (); //вход в главный цикл
	return 0;
}

Прикрепленный файлРазмер
kolesnikova_rotating_spiral.zip124.9 кб