MAC499: Trabalho de Formatura Supervisionado 

	Desenvolvimento de um software de Geometria Dinâmica em Java

		Nome da aluna: Renata Teixeira Carneiro 

		Nome do supervisor: Leonidas Brandão 
	
		Tipo de trabalho realizado: Iniciação científica  


1-Introdução:

	O IGeom (Geometria Interativa na Internet) é um software que está sendo desenvolvido em Java,  
	para ser utilizado localmente e via Internet, em páginas a partir do "site" iMática (http://www.matematica.br).
	Em função de seu emprego Internet optou-se por usar apenas o AWT, evitando o pacote Java Swing, que apesar de 
	trazer muitos recursos facilitadores ao desenvolvimento, acaba gerando códigos mais lentos e menos portáveis. 

	O iGeom é um programa de Geometria Dinâmica que permite ao usuário desenvolver construções geométricas elaboradas
	a partir de operações elementares, como marcar ponto, traçar reta, semi-reta, segmento e circunferência, 
	simulando com o mouse o uso de régua e compasso. Sua grande vantagem é o dinamismo, isto é, o usuário pode
	interagir com as construções arrastando os objetos que a compõem. Nesse caso, o programa  automaticamente se 
	encarrega de redesenhar todos os objetos, preservando as propriedades e relações originais. 

	Além disso, existem duas versões desse software: aplicativo e applet. Na primeira é possível salvar a construção
	e todos os seus passos em disco e não é necessário ter acesso a rede. Já na segunda, o usuário precisa ter acesso
	a rede, não pode gravar em disco, mas pode enviar a solução do exercício ao professor.


2- Objetivos do projeto:

	O IGeom tem como principal objetivo ser um recurso didático usado tanto por professores como por alunos no ensino
	e na aprendizagem de Geometria plana. Ele é uma ferramenta extremamente poderosa porque, devido ao dinamismo,
	permite que o aluno resolva vários exercícios e em cada um deles efetue quantos testes desejar, a partir de uma
	única construção (o dinamismo). O aluno pode arrastar os objetos  e verificar com mais precisão o que acontece,
	sendo esta a principal vantagem da geometria dinâmica sobre a usual, de lápis e papel. Isso aumenta 
	consideravelmente a compreensão do aluno sobre o assunto geométrico considerado, permitindo que o aluno faça
	suas próprias descobertas. Além disso, o software permite que a resolução de qualquer exercício seja gravada
	num arquivo, na forma de uma macro (ou "scirpt"). O "script" é análogo à função matemática: precisa de domínio
	para ser aplicada e produz uma imagem. Deste modo, este conceito pode ser facilmente empregado por um professor
	para analisar as soluções de seus alunos a um dado problema: o aluno grava sua solução ao problema ("script"
	geométrico) e o professor pode aplicá-la  no domínio correspondente e verificar a "qualidade" da solução. 
	No "script" do iGeom ainda podem ser inseridos comentários sobre a resolução do exercício e pontos de parada,
	instantes que a execução do "script" deve ser interrompida para que o aluno tenha tempo de examinar algo.

	Dessa forma, quando o script for executado futuramente, o mesmo irá parar nestes pontos, e um novo passo só 
	ocorrerá quando o usuário apertar o botão de novo passo. Esses pontos também podem ser usados pelo professor 
	para "explicar" uma solução para o aluno, permitindo que o usuário visualize passo-a-passo a resolução proposta. 
	Isso é fundamental no aprendizado de geometria porque o aluno passa a ter consciência de todos os passos necessários
	para a resolução do exercício e mais importante, ele é capaz de compreender a ordem em que cada passo deve ser 
	feito. Novamente, isso não pode ser feito utilizando-se apenas lápis e papel. Outro ponto importante do uso de
	programas de geometria dinâmica, como o  iGeom, é deixar sob comando do próprio aprendiz o controle de velocidade
	de seu aprendizado, pois com o iGeom ele pode executar quantas vezes desejar o "sript", efetuando quantos testes
	precisar. O usuário é quem comanda quando o próximo passo deve ser executado, assim ele só irá para o próximo quando
	tiver compreendido o anterior. Estas características do iGeom, versão applet e "scripts" com comentários, permitirá
	que o programa seja utilizado em cursos de geometria à distância ou rede local (em aula presencial), constituindo
	uma novidade no ramo, já que até o momento não temos notícia de nenhum programa de geometria dinâmica que permita
	isso. Espera-se que brevemente o iGeom possua uma ampla biblioteca de exercícios propostos e resolvidos, a partir 
	do "site" iMática, devendo ser disponibilizado também mecanismos de busca e seleção de exercícios. 



3.a) Atividades realizadas:

	Primeiramente eu tive que aprender a linguagem Java, que é orientada a objetos. Essa tarefa foi um pouco complicada
	para mim, porque eu nunca tinha estudado realmente os conceitos de orientação de objetos. Dessa forma, eu tive que
	aprender toda a sintaxe da linguagem, compreender os conceitos de orientação de objetos e também entender como estes
	eram implementados em Java. O passo seguinte foi estudar Geometria Descritiva porque o professor Toledo 
	(co-orientado neste projeto) queria que eu selecionasse e resolvesse alguns exercícios para depois colocá-los na
	biblioteca mencionada anteriormente. Mas, eu depois não precisei fazer isso porque ele achou mais interessante eu
	implementar outras funcionalidades mais urgentes naquele momento. 
 
	Depois eu tive que estudar grande parte do código fonte do iGeom que já tinha sido desenvolvido anteriormente pelos
	outros dois alunos que participavam do projeto, a saber, Fabiana Piesigilli e Ricardo Hideo Sahara. Essa parte 
	consumiu bastante tempo, porque o código já estava muito extenso e pouco documentado. Eu tive que compreender 
	especialmente a estrutura de dados que tinha sido adotada para guardar toda a construção e quando e como essa 
	construção era desenhada na tela. A estrutura de dados consistia de duas listas ligadas de objetos, uma de pontos
	e outra com todos os outros tipos de objetos presentes na construção.

	Em seguida, eu implementei a grade ("grid", basicamente um reticulado de retas perpendiculares aos eixos) no 
	software, colocando uma opção no menu editar chamada grid. Ao clicar uma vez, o grid aparece e ao clicar novamente
	ele some. O grid é definido por uma largura, que pode ser alterada modificando-se o valor da variável largura_grade. 

	Logo depois, implementamos os eixos cartesianos, que assim como o grid, são opcionais e o usuário é quem escolhe
	o momento em que devem ser desenhados. Para isso, existe uma opção no menu  editar chamada Eixos. Também foi criado
	um botão que ativa e desativa os eixos. Nos dois casos, ao clicar uma vez, os eixos aparecem e ao clicar novamente
	eles somem. Nessa implementação foi definida a origem dos eixos e uma unidade para permitir construções com medida,
	como é usual em Trigonometria, por exemplo. A distância entre dois objetos quaisquer é sempre medida em relação a
	essa unidade, que pode ser alterada em qualquer momento pelo usuário. Nesse caso, todas as medidas presentes na
	construção são automaticamente recalculadas e proporcionalmente alteradas. Em termos de implementação utilizamos
	a quantidade de pontos, escala fixa do Java, para efetuar estes cálculos: toma-se a distância entre dois pontos,
	em pixels, dividindo-se este resultado pela quantidade de pixels contida na distância definida como unidade. Outro
	aspecto importante é que quando os eixos são removidos todos os objetos  construídos sobre eles ou que deles 
	dependam também são removidos. Para fazer isso, foi implementada uma busca em profundidade, não recursiva, que
	percorre a lista de dependências dos eixos e da unidade e remove da construção todos os objetos presentes nessas
	listas. Além disso, tive que cuidar dos rótulos dos eixos porque esses devem ser redesenhados toda vez que 
	o redimensionamento da janela ocorre.


	Outro aspecto é que o iGeom permite que qualquer construção seja gravada em um arquivo de "desenho" para depois 
	a mesma poder ser recuperada. Por isso,  também tive que encontrar uma solução para anotar os eixos e seus 
	dependentes neste formato. O mesmo precisou ser feito no gravador de applets.
	Como existiam dois formatos distintos para gravação no iGeom, com a duplicação de código correspondente, 
	decidiu-se que o próximo passo seria a uniformização destes, utilizando a “linguagem” de desenho (.geo), mas o
	formato de código dos arquivos de script (.scr). Para ficar mais claro o funcionamento destes gravadores, a seguir
	é mostrada a sequência de passos para gravar um “script”:
		1-o usuário seleciona no menu Script a opção Começar; 
		2-o usuário resolve o exercício, adicionando comentários e pontos de parada se quiser detalhar mais o
		processo de construção;
		3-o usuário seleciona no menu Script a opção Finalizar, passa um nome para o script e o software constrói
		um script (arquivo .scr) com tudo o que foi feito no passo anterior e grava o mesmo em disco;
		4-quando desejar recuperar todo o processo de construção, o usuário seleciona no menu Script a opção 
		Executar e passa o nome dado ao script. Nesse momento, a classe Interpretador é invocada para interpretar
		o arquivo passado. Durante o processo de interpretação, o analisador léxico é chamado para fazer a análise.
		Para este pedaço foi utilizado um analisador genérico, a classe Jlex, que recebe um arquivo com as
		expressões regulares que definem como o parser deve ser feito e gera uma classe que faz o parser 
		propriamente dito. Depois de finalizada a análise, a construção pode ser executada passo-a-passo. 
		Dessa forma, para conseguir fazer a uniformizaçao eu tive que entender exatamente como tinha que ser
		o arquivo passado para o JLex e por isso estudei a documentação dele. Eu também tornei possível gravar
		os eixos, circunferência definida por centro e segmento e ponto médio. 

