Member 13151067 Ответов: 1

Рисование эллипса с помощью C++ с opengl?


Я пытаюсь нарисовать эллипс, который не перемещается в моем проекте, и я использую анимацию в этом проекте, но использование функции "myellipse" делает анимацию очень медленной
это код для рисования эллипса

Что я уже пробовал:

Это код для рисования эллипса
void myEllipse(int x,int y,float StAngle,float EndAngle,int RX, int RY)
{
	double i;
	glBegin(GL_LINE_STRIP);
	glColor3f(1,1,0);
	i=StAngle;
	while(i<=EndAngle)
	{
		glVertex2f(int((RX*cos(i)+y)+.5),int((RY*sin(i)+x)+.5));
		i=i+.001;
	}
		glEnd();
}

и это мой код для анимации
void animation(void)
{
	if(angle>=0 && angle<10)
		angle = angle+0.5;
	else angle = 0;
	glutPostRedisplay();
}

void Auto(void) //Control the movment of the fish 
{
	if(Autorun<=300 && Autorun>-350)
		Autorun = Autorun-0.05;
	else Autorun = 300;
	glutPostRedisplay();
}

1 Ответов

Рейтинг:
10

Patrice T

Цитата:
но использование функции "myellipse" делает анимацию очень медленной

Вы хотите повысить скорость, этот процесс называется "оптимизация", инструмент, который поможет вам определить горлышки бутылок, - это профилировщик.
Профилирование (компьютерное программирование) - Википедия[^]

Оптимизация - это критическое отношение к вашему коду, это перевод на ответы на вопросы:
Почему я поступаю именно так, разве это необходимо ?
Могу ли я получить тот же результат с более эффективным кодом ?
Ваш код использует фиксированное приращение i=i+.001 это означает, что для любого elipse вы выполняете цикл 6200 раз, независимо от размера elipse.
Критики: если мой elipse имеет 10 пикселей в поперечнике, нужно ли мне делать цикл 6200 раз ?
Ответ-Нет, я могу уменьшить количество циклов.
Фокус в том, чтобы приспособить увеличение размера эллипса.
Что - то вроде этого должно было улучшить скорость:
void myEllipse(int x,int y,float StAngle,float EndAngle,int RX, int RY)
{
	double i, inc;
	glBegin(GL_LINE_STRIP);
	glColor3f(1,1,0);
	inc=3.14/max(RX,RY)/2;
	i=StAngle;
	while(i<=EndAngle)
	{
		glVertex2f(int((RX*cos(i)+y)+.5),int((RY*sin(i)+x)+.5));
		i=i+inc;
	}
	glEnd();
}


Если вы хотите получить реальные более быстрые элипсы и круги, вам нужно изучить эту статью:
Круги и цифровой дифференциальный анализатор | Dr Dobb's[^]


KarstenK

Отличный материал от старого доброго DDJ ;-)

Patrice T

Всегда стоит проверить. :)