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

Вход на сайт

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

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

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

dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.

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

Рейтинг@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 кб