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

Вход на сайт

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

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

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

Спасибо за статью. Я не Ваш студент. Но мне она помогла написать функцию для Канторова множества на Python для черепашки: import turtle def kanter(x, y, d):     if d > 1:         turtle...
Как реализовать в данном примере границы расчёта?

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

Рейтинг@Mail.ru Яндекс.Метрика
интернет-трейдинг, forex уроки форекс, обучение от Максимаркетс
Язык программирования: 
C/C++
Среда программирования: 
Visual Studio 2010

#include "stdafx.h"
#include <glut.h>
#include <math.h>
 
#define PI 3.14159265358979323846
 
float WinWidth = 600.0;
float WinHeight = 600.0;
 
float c=100.0; //расстояние до фокуса
int segments=10; //детализированность окружности
float r=75.0; //радиус окружности
float var=0.0;
int direction=-1; //направление движения по оси абсцисс
int signY=-1; //контроль знака ординаты
 
float Gety(float x) {
	return signY*sqrt(sqrt(pow(c,4)+4*pow(x,2)*pow(c,2))-pow(x,2)-pow(c,2));
}
 
void drawCircle(float x, float y, float r, int amountSegments) {
	glLineWidth(5.0); //ширина линий
	glEnable(GL_ALPHA_TEST); //подключение glAlphaFunc
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //смешание цветов
	glEnable(GL_BLEND); //подключение glBlendFunc
	glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); //приоритет качества
        glEnable(GL_LINE_SMOOTH); //сглаживание линий
	glBegin(GL_LINE_LOOP); //отрисовка окружности
	for(int i=0;i<amountSegments;i++) {
		float angle=2.0*PI*float(i)/float(amountSegments);
		float dx = r*cosf(angle);
		float dy = r*sinf(angle);
		glVertex2f(x+dx,y+dy);
	}
	glEnd();
	glDisable(GL_ALPHA_TEST);
	glDisable(GL_BLEND);
	glDisable(GL_LINE_SMOOTH);
}
 
void Draw() {
	glClear(GL_COLOR_BUFFER_BIT); //очистка окна
	glColor3ub(239,0,0); //цвет
	for(int i=0; i<=360; i+=45) {
		glPushMatrix();
		glRotatef((float)i, 0.0, 0.0, 1.0); //вращение
		drawCircle(var,Gety(var),r,segments);
		glPopMatrix();
	}
	glutSwapBuffers(); //вывод на экран
}
 
void Timer(int value) {
	if(var>=0&&direction== 1) signY=-1;
	if(var>=0&&direction==-1) signY= 1;
	if(var<0 &&direction== 1) signY= 1;
	if(var<0 &&direction==-1) signY=-1;
 
	if(abs(var)>sqrt(2.0)*c&&direction==-1) {
		var++;
		direction*=-1;
	}
	else if(abs(var)>sqrt(2.0)*c&&direction==1) {
		var--;
		direction*=-1;
	}
	glutPostRedisplay(); //вызов ф-ции рисования
 
	if(direction==-1) var--;
	else var++;
	glutTimerFunc(abs(var*PI/2/c)+7,Timer,0); //установка таймера
}
 
void Initialize() {
	glClearColor(0.0, 0.0, 0.0, 1.0); //установка цвета фона
	glMatrixMode(GL_PROJECTION); //работа с проекционной матрицой
	glLoadIdentity(); //загрузка единичной матрицы
	gluOrtho2D(-WinWidth/2, WinWidth/2, -WinHeight/2, WinHeight/2); //определяем двухмерную ортографическую проекцию
	glMatrixMode(GL_MODELVIEW); //работа с модельно-видовой матрицей
}
 
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
	glutInitWindowSize(WinWidth, WinHeight);
	glutInitWindowPosition(100, 100);
	glutCreateWindow("LemniscateFlower");
	glutDisplayFunc(Draw); //Draw() отвечает за рисование
	glutTimerFunc(0,Timer,0); //инициализация таймера
	Initialize();
	glutMainLoop();
	return 0;
}

Прикрепленный файлРазмер
kontrolskiy_lemnicircles.zip153.07 кб