A Equação do Batman na OpenGL

Sabe aquela coisinha fácil que tu fazes mas acha tão legal que resolve compartilhar?
Essa semana, na disciplina de Processamento Gráfico (que ministro na Unisinos POA), começamos a trabalhar com a API gráfica OpenGL. Uma apresentação básica às principais funcionalidades da biblioteca, integração OpenGL+GLUT etc. E nisso alguns exercícios com primitivas geométricas, tipo desenhar um quadrado, triângulo, pontos, linhas, círculo etc. No círculo o pessoal já pede ajuda, porque é necessário relembrar o bom e velho Teorema de Pitágoras pra gerar os pontos 🙂

Meu maior desafio é tentar DESAPAVORAR a gurizada para a Matemática. Afinal, Computação Gráfica é Matemática pura, né? Sh-h-h-h… Heheh 😀 Nas nossas brincadeiras de gerar círculos, caracóis, PAC-MANs e fatias de pizza, comentei com a gurizada sobre a famosa Equação do Batman, que algum maluco matemático nerd muito legal bolou e que desenha o logo do nosso querido Homem-Morcego.   Mostrei pra eles no Google, e propus o desafio de desenhar usando a OpenGL. Claro, eu sempre que proponho um exercício novo eu fico enlouquecida me coçando pra fazê-lo também, hehe. Então, no dia seguinte (porque na hora da aula a gurizada me chamou o tempo todo pra tirar dúvidas — o que eu acho muito bom!), aproveitei um daqueles momentos em que o cérebro está cansado e precisa relaxar, e implementei, de forma BEM SIMPLES e NÃO OTIMIZADA, um programinha pra plotar a equação usando OpenGL — até como tira-teima, já que houve alguma incredulidade sobre essa equação (só ver no link do Guizmodo). Basicamente, o trabalho foi transcrever as equações (copy and paste do Google), e escolher um ?x adequado para que ficasse bonitinho.  Plotei cada equação em separado, com cor diferente, já na função de callback de desenho. Obviamente que o mais inteligente é gerar os pontos e depois só plotar. Enfim, se alguém ainda dúvida, é só rodar esse codiguinho de nada e provar que a equação é verdadeira. Abaixo, vou deixar só o código da função de desenho do  bátima.

void DesenhaBatman()
{
	glLineWidth(3);

	double deltax = 0.00005;

	//Primeira Equação
	double x = -8.0;
	glPointSize(3);
	glColor3f(1,0,0);
	glBegin(GL_LINE_STRIP);
	while (x < = 8.0)
	{
		double y = 1.5* sqrt(-abs(abs(x)-1)*abs(3-abs(x))/((abs(x)-1)*(3-abs(x))))*(1+abs(abs(x)-3)/(abs(x)-3))*sqrt(1-pow(x/7,2))+(4.5+0.75*(abs(x-.5)+abs(x+.5))-2.75*(abs(x-.75)+abs(x+.75)))*(1+abs(1-abs(x))/(1-abs(x)));
		glVertex2f(x,y);
		x += deltax;
	}
	glEnd();

	//Segunda Equação
	x = -8.0;
	glColor3f(0,1,0);
	glBegin(GL_LINE_STRIP);
	while (x <= 8.0)
	{
		double y = -3*sqrt(1-pow(x/7,2))*sqrt(abs(abs(x)-4)/(abs(x)-4));
		glVertex2f(x,y);
		x += deltax;
	}
	glEnd();

	//Terceira Equação
	x = -8.0;
	glColor3f(0,0,1);
	glBegin(GL_LINE_STRIP);
	while (x <= 8.0)
	{
		double y = abs(x/2)-0.0913722*(x*x)-3+sqrt(1-pow((abs(abs(x)-2)-1),2));
		glVertex2f(x,y);
		x += deltax;
	}
	glEnd();

	//Quarta Equação
	x = -8.0;
	glColor3f(1,0,1);
	glBegin(GL_LINE_STRIP);
	while (x <= 8.0)
	{
		double y = (2.71052+(1.5-0.5*abs(x))-1.35526*sqrt(4-pow(abs(x)-1,2))*sqrt(abs(abs(x)-1)/(abs(x)-1)));
		glVertex2f(x,y);
		x += deltax;
	}
	glEnd();
}


Saída do programinha que plota a Equação do Bátima