3.b) Estado atual do iGeom e próximos passos:

	Atualmente é possível: marcar ponto solto, ponto sobre um objeto, ponto de intersecção e ponto médio entre dois
	objetos; traçar circunferência, circunferência definida por centro e raio; reta, semi-reta, segmento, paralela
	(a uma reta, segmento, ou semi-reta dada), perpendicular (a uma reta, segmento, ou semi-reta dada); desenhar grid
	e eixos cartesianos; gravar scripts com construções, recorrências e comentários e depois executá-los; esconder
	objetos, mostrar os objetos escondidos, mover, rastrear e rotular objetos; medir distância entre objetos, medir
	arco; gerar applets; e adicionar e remover macros e deletar objetos.
	Em todas as novas alterações que estou implementando, procuramos sempre melhorar a documentação para facilitar
	o contínuo desenvolvimento do sistema iGeom.
	Como próximo passo deveremos implementar a funcionalidade de "snap", que permite "grudar pontos ao grid".



4- Resultados obtidos: 

	O  iGeom atualmente é um software com muitas funcionalidades implementadas e já pode ser tranquilamente utilizado
	como recurso didático no ensino e no aprendizado de geometria plana (euclidiana, analítica, descritiva e 
	trigonometria). Tanto que no momento o "site" iMática (http://www.matematica.br/igeom) já disponibiliza alguns
	exemplos de seu uso na Geometria. 

5- Bibliografia utilizada:

	[1]Paulo Boulos e Ivan de Camargo, Geometria Analítica Um Tratamento Vetorial, McGraw-Hill, 1987. 
	[2]Pressman, Roger S. Software Engineering: A practioner´s approach. 2001, McGraw-Hill 
	[3]Eckel, Bruce. Thinking in Java. 1998, Prentice Hall.  
	[4]Documentação do Java 
	[5]Paulo Feofiloff, Notas de aula do curso MAC338: Algoritmos em grafos
	[6]Apostila do curso SL275 de Linguagem de Programação Java da Sun

6- BCC no projeto: 

	-MAC 110: INTRODUÇÃO À COMPUTAÇÃO
		Essa disciplina foi importante para mim, pois nela eu começei a aprender os conceitos básicos de
		Computação, principalmente o que era uma linguagem de programação e como escrever um algoritmo. 
		Quando eu entrei na faculdade eu não sabia nenhum desses conceitos.

	-MAC 122: PRINCÍPIOS DE DESENVOLVIMENTO DE ALGORÍTMOS
		Essa disciplina também foi bastante útil, já que os conceitos discutidos no ítem anterior foram
		aprofundados. Além disso, foi dada uma introdução em listas ligadas, algoritmos de busca, inserção
		e remoção nas mesmas e algoritmos recursivos. 

	-MAC 211: LABORATÓRIO DE PROGRAMAÇÃO I
		Nessa disciplina tópicos bastantes úteis foram ensinados, como as técnicas de depuração de programas
		e a modularização de código. Esses conceitos foram bastante utilizados por mim durante a implementação
		do software. 

	-MAC 242: LABORATÓRIO DE PROGRAMAÇÃO II
		Com essa disciplina eu tive uma breve introdução à orientação a objetos, além da
		compreensão do que são expressões regulares e geradores de analisadores léxicos e como os últimos podem
		ser utilizados, em especial o Flex. Isso foi extremamente crucial quando eu tive que fazer a uniformização
		do formato dos arquivos .scr e .geo, já que eu tive que utilizar um gerador de analisador léxico, o JLex.

	-MAC 323: ESTRUTURA DE DADOS
		Nessa disciplina aprendi como funcionam as listas ligadas, pilhas e filas e essas foram as principais
		estruturas de dados utilizadas no IGeom.

	-MAC 316: CONCEITOS FUNDAMENTAIS DE LINGUAGENS DE PROGRAMAÇÃO
		Nessa disciplina foi dada uma visão geral de todos os paradigmas presentes em linguagensde programação
		e os conceitos fundamentais a eles relacionados. Em especial, foi abordado o paradigma das linguagens 
		orientadas a objetos e ensinados os conceitos relacionados ao mesmo, tais como tipos abstratos de dados,
		módulos, herança e hierarquias.

	-MAC 328: ALGORITMO EM GRAFOS
		Eu tive que entender como é a estrutura de dados para representação de um grafo para entender como
		o dinamismo no IGeom era implementado. Além disso, eu tive que implementar uma busca em profundidade
		para que quando um objeto fosse removido, todos os que dele dependiam, isto é, estavam na lista de
		dependentes, também fossem.

	-MAC 332: ENGENHARIA DE SOFTWARE
		Essa disciplina foi bastante útil porque aprendi como se deve documentar um projeto e também as técnicas
		e modelagens para um projeto. Aprendi como identificar as classes de objetos e  suas subclasses, os 
		atributos e métodos de um objeto e como estabelecer as interfaces para o relacionamento entre objetos.
		Isso foi crucial para o IGeom, que é um software orientado a objetos.

	-MAC 414: LINGUAGENS FORMAIS E AUTÔMATOS
		Nessa disciplina foi discutido um pouco mais sobre expressões regulares e geradores de analisadores 
		léxicos.


7- Conclusão:

	Eu tenho certeza que este projeto levou-me a agregar muitas experiências, pois enfrentei muitas dificuldades 
	durante o seu desenvolvimento, mas, por outro lado, apliquei diversos conceitos estudados durante o curso, 
	solidificando-os. No começo foi uma experiência bastante complicada, já que para implementar as tarefas a mim
	designadas era fundamental a compreensão do código que havia sido desenvolvido anteriormente. O problema era
	que quando entrei no projeto o código já estava bastante extenso e com uma documentação precária. Além disso, 
	pouco depois de eu entrar no projeto, os dois alunos que trabalharam no iGeom estavam terminando suas atividades
	no projeto e, como resultado, tive pouca ajuda deles na compreensão do código. Por outro lado, o professor
	Leônidas sempre esteve disposto a orientar-me e tirar as dúvidas que iam aparecendo. 

	A minha única frustração é que nós não conseguimos atingir todas as metas estabelecidas no início do semestre.
	Mas, isso ocorreu principalmente porque pensávamos que seria muito mais simples implementar certas funcionalidades,
	que na realidade demandaram bastante tempo. 

	Outra dificuldade era o reaparecimento de erros que já tinham sido consertados quando eu ou o professor
	Leônidas implementávamos uma nova funcionalidade no software. 

	No entanto, apesar de todas as dificuldades enfrentadas, essa foi uma experiência extremamente valiosa para mim.
	Primeiramente, eu aprendi a linguagem Java e os conceitos relacionados a orientação a objetos, ambos extremamente
	úteis e importantes na computação atual. Também compreendi a importância da documentação de um projeto.
	Além disso, aprendi a enfrentar desafios, buscar soluções para os mesmos, e, principalmente, nunca desistir.
	Isso foi o que mais me marcou, pois em um projeto no mundo real sempre enfrentarei vários obstáculos.