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


    Source: geocities.com/siliconvalley/way/4179

               ( geocities.com/siliconvalley/way)                   ( geocities.com/siliconvalley)