Olá pessoal, este artigo trata de ensinar como desenhar uma estrela em Java 2D. Caso sinta dificuldade em compreender sobre java swing e Java 2D, bem como, desenhos em Java, recomendo o
seguinte artigo para ser estudado antes deste: desenhando-em-java. Então, vamos lá: O resultado final deve ficar conforme a figura abaixo: O painel de desenho tem uma posição na jenala, bem como, largura e altura. Por exemplo, o painel pode ter
500px de largura e 400px de altura. A estrela que queremos desenhar deve ficar centralizada no painel de desenho.
Veja abaixo um progótipo da geometria da estrela: Entenda que há um círculo dentro do outro, com ráio correspondente a metade do ráio do círculo maior. Perceba também que esses 2 circulos
foram divididos em 5 partes. Como o ângulo total de um circulo inteiro é 360º, cada fatia do círculo corresponde a 360/5, que é igual a 75º.
Logo cada fatia tem 1/5 dos círculos. Mas, você deve estar se perguntando: O que é que isso tem há ver com o desenho de uma estrela? Então, a estrela tem cinco pontas. Perceba que as linhas que dividem os círculos em 5 fatias poderiam ser as pontas de uma estrela
circunscrita no círculo maior. Agora, entenda a figura abaixo: Agora veja abaixo uma figura que ilustra melhor a geometria da estrela: Perceba que a figura acima tem 10 pontos laranjas. São eles que devem ser as 10 coordenadas armazenadas em 2 vetores de 10 posições.
Se conseguirmos calcular as coordenadas desses pontos, a sequencia deles corresponde ao polígono representante da estrela que queremos
desenhar. Acima, o código fonte da parte lógica relacionada ao desenho da estrela centralizada. Perceba que foram definidos dois vetores de 10 posições para
armazenar as coordenadas X e Y dos pontos pintados de laranja na figura anterior. Nas variáveis "w" e "h" ficam armazenadas as dimensões do painel e
nas variáveis "x" e "y", ficam as coordenadas do centro do painel de desenho. Perceba que os dois raios: "r1" e "r2", correspondem aos raios dos
círculos maior e menor, respectivamente. Perceba o ângulo 0º e o -90º. Queremos que nosso polígono começe com as coordenadas polares (r1, -90º)
ou (r1, -PI/2). Perceba também, a variável "ainc", que corresponde a 1/5 do ângulo total do círculo que é 360°. Logo, "ainc" é iqual a 75º, sendo que
o valor está em radianos no programa Java acima. Como 180° correspondem a PI, -90º correspondem a -PI/2. O for tem a variável "i" que varia de "0" a "4". Logo, em cada iteração, as variáveis "a" e "a2" assumem os seguintes valores: A expressão "i*2" corresponde, respectivamente em cada iteração, a: 0, 2, 4, 6, 8 A expressão "i*2+1" corresponde a: 1, 3, 5, 7, 9 Logo, veja agora cada ponto do polígono em coordenadas polares:
(r1,-90º),(r2,-52.5º),(r1,-15º),(r2,21.5º),(r1,60º),(r2,107.5°),(r1,135º),(r2,172.5º),(r1,210º),(r2,247.5º) Para converter de coordenadas polares para cartesianas, basta seguir as seguintes fórmulas: Por isso essas fórmulas foram utilizadas em: Onde, o raio é "r1", e o ângulo é "a", e os valores "x" e "y" são somados as coordenadas cartesianas para centralizar a estrela.
Os valores das coordenadas encontradas com a aplicação das fórmulas é armazenado em "xvet[i*2]", que corresponde a "X" na fórmula, e
em "yvet[i*2]", que corresponde a "Y" na fórmula de conversão de coordenadas polares para cartesianas. A seguir o código completo da classe que desenha a estrela e, também, de uma thread que altera o valor de "ainicial",
que inicia em -90º, de modo a rotacionar a figura e, fazendo assim, uma animação com a rotação da estrela: Experimente colocar o código acima numa classe Java, compilar e rodar para ver o resultado! É isso pessoal, até a próxima! e, em Quadrado, a chamada de qualquer um
desses métodos seta, tanto a base quanto a altura, com o mesmo valor. Dado isto,
analise o código da classe Testador. Perceba que o método "teste" dela
recebe uma instância de Retangulo como parâmetro. No entanto, se uma instância
de Quadrado for passada como parâmetro, uma exceção é lançada. Dado isto,
podemos chegar a conclusão que não é uma boa ideia, nesse exemplo, fazer
Quadrado extender Retangulo! Uma possível solução de refatoramento
é mostrada logo abaixo:
Perceba agora que a responsabilidade para alterar os atributos das classes Quadrado e
Retangulo foi passada para o método "main" da classe Principal. Inclusive, o
método "teste" da classe Testador também foi alterado para receber, agora, uma
Figura, que pode ser uma instância de Quadrado ou Retangulo, e um
valor esperado para testar. No método "main", agora é passado o valor esperado
como parâmetro para o método "teste".
Agora, vamos ver o Interface Segregation Principle (ou Princípio da Segregação
de Interface). Esse, princípio também é simples de entender. A ideia é evitar que
interfaces sejam implementadas com métodos vazios na classe derivada. Veja o
exemplo abaixo:
O cachorro é um animal, e ele nada e caminha. Por isso, os dois métodos da interface Animal
são implementados pela classe Cachorro. No entanto, o cavalo é também um Animal,
só que não nada! Por isso, o método "nada" da classe Cavalo está vazio. Então, há no
código acima uma violação ao Princípio da Segregação de Interface. Onde deve-se atribuir
a cada interface, apenas os métodos que serão herdados por todas as suas classes derivadas!
Veja abaixo como ficaria então a alteração para não violar o princípio:
Perceba agora que foi criada mais uma interface: A interface AnimalQueNada.
Dado que esta herda de Animal, herdando também seu método "caminha".
Logo, a classe Cachorro deve implementar a interface AnimalQueNada e a
classe Cavalo deve implementar a interface Animal, evitando assim a
sobrescrita com métodos vazios.
Agora, vamos ao último princípio: O Dependency Inversion Principle (Princípio da
Inversão de Dependência). Esse princípio pode visto como o seguinte:
A inversão de dependência está na dependência da abstração, ao invés da
depencência direta da classe com a implementação concreta. Agora vamos analisar
o exemplo de código abaixo:
Perceba no código acima que o módulo de mais baixo nível é a classe Pintor e a
classe de mais alto nível é a classe PainelDesenho. Perceba que a classe
PainelDesenho depende da implementação, isto é, da classe concreta Pintor.
Logo, se quisessemos mudar o desenho de "desenhaQuadrado" para "desenhaCirculo",
seria necessário alterar em PainelDesenho A seguinte linha:
Isto é um problema porque o ideal é não necessitar mexer na classe PainelDesenho
para alterar o desenho a ser mostrado. Dado o problema, vamos ao exemplo que resolve o
problema, respeitando ao princípio da inversão de dependência por criar uma abstração
dos "desenhos":
Assim, se precisarmos alterar o desenho, basta fazer sem depender de alterações na classe
PainelDesenho. Por exemplo, apenas passando para o método "setDesenho" da classe
PainelDesenho o devido desenho que deve ser mostrado, conforme acontece no método
"main" da classe Principal!
Chegamos ao final de mais um artigo. Este foi sobre os princípios S.O.L.I.D.
Até o próximo!
(Oloruntoba, S) - SOLID: os primeiros 5 princípios do design orientado a objeto.
Acessado em: 27/10/2023. Disponível em:
https://www.digitalocean.com/community/conceptual-articles/s-o-l-i-d-the-first-five-principles-of-object-oriented-design-pt
(Dirani, L) - Princípio da Substituição de Liskov (LSP).
Acessado em: 27/10/2023. Disponível em:
https://medium.com/fora-de-assunto/princ%C3%ADpio-da-substitui%C3%A7%C3%A3o-de-liskov-lsp-78628484e97d
(Paixão, J) - O que é SOLID: O guia completo para você entender os 5 princípios da POO.
Acessado em: 27/10/2023. Disponível em:
https://medium.com/desenvolvendo-com-paixao/o-que-%C3%A9-solid-o-guia-completo-para-voc%C3%AA-entender-os-5-princ%C3%ADpios-da-poo-2b937b3fc530
o método main está a instanciação dos decoradores.
Esse código desenha um retângulo, um losango e um círculo, formando uma
figura semelhante a bandeira do Brasil. Veja abaixo o resultado:
Decoradores de desenhos - Bandeira do Brasil
Agora veja o resultado com a pequena alteração abaixo no método "main":
DesenhoDecorator decorator = new TelaDesenho();
decorator = new RetanguloDesenho( decorator, 300, 250, Color.WHITE );
decorator = new CirculoDesenho( decorator, 75, Color.RED );
Decoradores de desenhos - Bandeira do Japão
Abaixo o link de download do código fonte do projeto que desenha uma bandeira.
Link de download:
decorator-exemplo.zip
Após baixar o projeto, você pode compilar se estiver com o JDK. Então, use a linha de comandos
para entrar na pasta base do projeto descompactado e utilize o seguinte comando para compilar:
javac -d bin src/bandeira/desenho/*.java src/bandeira/*.java
Agora para rodar, basta utilizar o seguinte comando:
java -cp bin bandeira.BandeiraMain
Baixe, compile e rode o projeto e experimente adicionar novos decoradores, ou remover
decoradores encadeados ou, mesmo, alterar a ordem das instâncias e teste novamente para
ver que gráfico é gerado!
Finalizando...
Esse é o final de mais um artigo sobre padrões de projeto. Desta vez, o
padrão decorator foi discutido aqui. Espero que tenham
gostado e, até o próximo!
1435
Escrito por:
Ítalo Herbert
Última alteração feita em:
25/10/2024 19:37:57
Tags relacionadas:
decorator, prog, programação, java, padrão, design, patterns,
qualidade, código
Você também pode gostar:
Desenho da bandeira do BrasilPadrão SingletonPadrão ObserverPrincípios SOLIDDesenhando em Java
Deixe seu comentário
Nome:
E-Mail:
Comentario: obrigatório
Mostrar na lista de comentários
Código de verificação:
Digite o código: obrigatório
Enviar
Limpar
Comentários postados: Nenhum comentario visível postado até o momento, deixe o seu!
Política de privacidade
Produzido por Ítalo Herbert
0