La solution précédente nécessite que la tortue se téléporte ou qu'elle lève
parfois le crayon pour tracer la courbe. En effet, entre la destination du
trait tracé par le premier appel récursif ne correspond pas à la source du
trait qui doit être tracé par le second appel récursif. C'est pourquoi il
était nécessaire d'utiliser la méthode setPos()
Dans cette leçon, vous allez donc réaliser une méthode récursive qui permet de tracer la courbe du dragon sans lever le crayon. Pour ce faire, vous définirez une seconde méthode récursive qui trace la courbe à l'envers.
La méthode dragon()
sera définie récursivement en fonction des
méthodes dragon()
et dragonInverse()
. De même, la
méthode dragonInverse()
sera définie récursivement en terme de
dragon()
et de dragonInverse()
. Voici un bien bel
exemple de récursivité croisée.
Le prototype de la méthode dragon()
reste le même que
précédemment :
[!java|c]void [/!]dragon([!java|c]int [/!]ordre[!scala]:Int[/!], [!java|c]double [/!]x[!scala]:Double[/!], [!java|c]double [/!]y[!scala]:Double[/!], [!java|c]double [/!]z[!scala]:Double[/!], [!java|c]double [/!]t[!scala]:Double[/!])
Les coordonnées (u, v) du nouveau point introduit par la méthode
dragon()
seront :
u = (x + z)/2 + (t - y)/2 v = (y + t)/2 - (z - x)/2
Le prototype de la méthode dragonInverse()
est identique : :
[!java|c]void [/!]dragonReverse([!java|c]int [/!]ordre[!scala]:Int[/!], [!java|c]double [/!]x[!scala]:Double[/!], [!java|c]double [/!]y[!scala]:Double[/!], [!java|c]double [/!]z[!scala]:Double[/!], [!java|c]double [/!]t[!scala]:Double[/!])
Les coordonnées (u, v) du nouveau point introduit par la méthode
dragonInverse()
seront :
u = (x + z)/2 - (t - y)/2 v = (y + t)/2 + (z - x)/2
Afin de rendre, plus visible le travail de chacune des deux méthodes
récursives, le trait tracé par la méthode dragon()
devra être
rouge (Color.red
) et le trait tracé par la méthode
dragonInverse
devra être bleu (Color.blue
).
Consultez les objectifs de chaque monde pour comprendre comment écrire la fonction.