Una forma sencilla y rápida de aprender JAVA, observando y deduciendo cómo se comporta el lenguaje a través de ejemplos prácticos.

Archivo del blog

viernes, 7 de diciembre de 2018

Graficando rosco del "Pasapalabra" (beta)


Desde Netbeans y en modo diseño se agrega un jFrame con la opción marcada "Grid Layout" y en propiedades activamos el check [v] undecorated. Se añade luego un jPanel, que servirá de lienzo para graficar. Algoritmo claramente mejorable de ahí que lo he puesto versión beta.


Código1 (Muro.java):

package pasapalabra;

public class Muro extends javax.swing.JFrame {
  
   public Muro() {
      initComponents();
      this.setBounds(0, 0, 512, 512);
      this.jPanel1.setBounds(0, 0, 512, 512);
      this.setLocationRelativeTo(null);
      this.repaint();
   }
                     
   private void initComponents() { ... }// Código generado automáticamente por Netbeans                      

   private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) {                                    
      double grados = 0;
      Dibujar t = new Dibujar(jPanel1.getGraphics(), this.jPanel1.getWidth() / 2, this.jPanel1.getHeight() / 2, grados);
      Instrucciones(t);
   }                                   
  
   public static void main(String args[]) {
      java.awt.EventQueue.invokeLater(() -> {
         new Muro().setVisible(true);
      });
   }
                  
   private javax.swing.JPanel jPanel1;         

   // Instrucciones tipo tortuga que dibuja
   private void Instrucciones(Dibujar t) {
      int n = 25;
      String letras = "GFEDCBAZYXVUTSRQPOÑNMLJIH";
      double x0, y0, r, grado;
     
      r = jPanel1.getWidth() / 2.5f;
     
      x0 = jPanel1.getWidth() / 2;
      y0 = jPanel1.getHeight() / 2;

      // Ángulo en radianes (importante)
      grado = (2 * Math.PI) / n;

      // Dibuja rosco pasapalabra
      t.gira(0);
      for (int i = 0; i < n; i++) {
         t.avanza(r);
         t.figura(letras.charAt(i));
         t.salta(x0, y0);
         t.gira(grado);
      }
   }
  
}


Código2 (Dibujar.java):

package pasapalabra;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;

public class Dibujar {

   double x, y, angulo;
   Graphics g;
   Graphics2D g2;
   Rectangle rect = new Rectangle();

   public Dibujar(Graphics g, double x, double y, double angulo) {
      this.x = x;
      this.y = y;
      this.angulo = angulo;
      this.g = g;

      g2 = (Graphics2D) g;
      // Filtro "antialiasing"
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
   }

   public void gira(double angulo) {
      this.angulo += angulo;
   }

   public void figura(char letra) {
      int r = 45; // Radio
      double x2 = x - (r / 2);
      double y2 = y - (r / 2);
      g.setColor(Color.BLUE);
      g.fillOval((int) x2, (int) y2, r, r);
      g.setColor(Color.WHITE);
      rect.setBounds((int) x2, (int) y2, r, r);
      centrarTexto(g, "" + letra, rect, new Font("", Font.BOLD, 26));
   }

   public void avanza(double distancia) {
      double x2 = x + distancia * Math.cos(angulo);
      double y2 = y - distancia * Math.sin(angulo);
      salta(x2, y2);
   }

   public void salta(double x, double y) {
      this.x = x;
      this.y = y;
   }

   private void centrarTexto(Graphics g, String texto, Rectangle r, Font f) {
      FontMetrics medir = g.getFontMetrics(f);
      int x = r.x + (r.width - medir.stringWidth(texto)) / 2;
      int y = r.y + ((r.height - medir.getHeight()) / 2) + medir.getAscent();
      g.setFont(f);
      g.drawString(texto, x, y);
   }

}


Resultado:




No hay comentarios:

Publicar un comentario

Con la tecnología de Blogger.