Hola a tod@s y gracias por tomarse el tiempo de leer
estoy diseñando un pequeño programa que grafique la curva de koch de manera recursiva pero me encontré con un problema
al compilar eclipse me vota el siguiente error:
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
consulte en la pagina de sun acerca de este bug y dice que es generado por una recursion infinita, pero no he podido hallar la forma en que esa recursion infinita se da.. anexo el codigo para que por fvor me ayuden..
la funcion esta en la clase Koch y se llama kochRecursivo(double, int)..
el objeto de tipo Cursor funciona bien, ya que cuando kochRecursivo recibe como parametro entero un 0, el dibuja la linea que quiero que dibuje... cuando quiero que utilice la recursion... FALLA!!!
************************
import java.awt.*;
import javax.swing.*;
public class Cursor
{
private double x;//refiere a la coordenada en x a graficar
private double y;//refiere a la coordenada en y a graficar
private double angulo;//refiere al angulo de giro representado en gradianes
private Color color; //modifica el color de la grafica
private Graphics g;// objeto que permite graficar
public Cursor ()
{
x=0.0;//inicializacion de las variables en valores válidos
y=0.0;
angulo=0.0;
this.color=Color.black;
}
public void definirInicio(double x,double y,double angulo,Graphics g)
{
//situa el cursor en el origen del plano y brinda la interfaz para graficar
this.x=x;
this.y=y;
this.angulo=angulo*Math.PI/180;
this.g=g;
}
public void CambiarColor(Color color)
{
//funcion que perimiote cambiar el color de la grafica
this.color=color;
}
public void Girar(double angulo)
{
//cambia el angulo del cursor
//recibe grados hexagecimales y los convierte a radianes
this.angulo=angulo*Math.PI/180;
}
public void nuevaPosicion(double x, double y)
{
//coloca el cursor al final de un trazo
this.x=x;
this.y=y;
}
public void trazar(double distancia)
{
//dibuja una linea de un color especifico
//desde la coordenada inicial (x,y) hasta una nueva coordenada
//(coorx,coordy) definida segun la longitud del trazo
double coordx = x + (distancia*Math.cos(angulo));//distancia convertida a abcisa (como si fueran polares)
double coordy = y + (distancia*Math.sin(angulo));//distancia convertida a ordenada (como si fueran polares)
g.setColor(color);//cambio del color
g.drawLine((int)coordx,(int)coordy,(int)x,(int)y);//trazo de la linea
nuevaPosicion(coordx,coordy);//coloca el cursor al final del trazo
}
public void putPixel (double x, double y)
{
g.setColor(color);
g.drawLine((int)x,(int)y,(int)x,(int)y);
}
}
************************************************
import java.awt.*;
import javax.swing.*;
public class Koch extends JFrame
{
Cursor tortuga;
public Koch()
{
tortuga = new Cursor();
setSize(500,500);
setVisible(true);
}
public void paint (Graphics g)
{
super.paint(g);
tortuga.definirInicio(50,250,0,g);
kochRecursivo(300.0,1);
}
public void kochRecursivo(double distancia,int nivel)
{
if(nivel==0)
{
tortuga.trazar(distancia);
}
else
{
kochRecursivo(distancia/3,nivel--);
tortuga.Girar(60);
kochRecursivo(distancia/3,nivel--);
tortuga.Girar(-120);
kochRecursivo(distancia/3,nivel--);
tortuga.Girar(60);
kochRecursivo(distancia/3,nivel--);
}
}
public static void main (String [] args)
{
Koch aplicacion = new Koch();
aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON _CLOSE);
}
}
***********************************************