Esta vez crearemos un nuevo proyecto que consiste en una pequeña animación de un fractal tipo arbol. Se juega con el grosor de las "ramas", los grados de inclinación entre ellas y una velocidad de animación no constante (descelerada). Para ello como va siendo habitual usando Netbeans creamos un nuevo proyecto en el cual se utiliza un jFrame donde se le añade un jButton y un jPanel.
Codigo 1 (Principal.java)
package Animacio4;
public class Principal extends javax.swing.JFrame {
int grados = 0; //Inclinación arbol
int depth = 9; //Profundidad de las ramas
double sep = 0; //Grados de separacion entre ramas
public Principal() {
initComponents();
this.setLocationRelativeTo(null); //Centrar pantalla
}
private void initComponents() { ... }
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
grados = 0;
sep = 0;
for (int i = 0; i > -90; i--) {
sep = (sep < 90) ? sep += 0.333 : sep;
Dibujo.Dibujar(
jPanel1.getGraphics(),
jPanel1.getWidth() / 2,
jPanel1.getHeight(),
grados -= 1,
depth,
sep);
try {
Thread.sleep((int) sep); //Velocidad de la animación
} catch (InterruptedException ex) {
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2 (Dibujo.java):
package Animacio4;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
public class Dibujo {
public static void Dibujar(Graphics g, int x1, int y1, double angle, int depth, double sep) {
//Salir cuando la profundidad a llegado al limite
if (depth == 0) return;
//Borra jPanel
if (depth == 9) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, x1 * 2, y1);
}
Graphics2D g2 = (Graphics2D) g;
//Tipo de pincel (grosor)
Stroke stroke = new BasicStroke((float) depth);
g2.setStroke(stroke);
//Color azul
g.setColor(Color.blue);
//Filtro antialiasing
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
//Calculo coordenadas
int x2 = x1 + (int) (Math.cos(Math.toRadians(angle)) * depth * 5.0);
int y2 = y1 + (int) (Math.sin(Math.toRadians(angle)) * depth * 5.0);
//Dibuja linia
g2.drawLine(x1, y1, x2, y2);
//Dibuja bifurcaciones (recursivo)
Dibujar(g2, x2, y2, (angle - (sep)), depth - 1, sep);
Dibujar(g2, x2, y2, (angle + (sep)), depth - 1, sep);
}
}
Resultado:
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.
lunes, 21 de abril de 2014
domingo, 20 de abril de 2014
Gráficos en 2D. Dibujar una casa mediante método tortuga de Logo.
Logo era una aplicación que consistia en un cursor gráfico (llamado tortuga) que mediante unas instrucciones que le ibamos dando nos creaba un dibujo.
Creamos un nuevo proyecto de tipo JFrame y de nombre "Principal". En vista de diseño se agrega un jButton y un jPanel. Y finalmente se crea una nueva clase que se llame "Tortuga".
Codigo 1 (Principal.java):
package Tortuga;
public class Principal extends javax.swing.JFrame {
Tortuga t;
public Principal() {
initComponents();
this.setLocationRelativeTo(null);
t = new Tortuga(
jPanel1.getGraphics(),
jPanel1.getWidth() / 2,
jPanel1.getHeight() - 20, 0);
}
private void initComponents() { ... }
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
//Instrucciones tipo tortuga que dibuja una casa.
t.gira(0);
t.traza(100);
t.gira(90);
t.traza(100);
t.gira(45);
t.traza(100);
t.gira(90);
t.traza(100);
t.gira(45);
t.traza(100);
t.gira(90);
t.traza(50);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2 (Tortuga.java):
package Tortuga;
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
public class Tortuga {
double x, y, angulo;
Graphics g;
public Tortuga(Graphics g, double x, double y, double angulo) {
this.x = x;
this.y = y;
this.angulo = angulo * Math.PI / 180;
this.g = g;
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);//Filtro antialiasing
g2.setStroke(new BasicStroke((float) 5)); //Grosor pincel
}
public void gira(double angulo) {
this.angulo += angulo * Math.PI / 180;
}
public void traza(double distancia) {
double x2 = x + distancia * Math.cos(angulo);
double y2 = y - distancia * Math.sin(angulo);
g.drawLine((int) x2, (int) y2, (int) x, (int) y);
salta(x2, y2);
}
public void salta(double x, double y) {
this.x = x;
this.y = y;
}
}
Resultado:
Creamos un nuevo proyecto de tipo JFrame y de nombre "Principal". En vista de diseño se agrega un jButton y un jPanel. Y finalmente se crea una nueva clase que se llame "Tortuga".
Codigo 1 (Principal.java):
package Tortuga;
public class Principal extends javax.swing.JFrame {
Tortuga t;
public Principal() {
initComponents();
this.setLocationRelativeTo(null);
t = new Tortuga(
jPanel1.getGraphics(),
jPanel1.getWidth() / 2,
jPanel1.getHeight() - 20, 0);
}
private void initComponents() { ... }
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
//Instrucciones tipo tortuga que dibuja una casa.
t.gira(0);
t.traza(100);
t.gira(90);
t.traza(100);
t.gira(45);
t.traza(100);
t.gira(90);
t.traza(100);
t.gira(45);
t.traza(100);
t.gira(90);
t.traza(50);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2 (Tortuga.java):
package Tortuga;
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
public class Tortuga {
double x, y, angulo;
Graphics g;
public Tortuga(Graphics g, double x, double y, double angulo) {
this.x = x;
this.y = y;
this.angulo = angulo * Math.PI / 180;
this.g = g;
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);//Filtro antialiasing
g2.setStroke(new BasicStroke((float) 5)); //Grosor pincel
}
public void gira(double angulo) {
this.angulo += angulo * Math.PI / 180;
}
public void traza(double distancia) {
double x2 = x + distancia * Math.cos(angulo);
double y2 = y - distancia * Math.sin(angulo);
g.drawLine((int) x2, (int) y2, (int) x, (int) y);
salta(x2, y2);
}
public void salta(double x, double y) {
this.x = x;
this.y = y;
}
}
Resultado:
viernes, 4 de abril de 2014
Imágenes. Guardar una imagen previamente modificada.
Creamos un nuevo proyecto y en vista de diseño se agrega un jButton y un jPanel.
Codigo1 (Principal.java):
package Recortar;
public class Principal extends javax.swing.JFrame {
public Principal() {
initComponents();
this.setLocationRelativeTo(null);
}
private void initComponents() { ... }
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
Imagen im = new Imagen(jPanel1);
jPanel1.add(im).repaint();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2 (Imagen.java):
package Guardar;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Imagen extends javax.swing.JPanel {
int x, y;
public Imagen(JPanel jPanel1) {
this.x = jPanel1.getWidth();
this.y = jPanel1.getHeight();
this.setSize(x, y);
}
@Override
public void paint(Graphics g) {
try {
// Se carga la imagen original
BufferedImage imagen;
File f = new File("src/Images/imagen1.png");
imagen = ImageIO.read(f);
Graphics2D g2 = (Graphics2D) imagen.getGraphics();
// Se modifica la imagen original
Stroke stroke = new BasicStroke((float) 20); // Grosor pincel
g2.setStroke(stroke);
g2.setColor(Color.RED);
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON); // Filtro antialiasing
g2.drawLine(0, 0, imagen.getWidth(), imagen.getHeight()); // Línea diagonal
// Se guarda la imagen y se imprime en el jPanel
ImageIO.write(imagen, "png", new File("imagen2.png"));
g.drawImage(imagen, 0, 0, this);
} catch (IOException ex) { }
}
}
Resultado:
Codigo1 (Principal.java):
package Recortar;
public class Principal extends javax.swing.JFrame {
public Principal() {
initComponents();
this.setLocationRelativeTo(null);
}
private void initComponents() { ... }
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
Imagen im = new Imagen(jPanel1);
jPanel1.add(im).repaint();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2 (Imagen.java):
package Guardar;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Imagen extends javax.swing.JPanel {
int x, y;
public Imagen(JPanel jPanel1) {
this.x = jPanel1.getWidth();
this.y = jPanel1.getHeight();
this.setSize(x, y);
}
@Override
public void paint(Graphics g) {
try {
// Se carga la imagen original
BufferedImage imagen;
File f = new File("src/Images/imagen1.png");
imagen = ImageIO.read(f);
Graphics2D g2 = (Graphics2D) imagen.getGraphics();
// Se modifica la imagen original
Stroke stroke = new BasicStroke((float) 20); // Grosor pincel
g2.setStroke(stroke);
g2.setColor(Color.RED);
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON); // Filtro antialiasing
g2.drawLine(0, 0, imagen.getWidth(), imagen.getHeight()); // Línea diagonal
// Se guarda la imagen y se imprime en el jPanel
ImageIO.write(imagen, "png", new File("imagen2.png"));
g.drawImage(imagen, 0, 0, this);
} catch (IOException ex) { }
}
}
Resultado:
jueves, 3 de abril de 2014
Imágenes. Recortar parte de una imagen.
Creamos un nuevo proyecto y en vista de diseño se agrega un jButton y un jPanel.
Codigo1 (Principal.java):
package Recortar;
public class Principal extends javax.swing.JFrame {
public Principal() {
initComponents();
this.setLocationRelativeTo(null);
}
private void initComponents() { ... }
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
Imagen im = new Imagen(jPanel1);
jPanel1.add(im).repaint();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2 (Imagen.java):
package Recortar;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Imagen extends javax.swing.JPanel {
int x, y;
public Imagen(JPanel jPanel1) {
this.x = jPanel1.getWidth();
this.y = jPanel1.getHeight();
this.setSize(x, y);
}
@Override
public void paint(Graphics g) {
BufferedImage imagen, recorte;
try {
File f = new File("src/Images/imagen1.png");
imagen = ImageIO.read(f);
g.drawImage(imagen, 0, 0, this);
recorte = ((BufferedImage) imagen).getSubimage(150, 150, 150, 150);
g.drawImage(recorte, 0, 0, this);
} catch (IOException ex) { }
}
}
Resultado:
Codigo1 (Principal.java):
package Recortar;
public class Principal extends javax.swing.JFrame {
public Principal() {
initComponents();
this.setLocationRelativeTo(null);
}
private void initComponents() { ... }
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
Imagen im = new Imagen(jPanel1);
jPanel1.add(im).repaint();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2 (Imagen.java):
package Recortar;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Imagen extends javax.swing.JPanel {
int x, y;
public Imagen(JPanel jPanel1) {
this.x = jPanel1.getWidth();
this.y = jPanel1.getHeight();
this.setSize(x, y);
}
@Override
public void paint(Graphics g) {
BufferedImage imagen, recorte;
try {
File f = new File("src/Images/imagen1.png");
imagen = ImageIO.read(f);
g.drawImage(imagen, 0, 0, this);
recorte = ((BufferedImage) imagen).getSubimage(150, 150, 150, 150);
g.drawImage(recorte, 0, 0, this);
} catch (IOException ex) { }
}
}
Resultado:
Imágenes. Poner un filtro a una imagen.
Este nuevo proyecto consta de un jButton, un jPanel y una imagen cualquiera (.png).
Este ejemplo es parecido al anterior pero cargando la imagen con "BufferedImage", para luego crear un "filtro" mediante modificación del color de pixeles de la imagen.
Codigo (Principal.java):
package Filtro1;
public class Principal extends javax.swing.JFrame {
public Principal() {
initComponents();
this.setLocationRelativeTo(null);
}
private void initComponents() { ... }
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
Imagen im = new Imagen(jPanel1);
jPanel1.add(im).repaint();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2 (imagen.java):
package Filtro1;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Imagen extends javax.swing.JPanel {
int x, y;
public Imagen(JPanel jPanel1) {
this.x = jPanel1.getWidth();
this.y = jPanel1.getHeight();
this.setSize(x, y);
}
@Override
public void paint(Graphics g) {
try {
BufferedImage image = ImageIO.read(new File("src/Images/imagen1.png"));
int color;
for (int j = 0; j < image.getHeight(); j = j + 2) {
for (int i = x / 2; i < image.getWidth(); i++) {
color = image.getRGB(i, j);
image.setRGB(i, j, color - 150);
}
}
g.drawImage(image, 0, 0, this);
} catch (IOException ex) {
Logger.getLogger(Imagen.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Resultado:
Este ejemplo es parecido al anterior pero cargando la imagen con "BufferedImage", para luego crear un "filtro" mediante modificación del color de pixeles de la imagen.
Codigo (Principal.java):
package Filtro1;
public class Principal extends javax.swing.JFrame {
public Principal() {
initComponents();
this.setLocationRelativeTo(null);
}
private void initComponents() { ... }
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
Imagen im = new Imagen(jPanel1);
jPanel1.add(im).repaint();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2 (imagen.java):
package Filtro1;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Imagen extends javax.swing.JPanel {
int x, y;
public Imagen(JPanel jPanel1) {
this.x = jPanel1.getWidth();
this.y = jPanel1.getHeight();
this.setSize(x, y);
}
@Override
public void paint(Graphics g) {
try {
BufferedImage image = ImageIO.read(new File("src/Images/imagen1.png"));
int color;
for (int j = 0; j < image.getHeight(); j = j + 2) {
for (int i = x / 2; i < image.getWidth(); i++) {
color = image.getRGB(i, j);
image.setRGB(i, j, color - 150);
}
}
g.drawImage(image, 0, 0, this);
} catch (IOException ex) {
Logger.getLogger(Imagen.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Resultado:
martes, 1 de abril de 2014
Imágenes. Mostrar imagen dentro un jPanel.
Se crea un nuevo proyecto en Netbeans y en vista de diseño se agrega un jButton y un jPanel.
Una vez hecho esto se crea una nueva carpeta llamada "Images". Dentro esta carpeta le agregamos una imagen en formato .PNG (se inserta directamente arrastrando la imagen a la carpeta).
Codigo 1. (Principal.java):
package Imagen1;
public class Principal extends javax.swing.JFrame {
public Principal() {
initComponents();
this.setLocationRelativeTo(null); // Centrar pantalla
}
private void initComponents() { ... } // Codigo generado automaticamente.
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
Imagen im = new Imagen(jPanel1);
jPanel1.add(im).repaint();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2. (Imagen.java):
package Imagen1;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Imagen extends javax.swing.JPanel {
int x, y;
public Imagen(JPanel jPanel1) {
this.x = jPanel1.getWidth();
this.y = jPanel1.getHeight();
this.setSize(x, y);
}
@Override
public void paint(Graphics g) {
ImageIcon Img = new ImageIcon(getClass().getResource("/Images/imagen1.png"));
g.drawImage(Img.getImage(), 0, 0, x, y, null);
}
}
Resultado:
Una vez hecho esto se crea una nueva carpeta llamada "Images". Dentro esta carpeta le agregamos una imagen en formato .PNG (se inserta directamente arrastrando la imagen a la carpeta).
Codigo 1. (Principal.java):
package Imagen1;
public class Principal extends javax.swing.JFrame {
public Principal() {
initComponents();
this.setLocationRelativeTo(null); // Centrar pantalla
}
private void initComponents() { ... } // Codigo generado automaticamente.
private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {
Imagen im = new Imagen(jPanel1);
jPanel1.add(im).repaint();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonIniciar;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Codigo 2. (Imagen.java):
package Imagen1;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Imagen extends javax.swing.JPanel {
int x, y;
public Imagen(JPanel jPanel1) {
this.x = jPanel1.getWidth();
this.y = jPanel1.getHeight();
this.setSize(x, y);
}
@Override
public void paint(Graphics g) {
ImageIcon Img = new ImageIcon(getClass().getResource("/Images/imagen1.png"));
g.drawImage(Img.getImage(), 0, 0, x, y, null);
}
}
Resultado:
Suscribirse a:
Entradas (Atom)
Con la tecnología de Blogger.