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$ = "" + Tipo$ + ">": 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