Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2009, 01:33   #1
uriktus
 
Регистрация: 22.10.2009
Сообщений: 2
Вопрос C++VS компьютерная графика,необходимо чтобы элипс был ровным

Код:
/*

 * Реализация алгоритма Брезенхема при вычерчивании эллипса.
 *
 */


#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 отрисовки окна
														 // эта функция будет вызываться всякий раз,
														 // когда потребуется перерисовать окно
														  // например, когда вы развернете окно на весь экран


}
пишу за еду^^

Последний раз редактировалось Stilet; 26.10.2009 в 10:08.
uriktus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конвертер из png в jpg или gif или bmp Квэнди Мультимедиа в Delphi 8 04.10.2011 22:26
Метод Монте-Карло литература или примеры программ на С++ или С MIKI Помощь студентам 2 09.12.2008 13:33
Шрифты. Мне кажется или я долго не был? AngelOfDeath О форуме и сайтах клуба 1 26.09.2008 17:24
как сцепить несколько ячеек чтобы сохранилось выделение цветом или жирным шрифтом gribkow Microsoft Office Excel 7 23.04.2008 09:27