DEFLNG W DIM SemiPerm$(200): DIM NombreSemiPerm$(200) MaxBezier = 2000 DIM PuntDefCurv(500, 3): DIM PuntoBezier(MaxBezier, 3) DIM DistanciaBezier(MaxBezier) DIM PuntEquiDist(500, 3) DIM NumEnGeneracion(10) DIM ObjetoFrac(20) Pi = 4 * ATN(1): Phi = (1 + SQR(5)) / 2 RANDOMIZE TIMER GOSUB Bienvenida CLS INPUT "DOS path to store the files (with final backslash)"; Camino$ INPUT "Name of the source file (without path nor extension)"; ArbolGrabado$ GOSUB Principal END AngulosMedianos: GOSUB PlanoAcimut CoordDerecha1 = PuntDefCurv(PuntoActual, Derecha) CoordDerecha2 = PuntDefCurv(PuntoAnterior, Derecha) CoordDelante1 = PuntDefCurv(PuntoActual, Delante) CoordDelante2 = PuntDefCurv(PuntoAnterior, Delante) CoordArriba1 = PuntDefCurv(PuntoActual, Arriba) CoordArriba2 = PuntDefCurv(PuntoAnterior, Arriba) GOSUB DeRectAPolar3D Acimut1 = Acimut: Distancia1 = Distancia: AngArriba1 = AngArriba CoordDerecha1 = PuntDefCurv(PuntoPosterior, Derecha) CoordDerecha2 = PuntDefCurv(PuntoActual, Derecha) CoordDelante1 = PuntDefCurv(PuntoPosterior, Delante) CoordDelante2 = PuntDefCurv(PuntoActual, Delante) CoordArriba1 = PuntDefCurv(PuntoPosterior, Arriba) CoordArriba2 = PuntDefCurv(PuntoActual, Arriba) GOSUB DeRectAPolar3D Acimut2 = Acimut: Distancia2 = Distancia: AngArriba2 = AngArriba AcimutMedio = (Acimut1 + Acimut2) / 2 IF ABS(Acimut1 - Acimut2) > Pi THEN AcimutMedio = AcimutMedio + Pi Angulo = AcimutMedio: GOSUB SuperiorAPi: AcimutMedio = Angulo END IF AngArribMedio = (AngArriba1 + AngArriba2) / 2 RETURN ArchivoEscrito: CLS OKGrabacion$ = "no" WHILE OKGrabacion$ <> "s¡" IF ArchivoEscrito$ = "" THEN INPUT "Archivo resultado (sin camino ni extension)"; ArchivoEscrito$ ArchivoEscrito$ = Camino$ + ArchivoEscrito$ + ".cbb" END IF OPEN "R", #2, ArchivoEscrito$, 1 FIELD #2, 1 AS e$ IF LOF(2) <> 0 THEN CLOSE #2 KILL ArchivoEscrito$ OPEN "R", #2, ArchivoEscrito$, 1 FIELD #2, 1 AS e$ OKGrabacion$ = "s¡" ELSE OKGrabacion$ = "s¡" END IF WEND wByteEscrito = 0 ArchivoEscrito$ = "" RETURN Bienvenida: CLS : COLOR 7, 0 PRINT " This program produces a fractal tree in the CBB format." COLOR 14, 0 PRINT " Take care: the fractal logic of this program leads to the" PRINT "construction of many files, that will be destroyed and replaced" PRINT "if you make the program run more than one time." COLOR 7, 0 PRINT PRINT " Copyright Jean-Luc Ancey, May 28th, 1997.": PRINT PRINT " Strike a key when ready." GOSUB EsperaTecla RETURN BuscaSemiPerm: LineaATratar$ = NombreSemiPerm$: GOSUB MayusculaInicial NombreSemiPerm$ = LineaATratar$ SemiPerm = 0: SemiPermEnc$ = "no" WHILE SemiPerm < NumSemiPerm AND SemiPermEnc$ = "no" SemiPerm = SemiPerm + 1 IF NombreSemiPerm$(SemiPerm) = NombreSemiPerm$ THEN SemiPermEnc$ = "s¡" END IF WEND IF SemiPermEnc$ <> "s¡" THEN PRINT "El variable "; NombreSemiPerm$; " no existe." GOSUB EsperaTecla END IF RETURN CabezaTipo: LineaEscrita$ = "<" + Tipo$ + ">": GOSUB GrabaUnaLinea RETURN CalculaTiradores: 'Tirador n§ 1 (anterior) IF PuntoDefCurva > 1 THEN CoordArriba = SIN(AngArribMedio + Pi) * Distancia1 / 3 DistParaRota = ABS(COS(AngArribMedio + Pi) * Distancia1 / 3) AngDespRota = AcimutMedio + Pi GOSUB DePolarARect Tirad1Derecha = PuntDefCurv(PuntoDefCurva, Derecha) + CoordDerecha2 Tirad1Delante = PuntDefCurv(PuntoDefCurva, Delante) + CoordDelante2 Tirad1Arriba = PuntDefCurv(PuntoDefCurva, Arriba) + CoordArriba PuntoBezier((PuntoDefCurva - 1) * 3, Derecha) = Tirad1Derecha PuntoBezier((PuntoDefCurva - 1) * 3, Delante) = Tirad1Delante PuntoBezier((PuntoDefCurva - 1) * 3, Arriba) = Tirad1Arriba END IF PuntoBezier((PuntoDefCurva - 1) * 3 + 1, Derecha) = PuntDefCurv(PuntoDefCurva, Derecha) PuntoBezier((PuntoDefCurva - 1) * 3 + 1, Delante) = PuntDefCurv(PuntoDefCurva, Delante) PuntoBezier((PuntoDefCurva - 1) * 3 + 1, Arriba) = PuntDefCurv(PuntoDefCurva, Arriba) 'Tirador n§ 2 (posterior) IF PuntoDefCurva < TotPuntCurvAb THEN CoordArriba = SIN(AngArribMedio) * Distancia2 / 3 DistParaRota = COS(AngArribMedio) * Distancia2 / 3 AngDespRota = AcimutMedio GOSUB DePolarARect Tirad2Derecha = PuntDefCurv(PuntoDefCurva, Derecha) + CoordDerecha2 Tirad2Delante = PuntDefCurv(PuntoDefCurva, Delante) + CoordDelante2 Tirad2Arriba = PuntDefCurv(PuntoDefCurva, Arriba) + CoordArriba PuntoBezier((PuntoDefCurva - 1) * 3 + 2, Derecha) = Tirad2Derecha PuntoBezier((PuntoDefCurva - 1) * 3 + 2, Delante) = Tirad2Delante PuntoBezier((PuntoDefCurva - 1) * 3 + 2, Arriba) = Tirad2Arriba END IF RETURN CierraArchivo: wByteEscrito = wByteEscrito + 1 LSET e$ = CHR$(26) PUT #2, wByteEscrito CLOSE RETURN ColaTipo: LineaEscrita$ = "": GOSUB GrabaUnaLinea RETURN DePolarARect: CoordDerecha2 = COS(AngDespRota) * DistParaRota CoordDelante2 = SIN(AngDespRota) * DistParaRota RETURN DeRectAPolar: IF CoordDerecha = 0 AND CoordDelante = 0 THEN AngAntRota = 0 ELSE IF ABS(CoordDerecha) >= ABS(CoordDelante) THEN AngAntRota = ATN(CoordDelante / CoordDerecha) IF CoordDerecha < 0 THEN AngAntRota = AngAntRota + Pi ELSE AngAntRota = ATN(CoordDerecha / CoordDelante) IF CoordDelante < 0 THEN AngAntRota = AngAntRota + Pi AngAntRota = Pi / 2 - AngAntRota END IF END IF DistParaRota = SQR(CoordDerecha * CoordDerecha + CoordDelante * CoordDelante) WHILE AngAntRota > Pi AngAntRota = AngAntRota - 2 * Pi WEND RETURN DeRectAPolar3D: GOSUB DeRectAPolar3DDist GOSUB DeRectAPolar3DAng RETURN DeRectAPolar3DAng: Acimut = AngAntRota AngArriba = ATN(CoordArriba / DistParaRota) RETURN DeRectAPolar3DDist: CoordDerecha = CoordDerecha1 - CoordDerecha2 CoordDelante = CoordDelante1 - CoordDelante2 CoordArriba = CoordArriba1 - CoordArriba2 GOSUB DeRectAPolar Distancia = SQR(DistParaRota * DistParaRota + CoordArriba * CoordArriba) RETURN EsperaTecla: Tecla$ = "" WHILE Tecla$ = "" Tecla$ = INKEY$ WEND RETURN FinModifCoord: LineaEscrita$ = "": GOSUB GrabaUnaLinea LineaEscrita$ = "Fin": GOSUB GrabaUnaLinea LineaEscrita$ = "": GOSUB GrabaUnaLinea RETURN GeneracionFractal: ObjetoFrac(Generacion) = ObjetoFrac IF Generacion < MaxGeneracion AND ObjetoFrac(Generacion + 1) < MaxObjFrac THEN Generacion = Generacion + 1: ObjetoFrac = 1 ELSE 'Tratamiento del objeto alcanzado ObjetoFrac$ = "" FOR Gene2 = 1 TO Generacion Valor = ObjetoFrac(Gene2): GOSUB TradValorCadena ObjetoFrac$ = ObjetoFrac$ + Cadena$ NEXT Gene2 GOSUB IncluyeSubElementos IF ObjetoFrac < MaxObjFrac THEN ObjetoFrac = ObjetoFrac + 1 FOR Gene2 = Generacion + 1 TO MaxGeneracion ObjetoFrac(Gene2) = 0 NEXT Gene2 ELSE ObjetoFrac(Generacion) = ObjetoFrac Generacion = Generacion - 1 ObjetoFrac = ObjetoFrac(Generacion) END IF END IF RETURN GrabaColor: LineaEscrita$ = "": GOSUB GrabaUnaLinea LineaEscrita$ = Color$: GOSUB GrabaUnaLinea LineaEscrita$ = "": GOSUB GrabaUnaLinea RETURN GrabaModifCoord: LineaEscrita$ = "Posi " Valor = x: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = y: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = z: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ GOSUB GrabaUnaLinea RETURN GrabaModifProp: LineaEscrita$ = "Tama " Valor = TamaX: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = TamaY: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = TamaZ: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ GOSUB GrabaUnaLinea RETURN GrabaNombre: LineaEscrita$ = "": GOSUB GrabaUnaLinea LineaEscrita$ = Nombre$: GOSUB GrabaUnaLinea LineaEscrita$ = "": GOSUB GrabaUnaLinea RETURN GrabaUnaLinea: PRINT LineaEscrita$ LineaEscrita$ = LineaEscrita$ + CHR$(13) + CHR$(10) FOR a = 1 TO LEN(LineaEscrita$) wByteEscrito = wByteEscrito + 1 LSET e$ = MID$(LineaEscrita$, a, 1) PUT #2, wByteEscrito NEXT a LineaEscrita$ = "" RETURN GrabaUnObjeto: LineaEscrita$ = "Posi " Valor = x: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = y: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = z: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," + Posicion$ + " Tama " Valor = TamaX: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = TamaY: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = TamaZ: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ IF Exclusion$ <> "" THEN LineaEscrita$ = LineaEscrita$ + " Excl " + Exclusion$ END IF Exclusion$ = "" IF Tipo$ = "esferas" OR Tipo$ = "cilindros" OR Tipo$ = "conos" THEN IF Puntos$ <> "" THEN LineaEscrita$ = LineaEscrita$ + " Punt " + Puntos$ Puntos$ = "" END IF END IF GOSUB GrabaUnaLinea RETURN GrabaUnPunto: Valor = NumPunto: GOSUB TradValorCadena LineaEscrita$ = Cadena$ + "," Valor = x: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = y: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = z: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ GOSUB GrabaUnaLinea RETURN GrabaUnSemiPerm: IF SemiPermEnc$ = "s¡" THEN SemiPerm$(SemiPerm) = SemiPermAGrabar$ ELSE NumSemiPerm = NumSemiPerm + 1 NombreSemiPerm$(NumSemiPerm) = NombreSemiPerm$ SemiPerm$(NumSemiPerm) = SemiPermAGrabar$ END IF RETURN Hoja: ArchivoEscrito$ = Camino$ + "hoja.cbb": GOSUB ArchivoEscrito Color$ = "120,0.8,0.7": GOSUB GrabaColor Tipo$ = "puntos": GOSUB CabezaTipo NumPunto = 1: x = 0: y = 0: z = 0: GOSUB GrabaUnPunto NumPunto = 2: x = -.3: y = .3: z = .1: GOSUB GrabaUnPunto NumPunto = 3: x = 0: y = 1: z = 0: GOSUB GrabaUnPunto NumPunto = 4: x = .3: y = .3: z = .1: GOSUB GrabaUnPunto GOSUB ColaTipo Tipo$ = "lados": GOSUB CabezaTipo LineaEscrita$ = "1,2,3": GOSUB GrabaUnaLinea LineaEscrita$ = "1,3,4": GOSUB GrabaUnaLinea GOSUB ColaTipo GOSUB CierraArchivo RETURN IncluyeObjeto: Tipo$ = "inclusion": GOSUB CabezaTipo LineaEscrita$ = Camino$ + Objeto$ + ".cbb": GOSUB GrabaUnaLinea GOSUB ColaTipo RETURN IncluyeRamita: Tipo$ = "modifcoord": GOSUB CabezaTipo Valor = VarianteInclinacion * RND: GOSUB TradValorCadena LineaEscrita$ = "Rotx " + Cadena$: GOSUB GrabaUnaLinea Valor = 360 * RND: GOSUB TradValorCadena LineaEscrita$ = "Rotz " + Cadena$: GOSUB GrabaUnaLinea GOSUB ColaTipo IF Generacion <> MaxGeneracion THEN Valor = Ramita: GOSUB TradValorCadena Objeto$ = "ram" + ObjetoFrac$ + Cadena$: GOSUB IncluyeObjeto ELSE Objeto$ = "punta": GOSUB IncluyeObjeto END IF GOSUB FinModifCoord RETURN IncluyeSubElementos: IF ObjetoFrac$ <> "" THEN ArchivoEscrito$ = Camino$ + "ram" + ObjetoFrac$ + ".cbb": GOSUB ArchivoEscrito ELSE ArchivoEscrito$ = Camino$ + ArbolGrabado$ + ".cbb": GOSUB ArchivoEscrito END IF IF Generacion <= 2 THEN Objeto$ = "troncopr": GOSUB IncluyeObjeto ELSE Objeto$ = "tronco": GOSUB IncluyeObjeto END IF Tipo$ = "modifcoord": GOSUB CabezaTipo 'Cambia las proporciones para pasar a otra generaci¢n TamaX = FactorGene: TamaY = FactorGene: TamaZ = FactorGene GOSUB GrabaModifProp 'Pone esta ramita encima de la de la generaci¢n anterior x = 0: y = 0: z = AltoTronco: GOSUB GrabaModifCoord GOSUB ColaTipo Ramita = 1: GOSUB IncluyeRamita GOSUB FinModifCoord FOR Ramita = 2 TO MaxObjFrac Tipo$ = "modifcoord": GOSUB CabezaTipo 'Cambia las proporciones para pasar a otra generaci¢n TamaX = FactorGene: TamaY = FactorGene: TamaZ = FactorGene GOSUB GrabaModifProp 'Da la inclinaci¢n a la rama Valor = -90 + AnguloRama: GOSUB TradValorCadena LineaEscrita$ = "Rotx " + Cadena$ GOSUB GrabaUnaLinea 'Pone las ramas en todas la direcciones Valor = (360 / (MaxObjFrac - 1)) * (Ramita - 2) 'M s una correci¢n aleatoria Valor = Valor + (RND * 2 - 1) * (360 / (MaxObjFrac - 1)) * VarianteDireccion GOSUB TradValorCadena LineaEscrita$ = "Rotz " + Cadena$ GOSUB GrabaUnaLinea 'Pone esta ramita encima de la de la generaci¢n anterior x = 0: y = 0: z = AltoTronco: GOSUB GrabaModifCoord GOSUB ColaTipo GOSUB IncluyeRamita GOSUB FinModifCoord NEXT Ramita GOSUB CierraArchivo RETURN LeeUnaLinea: LineaLeida$ = "" FinDeLinea$ = "no" WHILE FinDeLinea$ = "no" AND wByteLeido < LOF(1) wByteLeido = wByteLeido + 1 GET #1, wByteLeido IF l$ <> CHR$(13) THEN IF l$ <> CHR$(10) THEN LineaLeida$ = LineaLeida$ + l$ ELSE FinDeLinea$ = "s¡" END IF WEND RETURN MayusculaInicial: GOSUB PoneEnMinusc IF LEN(LineaATratar$) >= 1 THEN IF ASC(LEFT$(LineaATratar$, 1)) >= ASC("a") AND ASC(LEFT$(LineaATratar$, 1)) <= ASC("z") THEN MID$(LineaATratar$, 1, 1) = CHR$(ASC(LEFT$(LineaATratar$, 1)) - ASC("a") + ASC("A")) END IF END IF RETURN PlanoAcimut: PlanoXY$ = "OK": PlanoYZ$ = "OK": PlanoZX$ = "OK" IF PuntDefCurv(PuntoAnterior, 1) = PuntDefCurv(PuntoActual, 1) AND PuntDefCurv(PuntoActual, 1) = PuntDefCurv(PuntoPosterior, 1) THEN PlanoXY$ = "no": PlanoZX$ = "no" END IF IF PuntDefCurv(PuntoAnterior, 2) = PuntDefCurv(PuntoActual, 2) AND PuntDefCurv(PuntoActual, 2) = PuntDefCurv(PuntoPosterior, 2) THEN PlanoXY$ = "no": PlanoYZ$ = "no" END IF IF PuntDefCurv(PuntoAnterior, 3) = PuntDefCurv(PuntoActual, 3) AND PuntDefCurv(PuntoActual, 3) = PuntDefCurv(PuntoPosterior, 3) THEN PlanoYZ$ = "no": PlanoZX$ = "no" END IF IF PlanoXY$ = "OK" THEN Derecha = 1: Delante = 2: Arriba = 3 ELSE IF PlanoYZ$ = "OK" THEN Derecha = 2: Delante = 3: Arriba = 1 ELSE IF PlanoZX$ = "OK" THEN Derecha = 3: Delante = 1: Arriba = 2 ELSE CLS PRINT "Es imposible encontrar un plano para los c lculos de trigonometria." END END IF END IF END IF RETURN PoneEnMinusc: FOR Letra = 1 TO LEN(LineaATratar$) Letra$ = MID$(LineaATratar$, Letra, 1) IF ASC(Letra$) >= ASC("A") AND ASC(Letra$) <= ASC("Z") THEN MID$(LineaATratar$, Letra, 1) = CHR$(ASC(Letra$) - ASC("A") + ASC("a")) END IF NEXT Letra RETURN Principal: GOSUB Variables GOSUB Hoja GOSUB Tronco GOSUB Punta Generacion = 1: ObjetoFrac = 1 WHILE Generacion <> 0 GOSUB GeneracionFractal WEND ObjetoFrac$ = "": GOSUB IncluyeSubElementos RETURN Punta: ArchivoEscrito$ = Camino$ + "punta.cbb": GOSUB ArchivoEscrito Objeto$ = "tronco": GOSUB IncluyeObjeto Tipo$ = "modifcoord": GOSUB CabezaTipo LineaEscrita$ = "Rotx 15": GOSUB GrabaUnaLinea LineaEscrita$ = "Rotz -30": GOSUB GrabaUnaLinea x = 0: y = 0: z = AltoTronco: GOSUB GrabaModifCoord GOSUB ColaTipo Objeto$ = "hoja": GOSUB IncluyeObjeto GOSUB FinModifCoord Tipo$ = "modifcoord": GOSUB CabezaTipo LineaEscrita$ = "Rotx 45": GOSUB GrabaUnaLinea LineaEscrita$ = "Rotz 30": GOSUB GrabaUnaLinea x = 0: y = 0: z = AltoTronco: GOSUB GrabaModifCoord GOSUB ColaTipo Objeto$ = "hoja": GOSUB IncluyeObjeto GOSUB FinModifCoord GOSUB CierraArchivo RETURN SuperiorAPi: WHILE Angulo > Pi Angulo = Angulo - 2 * Pi WEND RETURN TradValorCadena: Cadena$ = STR$(Valor) IF LEFT$(Cadena$, 1) = " " THEN Cadena$ = MID$(Cadena$, 2, LEN(Cadena$) - 1) END IF IF LEFT$(Cadena$, 2) = "-." THEN Cadena$ = "-0" + RIGHT$(Cadena$, LEN(Cadena$) - 1) END IF IF LEFT$(Cadena$, 1) = "." THEN Cadena$ = "0" + Cadena$ END IF RETURN Tronco: Tronco$ = "tronco": GOSUB Tronco2 Tronco$ = "troncopr": GOSUB Tronco2 RETURN Tronco2: ArchivoEscrito$ = Camino$ + Tronco$ + ".cbb": GOSUB ArchivoEscrito Color$ = "120,0.5,0.35": GOSUB GrabaColor IF Tronco$ = "troncopr" THEN PuntosTronco = 8 ELSE PuntosTronco = 3 END IF Tipo$ = "puntos": GOSUB CabezaTipo FOR PuntoTronco = 1 TO PuntosTronco AnguloTronco = ((2 * Pi) / PuntosTronco) * (PuntoTronco - 1) NumPunto = PuntoTronco x = DiametroTronco / 2 * COS(AnguloTronco) y = DiametroTronco / 2 * SIN(AnguloTronco) z = 0 GOSUB GrabaUnPunto NEXT PuntoTronco FOR PuntoTronco = 1 TO PuntosTronco AnguloTronco = ((2 * Pi) / PuntosTronco) * (PuntoTronco - 1) NumPunto = PuntoTronco + PuntosTronco x = DiametroTronco * FactorGene * COS(AnguloTronco) / 2 y = DiametroTronco * FactorGene * SIN(AnguloTronco) / 2 z = AltoTronco GOSUB GrabaUnPunto NEXT PuntoTronco GOSUB ColaTipo Tipo$ = "lados": GOSUB CabezaTipo FOR PuntoTronco = 1 TO PuntosTronco IF PuntoTronco <> PuntosTronco THEN Valor = PuntoTronco: GOSUB TradValorCadena LineaEscrita$ = Cadena$ + "," Valor = PuntoTronco + 1: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = PuntoTronco + PuntosTronco + 1: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = PuntoTronco + PuntosTronco: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ GOSUB GrabaUnaLinea ELSE Valor = PuntoTronco: GOSUB TradValorCadena LineaEscrita$ = Cadena$ + "," Valor = 1: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = PuntosTronco + 1: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ + "," Valor = PuntoTronco + PuntosTronco: GOSUB TradValorCadena LineaEscrita$ = LineaEscrita$ + Cadena$ GOSUB GrabaUnaLinea END IF NEXT PuntoTronco GOSUB ColaTipo GOSUB CierraArchivo RETURN Variables: AltoTronco = 1.5 DiametroTronco = .3 FactorGene = 1 / Phi AnguloRama = 30 VarianteInclinacion = 20: 'En grados VarianteDireccion = 1 / 5: 'En proporci¢n MaxGeneracion = 3 MaxObjFrac = 4 RETURN