
Hola, hace tiempo no me pasaba por la página, en esta ocasión les traigo un tutorial de como realizar Árboles Fractales en Java.
Si no estás familiarizado con el término, visita el siguiente post: Fractales
El resultado que obtendremos será el siguiente:
Aquí les dejo el proyecto en GitLab para los que quieran clonarlo:
https://gitlab.com/pptavo/ArbolFractal
Tutorial: Importar Proyecto Git a Netbeans
Empecemos el turorial:
En este tutorial explicaré solo los métodos de creación de fractales que se encuentran en el proyecto antes mencionado.
En la clase Arbol.java
Encontramos el siguiente constructor:
el cual asigna a la variable xi (que contiene la posicion inicial en X del árbol) como el tamaño de ancho del panel contenedor dividido entre 2.
A la variable yi que contiene la posicion inicial en Y del arbol se le asigna el alto total del contenedor, para de esta manera, situarlo en la parte inferior del jPanel.
las variables tamanoi y anguloi se refieren al tamaño y posición angular del tronco del árbol, es decir, el tronco principal se encuentra a 90º negativos (en contra de las manecillas del reloj) y mide 50 pixeles de alto.
El método iniciar()
[java]private void iniciar(){
profundidadi = sliderprof.getValue();
Graphics g = jPanel1.getGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, jPanel1.getWidth(), jPanel1.getHeight());
Dibujar(g, xi, yi, anguloi, profundidadi, tamanoi);
}[/java]
Obtiene el objeto Graphics de nuestro jPanel contenedor, y lo pinta de negro, enseguida llama al método Dibujar.
Método Dibujar() :
[java]private void Dibujar(Graphics g, int x1, int y1, double angulo, int profundidad, int tamano) {
if (profundidad == 0) return;
Graphics2D g2 = (Graphics2D) g;
g.setColor(Color.GREEN);
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);//Filtro antialiasing
int x2 = x1 + (int) (Math.cos(Math.toRadians(angulo)) * tamano);
int y2 = y1 + (int) (Math.sin(Math.toRadians(angulo)) * tamano);
g2.drawLine(x1, y1, x2, y2);
Dibujar(g2, x2, y2, angulo – 20, profundidad – 1, (int) (tamano*.9));
Dibujar(g2, x2, y2, angulo + 20, profundidad – 1, (int) (tamano*.9));
}[/java]
Éste es un método recursivo (se llama a sí mismo), lo que hace es obtener las componentes en X y en Y segun el ángulo y hacer una linea desde x1,y1 hasta x2,y2, luego manda llamarse 2 veces (el árbol va creando 2 ramas nuevas en cada nivel), la rama izquierda le resta 20 grados al angulo, y la rama derecha le suma 20, así como le va restando un 10% a su longitud.
Éste método dibujaría el arbol completo dependiendo de cuantos niveles de profundidad escojamos, será el tiempo que tarde en dibujarlo completamente.
Excelente