Neste projeto, vamos desenvolver applet na qual possa desenhar e visualizar algumas figuras geométricas simples, aperfeiçoando assim, a técnica de programação.
Vamos criar um applet na qual, desenha um quadrado, circulo e triangulo.
Para isso, vamos implementar classes classe base denominado de figuras
e usar polimorfísmo para poder desenhar e manipular figuras de forma
única.
A classe figura contém um ponto que serve como referência
para posição da figura, uma cor e dois métodos virtuais:
class figura { Point P; // ponto de referência da posição do objeto public Color cor; // cor da figura public void figura() { P = new Point(0,0); cor = new Color(0,0,0);} // construtor default public void figura(int x, int y) { P = new Point(x,y);} public void figura(int x, int y, Color cor) { P = new Point(x,y); this.cor = new Color(cor.getRed(), cor.getBlue(), cor.getGreen()); } public void figura(figura fig) { figura(fig.p.x, fig.p.y, fig.cor); } // métodos virtuais public bool pertence(Point P); public void desenha(Graphics g); // desenha a figura preenchida na saída Graphics }
Uma classe derivada da classe figura devem implementar o método pertence e desenha. Por exemplo, uma classe quadrado que possui dois pontos de referência (canto superior esquerdo e canto inferior direito) pode ser implementado como sendo
class retangulo extends figura { // P definido na super classe e o canto superior esquerdo Point Q; // canto inferior direito public void retangulo() { super(); Q = new Point(0,0); } // construtor default public void retangulo(int x1, int y1, int x2, int y2) { super(x1,y1); Q = new Point(x2,y2); } public void retangulo(int x1, int y2, int x2, int y2, color cor) { super(x1,y1,cor); Q = new Point(x2,y2); } public void retangulo(retangulo retang) { super(retang); Q = new Point(x2,y2); } // métodos virtuais public bool pertence(Point P) { return ( (this.P.x<=P.x)&&(P.x<=Q.x) && (this.P.y<=P.y)&&(P.y<=Q.y) ); } public void desenha(Graphics g) { // desenha a figura preenchido saída Graphics int coordx[]={P.x, P.x, Q.x, Q.x}; int coordy[]={P.y, Q.y, Q.y, P.y}; g.setcolor(cor); // seta a cor Polygon retang=new Polygon(coordx, coordy, 4); // retângulo é poligono de quatro vértices. g.fillPolygon(retang); } }
A classe Polygon e a classe de polígono e, é criado, passando dois vetores de interiros (lista de coordenadas X e Y respectivamente) e um inteiro, indicando o número de vértices. O método fillPolygon da classe Graphics desenha o poligono preenchido.
Exercício 1:
Agora implemente uma classe extendido de figura, denominado de circulo.
Lembre-se que:
A classe deve ter construtores similares a da classe retangulo.
Exercício 2:
Implemente também, a classe triangulo. lembre-se que:
Esta classe será implementado de forma quase igual ao retangulo.
Exercício 3:
Crie um applet para testar as três figuras acima e verifique
se pode criar e desenhar corretamente.
Agora, vamos criar classe denominado de desenho que compõe de um vetor de figuras, e métodos de manipulação.
Campo:
Inicialmente, queremos que seja capaz de armazenar figuras com rótulo
(nome) para facilitar a manipulação. Assim, esta classe deve
possuir dois vetores: um vetor de classe figura e outro de String para
guardar o nome correspondente. Claro, não devemos esquecer do número
de elementos.
Métodos:
class desenho { figura figs[]; // lista de desenhos String nomes[]; // lista dos nomes das figuras int numfigs; // número de figuras int maxfigs; // número máximo de figuras // construtor public desenho(){ figs=new figura[50]; nomes=new String[50]; numfigs=0; maxfigs=50; } public desenho(int numfigs) { figs=new figura[numfigs]; nomes=new String[numfigs]; this.numfigs=0; maxfigs=numfigs; } // métodos auxiliares. private int procura(String nomefig) { // retorna o índice da figura. // caso não for encontrado, retorna numfigs int i=0; for(i=0;i<numfigs;i++) if(nomes[i].equal(nomefig)) break; return i; } // insere figura. public bool adiciona(String nome, figura fig) { if(numfigs<maxfigs) { figs[numfigs]=new figura(fig); nomes[numfigs]=new String(nome); numfigs++; return true; } return false; } // elimina figura public bool elimina(String nome) { int i = procura(nome); if(i<numfigs) { for(;i<numfigs-1;i++) { figs[i]=figs[i+1]; nomes[i]=nomes[i+1]; numfigs--; } return true; } return false; } // desenha figura public void desenha(Graphics g) { int i; for(i=0;i<numfigs;i++) figs[i].desenha(g); } // encontra a primeira figura que contém (x,y) // retorna "" caso não existir public String pertence(int x, int y) { int i; for(i=numfigs-1;i>=0;i--) if(figs[i].pertence(x,y)) return nomes[i]; return new String(""); } // faz com que a figura indicada tenha primeira prioridade // fique por cima public void prioridade(String nome) { int i=procura(nome); figura tempfig; String tempnome; if(i<numfigs) { temp = figs[i]; tempnome = nomes[i]; for(;i<numfigs-1;i++) { figs[i] = figs[i+1]; nomes[i] = nomes[i+1]; } figs[i]=tempfig; nomes[i]=tempnome; } } // testa, se a figura se encontra public bool pertence(String nome) { return (procura(nome)<numfigs); } // este método retorna a figura com nome especificado, // caso não encontrar, gera uma excessão // "Ele não tira cópia!" public figura pegafigura(String nome) { int i = procura(nome); if(i<numfigs) return figs[i]; else { return trows NoSuchElementException; // definido no java.util // coloque import java.util.*; no começo do arquivo. } }
Exercício 1:
Analise a classe acima com cuidado e em seguida, faça um applet
para testar.
Exercício 2:
Faça com que o applet identifique a figura clicada pelo mouse
e coloca na primeira prioridade (desenhar por último). Para isso,
defina o método mouseDown();