A solução anterior "induz" que a tartaruga se teletransporta para outro
local, ou pelo menos, que ela levanta a caneta durante o desenho. Na
verdade, o final do desenho da primeira chamada recursiva não coincide com o
começo da segunda chamada recursiva. É por isto que nós temos que usar o
método setPos()
Nesta lição, você vai escrever um método recursivo que permita desenhar a curva do dragão sem levantar a caneta. Para isto, precisamos de outro método recursivo que desenhe o lado espelhado da curva.
O método dragon()
é então definido recursivamente usando ele
próprio e dragonReverse()
. Da mesma forma, o método
dragonReverse()
é definido recursivamente usando ele próprio e
dragon()
. Este é, portanto, um exemplo de recursão
mútua.
O protótipo do método dragon()
é o mesmo do exercício anterior:
[!java|c]void [/!]dragão([!java|c]int [/!]ordem[!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[/!])
A coordenada do novo ponto (u, v) introduzida pelo dragon()
é:
u = (x + z)/2 + (t - y)/2 v = (y + t)/2 - (z - x)/2
O protótipo do método dragonReverse
é similar:
[!java|c]void [/!]inverterDragão([!java|c]int [/!]order[!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[/!])
A coordenada do novo ponto (u, v) introduzida pelo
dragonReverse()
é:
u = (x + z)/2 - (t - y)/2 v = (y + t)/2 + (z - x)/2
Para deixar o trabalho de cada um dos dois métodos recursivos mais visível,
a linha pintada pelo dragon()
deve ser vermelha
(Color.red
) enquanto que a linha pintada pelo
dragonReverse()
deve ser azul(Color.blue
).
Dê uma olhada em cada visão de mundo objetivo para entender como escrever a função.