Код:
/*
* Реализация алгоритма Брезенхема при вычерчивании эллипса.
*
*/
#include <windows.h> //включаем заголовочные файлы
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void CALLBACK resize(int width,int height)
{
glViewport(0,0,width,height); // Здесь я указываю ту чать окна,
// куда осуществляется вывод OpenGL.
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-30,30, -20,20, 2,12); // Устанавливаем тип проекции.
// glOrtho - параллельная
gluLookAt( 0,0,5, 0,0,0, 0,1,0 ); // Устанавливаем точку, в которой
// находится наш глаз
glMatrixMode( GL_MODELVIEW ); //загружаем соответсвующую матрицу.
}
void CALLBACK display(void)
{
double x,y,a,b,c,d,i,j;
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //Цвет, которым заполняется буфер при очищении
a=10;
b=5;
x=0;
y=b;
i=0;
j=b;
glLineWidth(2); // ширина 2
glPointSize(5); //толщина линии 5
glColor3d(0,1,0); //цвет зеленый
c=4*pow(b,2)*pow((x+1),2)+pow(a,2)*(2*y-1)-4*pow(a,2)*pow(b,2);
glBegin(GL_TRIANGLE_FAN); //начинаем построение точек
while(y>0) //задаем условие
{
if (pow(a,2)*(2*y-1)>=2*pow(b,2)*(x+1)) //определяем в какой четверти дуги находиться следующая точка
{
i=x;
j=y;
i++;
j=j-0.5;
if(c<0)
{ //точка (х+1,у)
c=14*pow(b,2)*pow((i+1),2)+pow(a,2)*(2*j-1)-4*pow(a,2)*pow(b,2)+4*pow(b,2)*(2*i+3);
x++;
glVertex2d(x,y);
glVertex2d(x,-y);
glVertex2d(-x,-y);
glVertex2d(-x,y);
d=pow(b,2)*pow((2*i+1),2)+4*pow(a,2)*(j-1)-4*pow(a,2)*pow(b,2);
}
else
{ //точка (х+1,у-1)
y--;
x++;
c=4*pow(b,2)*pow((i+1),2)+pow(a,2)*(2*j-1)-4*pow(a,2)*pow(b,2)+4*pow(b,2)*(2*i+3)-8*pow(a,2)*(j-1);
glVertex2d(x,y);
glVertex2d(x,-y);
glVertex2d(-x,-y);
glVertex2d(-x,y);
d=pow(b,2)*pow((2*i+1),2)+4*pow(a,2)*(j-1)-4*pow(a,2)*pow(b,2);
}
}
else
{
i=x;
j=y;
i=i+0.5;
j--;
if(d<0)
{
//точка (х+1,у-1)
x++;
y--;
d=pow(b,2)*pow((2*i+1),2)+4*pow(a,2)*(j-1)-4*pow(a,2)*pow(b,2)+8*pow(b,2)*(i+1)-4*pow(a,2)*(2*j+3);
glVertex2d(x,y);
glVertex2d(x,-y);
glVertex2d(-x,-y);
glVertex2d(-x,y);
}
else
{ //точка (х,у-1)
y--;
d=pow(b,2)*pow((2*i+1),2)+4*pow(a,2)*(j-1)-4*pow(a,2)*pow(b,2)+8*pow(b,2)*(i+1);
glVertex2d(x,y);
glVertex2d(x,-y);
glVertex2d(-x,-y);
glVertex2d(-x,y);
}
}
}
glEnd();
glDisable(GL_LINE_SMOOTH);
glDisable(GL_LINE_STIPPLE);
auxSwapBuffers();
}
void main()
{
float pos[4] = {3,3,3,1};
float dir[3] = {-1,-1,-1};
auxInitPosition( 50, 10, 400, 400); // указываем координаты окна на экране
// верхний левый угол (50,10)
// ширина и высота - 400
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE ); // устанавливаем параметры контекста OpenGL
auxInitWindow( "Brezenxem" ); // создаем окно на экране
auxIdleFunc(display); // когда никаких сообщений нет
// будет вызываться функция display
auxReshapeFunc(resize); // мы устанавливаем функцию resize,
// которая будет вызвана
// при изменении размеров окна
glEnable(GL_ALPHA_TEST); // тест прозрачности
glEnable(GL_DEPTH_TEST); // тест глубины
glEnable(GL_COLOR_MATERIAL); // glColor будет устанавливать
// свойства материала
// glEnable(GL_LIGHTING); // разрешаем освещение
glEnable(GL_LIGHT0); // включаем нулевую лампу
glEnable(GL_BLEND); // разрешаем смешение цветов
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glLightfv(GL_LIGHT0, GL_POSITION, pos); // устанавливаем положение нулевой лампы
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
auxMainLoop(display); // устанавливаем
// функцию display отрисовки окна
// эта функция будет вызываться всякий раз,
// когда потребуется перерисовать окно
// например, когда вы развернете окно на весь экран
}