; GŽomŽtrie de la Tortue
; ----------------------

TO carre :c
	  repeat 4 [fd :c rt 90]
end

to polyReg :n :c
	repeat :n [fd :c rt 360/:n]
end

TO polyRegSens :n :c :sens ; sens vaut +1 ou -1
	repeat :n [fd :c rt sens*360/:n]
end

to maison
	RT 90
	polyRegSens 3 100 -1
	polyRegSens 4 100 1
	RT -90
end

to poly :cote :angle
	fd :cote rt :angle
	poly :cote :angle
end

to poly2 :cote :angle
	fd :cote rt :angle
	fd :cote rt 2*:angle
	poly2 :cote :angle
end

to polySpi :cote :angle :pas
	fd :cote rt :angle
	polySpi :cote+:pas :angle :pas
end

to inSpi :cote :angle :pas
	fd :cote rt :angle
	;wait 1000
	inSpi :cote :angle+:pas :pas
end
 
; Autre forme des quatre procŽdures prŽcŽdentes
; ---------------------------------------------

To Poly :cote :angle ; angles = 72, 144, 60, 135, 108, 1
	while [true] [Fd :cote Rt :angle]
end

To Poly2 :cote :angle ; angle = 30, 144, 45,125
	while [true] [Fd :cote Rt :angle Fd :cote Rt 2*:angle]
end

To PolySpi :cote :angle :pas ; angle = 95, 90, 120, 117 (pas = 1)
	while [true] [Fd :cote Rt :angle Make "cote :cote+:pas]
end

To InSpi :cote :angle :pas ; (angle, pas) = (0,7), (40,30), (2,20) (= 10 ou 20)
	while [true] [Fd :cote Rt :angle Make "angle :angle+:pas]
end


; Pour arrt de Ç InSpi È (lorsquÕarrt il y a)
; ---------------------------------------------


To InSpi :cote :angle :pas ; (angle, pas) = (0,7), (40,30), (2,20) (2,115+k) o k=0,1,2 (= 10 ou 20)
	make "position pos make "cap heading 
	  while [true] [Fd :cote Rt :angle Make "angle :angle+:pas if pos = :position and heading = :cap [STOP]]
end

TO InSpi :cote :angle :pas
	CS
	Make "angleInitial :angle
	Make "tours 0
	while [true] \
			   [Fd :cote Rt :angle \
	  Make "tours :tours + :angle \
	  Make "angle :angle + :pas \
	  if (:angleInitial = Remainder :angle 360) and (0 = Remainder :tours 360) [STOP] ]
END
 
; Autres procŽdures mathŽmatiques
; -------------------------------

TO ValeurAbsolue :X
	IF :X < 0 [OUTPUT -:X] [OUTPUT :X]
END

TO Facteurs :N
	FOR "I 1 :N [IF (REMAINDER :N :I) = 0 [PRINT :I]]
END

TO Syracuse :N
	MAKE "COMPTEUR 0
	WHILE [:N > 1] [IF (REMAINDER :N 2) = 0  \
		  [MAKE "N :N / 2]	\
		  [MAKE "N 3 * :N + 1] PRINT :N MAKE "COMPTEUR :COMPTEUR + 1]
	(PRINT "|Nombre d'Žtapes| :COMPTEUR)
END

TO SyracuseFonction :N
	MAKE "COMPTEUR 0
	WHILE [:N > 1] [IF (REMAINDER :N 2) = 0 \
						[MAKE "N :N / 2] \
						[MAKE "N 3 * :N + 1] \
				   MAKE "COMPTEUR :COMPTEUR + 1]
	OUTPUT :COMPTEUR
END 

TO SuperNombres :FACTEUR
	FOR "I 1 1000 [MAKE "ETAPES SYRACUSEFONCTION :I  \
			 IF :I * :FACTEUR < :ETAPES [(PRINT :I "|-->| :ETAPES)]]
	PRINT "|TerminŽ|
END 

TO Sierp :N :C ; cs ht rt -90 sierp 5 100
	IF :N = 0 [STOP]
	REPEAT 3 [Sierp :N - 1 :C / 2 FD :C RT 120]
END