Projeto Computacional
Moonlander
Função:
pilotar nave terreno
• pilotar nave terreno = (estado1,estado2)
• Onde estado1 representa o foguete
horizontal e estado2 representa o
foguete horizontal
• Terreno é uma lista de tuplas de três
pontos
• Nave (xatual,yatual,vx,vy,fx,fy,c)
Uma estratégia para cada terreno
• A função pilotar se comportara de uma
forma diferente para cada terreno,por
exemplo,desligara o foguete em um
quando atingir uma certa velocidade ou
uma certa posição.
Terreno 2
• Terreno proposto no trabalho(terreno
ideal,ou seja plano).
• Usaremos a posição para determina
quando o foguete desligara.
• pilotar nave terreno = (estado1,estado2)
where
estado1 = if (r1 nave)<(-0.165)
then 0
else -1
estado2 = 0
• Usaremos a posição para determina
quando o foguete desligara.
• pilotar nave terreno = (estado1,estado2)
where
estado1 = if (r1 nave)<(-0.1)
then 0
else -1
estado2 = 0
• Aumento da posição,provoca o desligamento mais cedo do foguete
horizontal,logo ele pousa mais perto da posição inicial .
• Assim sucessivamente.
•
Conclusão
• O foguete pousara para esquerda no
intervalo de posições (-0.165,0.0).
E para direita?
• Será necessário muda a posição foguete
horizontal.
• Agora ele pousara para o intervalo
(0.0005,0.165)
• pilotar nave terreno = (estado1,estado2)
where
estado1 = if (r1 nave)>(0.0005)
then 0
else 1
estado2 = 0
Terreno3 (terreno com obstáculo)
• pilotar nave terreno = (estado1,estado2)
where
estado1 = if (r1 nave)>(0.45)
then -1
else = 1
estado2 = 0
ordenaAreaPouso nave terreno
• Usando mergesort para ordena.
•
•
•
•
•
intercala xs ys = if null xs || null ys
then xs++ys
else if snd (head xs) >= snd(head ys)
then (head ys):(intercala xs (tail ys))
else (head xs):(intercala (tail xs) ys)
•
•
•
•
•
•
•
ms xs = if null (tail xs)
then xs
else intercala (ms ys) (ms zs)
where
ys = take x xs
zs = drop x xs
x = div (length xs) 2
Funções auxiliares
•
Define as inclincoes do terreno
•
•
•
inclinacao a b c d = ((b-d)/(a-c))
-- Uma inclinacão para cada lado do triangulo.
inclinacao1 (a,b,c) = inclinacao (fst(retira1(a,b,c))) (snd(retira1(a,b,c)))
(fst(retira2(a,b,c))) (snd(retira2(a,b,c)))
•
inclinacao2 (a,b,c) = inclinacao (fst(retira1(a,b,c))) (snd(retira1(a,b,c)))
(fst(retira3(a,b,c))) (snd(retira3(a,b,c)))
•
inclinacao3 (a,b,c) = inclinacao (fst(retira2(a,b,c))) (snd(retira2(a,b,c)))
(fst(retira3(a,b,c))) (snd(retira3(a,b,c)))
•
•
•
•
•
--Funcoes para manipular tripla
retira1 (a,b,c) = a
retira2 (a,b,c) = b
retira3 (a,b,c) = c
retira4 (a,b,c,d,e,f,g) = (a,b) -- retira os dois primeiros termos da nave
• pontomedio x y = ((fst x + fst y)/2,(snd x +
snd y)/2)
• -- Fornece a distancia entre dois pontos
• distancia x y = sqrt((fst x- fst y)^2+ (snd xsnd y)^2)
Função pousoSeguro
• pousoSeguro xs = [(terrenovalido (retira1 x,retira2 x,retira3 x))|x<xs,(terrenovalido1 (retira1 x,retira2 x,retira3 x)]
• Retorna os terrenos onde é possivel o pouso
• terrenovalido (a,b,c) = if inclinacao1 (a,b,c) <=0.1 && inclinacao1
(a,b,c)>=0 && snd a > snd c && snd b > snd c
•
then [(a,b)]
•
else if inclinacao2 (a,b,c) <=0.1 && inclinacao2
(a,b,c)>=0 && snd a > snd b && snd c > snd b
•
then [(a,c)]
•
else if inclinacao3 (a,b,c) <=0.1 && inclinacao3
(a,b,c)>=0 && snd c > snd a && snd b > snd a
•
then [(b,c)]
•
else []
• terrenovalido1 (a,b,c) =(terrenovalido (a,b,c))/=[]
areaPousoedistancia nave terreno
• Retorna uma dupla contendo o terreno e a distancia da nave até o
terreno.
areaPousoedistancia nave terreno
=[(head y,(distancia (pontomedio (retiradupla1 (head y)) (retiradupla2
(head y))) (retira4 (nave))))|y<-(pousoSeguro (terreno))]
• ordenaAreaPouso nave terreno = ms
(areaPousoedistancia nave terreno)
Download

Moonlander