projeto de programação
Post on 20-Mar-2016
32 Views
Preview:
DESCRIPTION
TRANSCRIPT
Projeto de ProgramaçãoDepartamento de Informática – CT XVII
Engenharia de ComputaçãoProgramação I - 2009/1
Maria Claudia Boeres
MOONLANDER
Hudson Martins da Silva (hudsonmarcn@gmail.com) Matricula: 2008101155Lucian Borges Corteletti (luciancorteletti@hotmail.com) Matricula: 2008101135
Algumas primitivas novas que foram utilizadas:
Primitiva Map:
Função de ordem superior que aplica uma função ao longo de uma lista.
somaUm xs = map f xs ou somaUm xs = map f xs where f x = x + 1
f x = x + 1
Teste:
Main> somaUm [1,2,3,4,5][2,3,4,5,6] :: [Integer](112 reductions, 220 cells)
Algumas primitivas novas que foram utilizadas:
Primitiva Filter :
E uma função de ordem superior que filtra os elementos de uma lista que verificam um dado predicado.
filtraPares xs = filter f xs ou filtraPares xs = filter even xs where f x = even x
Teste:
Main> filtraPares [2,6,5,7,89,45,5,6,1,2][2,6,6,2] :: [Integer](317 reductions, 539 cells)
Elaboração do script:
# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno
Fornece como resposta uma lista de áreas válidas de pouso existentesno terreno ordenado pela menor distância do ponto onde a nave está posicionada
ordenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno = foldl insereOrdenado [ ] (areaPouso (x,y,vx,vy,fx,fy,c) terreno)
Funções Auxiliares Utilizadas: A funcao "areaPouso" tem como argumentos uma nave e um terreno essa funcao mapeia os elementos da lista "distNaveReta" e tem como saida uma lista de tuplas-2 em que o primeiro elemento e uma lista com os dois vertices do segmento de um triangulo e o segundo e a distancia da nave a esse segmento Obs: essa lista de saida da funcao "areaPouso" nao esta necessariamente ordenada pelocriterio distancia
areaPouso (x,y,vx,vy,fx,fy,c) terreno = map fAux (distNaveReta (x,y,vx,vy,fx,fy,c) terreno) where fAux ((x1,y1),(x2,y2),i,dpr) = ([(x1,y1),(x2,y2)],dpr)
Elaboração do script:# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno
Elaboração do script:
# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno
Funções Auxiliares Utilizadas:
A função "insereOrdenado" tem como argumentos uma tupla-2 da forma ([Ponto],Numero) e uma lista da forma [([Ponto],Numero)], essa função tem como objetivo inserir essa tupla-2 ordenadamente (em ordem crescente) na lista seguindo o critério distancia que e representado pelo segundo elemento da tupla. Obs: nessa função a lista dada como argumento já esta em ordem crescente
insereOrdenado ys (xs,x) = menoresIguais ++ [(xs,x)] ++ maiores where menoresIguais = [ (zs,y) | (zs,y) <- ys, y <= x ] maiores = [ (zs,y) | (zs,y) <- ys, y > x ]
Elaboração do script:
# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno
A função distNaveReta tem como parâmetros uma nave e um terreno. Ela retorna uma lista de tuplas-4 com os dois vértices do lado de um trianguloa inclinação, dentro da permitida, e a distancia da nave do ponto onde essa se encontra ao segmento em questão que possui a inclinação dentro da permitida
distNaveReta (x, y, vx, vy, fx, fy, c) terreno = [ ((a,b),(c,d),i,distPontoReta (x,y) (a,b) (c,d)) | ((a,b),(c,d),i) <- (segmentosPouso terreno)]
Dado um ponto (x1,y1) a função "distPontoReta" calcula a distancia desse ponto a reta determinada passando por (x2, y2) e (x3, y3), que e um lado do triangulo
distPontoReta (x1, y1) (x2, y2) (x3, y3) = (abs ( a*x1 + b*y1 + c))/(sqrt (a*a + b*b)) where a = y2-y3 b = x3-x2 c = x2*y3 - x3*y2
Elaboração do script:
# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno
A função segmentosPouso tem como argumento um terreno e, filtra os elementos da lista "segmentosCandidatos terreno" de tal maneira que o terceiro elemento da tupla de cada tupla esteja dentro do intervalo da inclinacao permitida
segmentosPouso terreno = filter ip (segmentosCandidatos terreno) where
ip (_, _, x) = if x >= (-0.1) && x <= 0.1
A função segmentosCandidatos tem como argumento um terreno e tem como saída uma lista de tuplas-3 com os dois vértices de um trianguloe a respectiva inclinação deste lado
segmentosCandidatos terreno = concat (map segmentoInclinacao terreno)
Elaboração do script:
# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno
Dados dois pontos a função inclinacao calcula a inclinação do segmento formado pelos respectivos pontos inclinacao (x1,y1) (x2,y2) | x1 == x2 = 1.234567890 -- Segmento vertical
| y1 == y2 = 0.0 | otherwise = (y2 - y1)/(x2 - x1)
Dado um triangulo ( tupla-3) a função segmentoInclinacao devolve uma lista de tuplas-3 com dois vértices do triangulo e a respectiva inclinação desse segmento
segmentoInclinacao ((a,b),(c,d),(e,f)) = [((a,b),(c,d), inclinacao (a,b) (c,d)),((a,b),(e,f), inclinacao (a,b) (e,f)),((c,d),(e,f), inclinacao (c,d) (e,f))]
Elaboração do script:
# OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno
Exemplo:
Resultado Esperado:ordenaAreaPouso (0.0,0.0,0.0,0.0,0,0,100) [((-1.0,-1.0),(0.0,0.0),(0.0,-0.5)),((1.0,-1.0),(0.0,0.0),(0.0,-0.5))] = [ ]
Resultado Obtido:Main> ordenaAreaPouso (0.0,0.0,0.0,0.0,0,0,100) [((-1.0,-1.0),(0.0,0.0),(0.0,-0.5)),((1.0,-1.0),(0.0,0.0),(0.0,-0.5))] [](264 reductions, 542 cells)
Resultado Esperado:ordenaAreaPouso (0.0,0.0,0.0,0.0,0,0,100) [((1.0,0.0),(-1.0,0.0),(0.0,-1.0)),((1.0,-1.0),(-1.0,-1.0),(0.0,0.5))] = [ ( [ ( 1.0 , 0.0 ) , ( -1.0 , 0.0 ) ] , 0.0 ) , ( [ ( 1.0 , -1.0 ) , ( -1.0 , -1.0 ) ] , 1.0 ) ]
Resultado Obtido:Main> ordenaAreaPouso (0.0,0.0,0.0,0.0,0,0,100) [((1.0,0.0),(-1.0,0.0),(0.0,-1.0)),((1.0,-1.0),(-1.0,-1.0),(0.0,0.5))][([(1.0,0.0),(-1.0,0.0)],0.0),([(1.0,-1.0),(-1.0,-1.0)],1.0)](498 reductions, 1125 cells)
A funcao "contagem" possui como argumentos uma nave e um terreno e tem como saida a pontuacao obtida pela nave ao seguir a trajetoria.
Elaboração do script:
# contagem (x,y,vx,vy,fx,fy,c) terreno:
contagem (x,y,vx,vy,fx,fy,c) terreno = if psu == 1 then 100-p
else 0 where p = (100*combustivelGasto)/c
A função "trajetoria" tem como argumentos uma nave e um terreno e fornece como saída uma tupla-3 com a lista de pontos seguidos pela naveda sua posição inicial até seu ponto de pouso, a distancia total percorrida e um valor booleano indicando se a nave pousou ou não
Elaboração do script:
# trajetoria (x,y,vx,vy,fx,fy,c) terreno:
trajetoria (x,y,vx,vy,fx,fy,c) terreno = (trajetoNave,dist,psu) where
trajetoNave = if x == fst (pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno)
then trajeto1 (x,y,vx,vy,fx,fy,c) terreno else trajeto2 (x,y,vx,vy,fx,fy,c) terreno
dist = if x == fst (pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno) then dist1 (x,y,vx,vy,fx,fy,c) terreno else dist2 (x,y,vx,vy,fx,fy,c) terreno psu = "X"
O trajeto1 e aplicado quando a nave esta em cima do ponto de pouso trajeto1 (x,y,vx,vy,fx,fy,c) terreno = [(x,y),(xm,ym)] where (xm,ym) = pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno
O trajeto2 e aplicado quando a nave esta a esquerda ou a direita do ponto de pouso trajeto2 (x,y,vx,vy,fx,fy,c) terreno = [(x,y),(x1,y),(x2,y2)] where x1 = fst (pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno) (x2,y2) = pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno
dist1 (x,y,vx,vy,fx,fy,c) terreno = abs (y1 - y2) where
y1 = snd (head (trajeto1 (x,y,vx,vy,fx,fy,c) terreno))y2 = snd (last( trajeto1 (x,y,vx,vy,fx,fy,c) terreno))
dist2 (x,y,vx,vy,fx,fy,c) terreno = (distPontoPonto k1 k2) + (distPontoPonto k2 k3) where k1 = (trajeto2 (x,y,vx,vy,fx,fy,c) terreno)!!0
k2 = (trajeto2 (x,y,vx,vy,fx,fy,c) terreno)!!1 k3 = (trajeto2 (x,y,vx,vy,fx,fy,c) terreno)!!2
Elaboração do script:# trajetoria (x,y,vx,vy,fx,fy,c) terreno:
Elaboração do script:
# pilotar (x,y,vx,vy,fx,fy,c) terreno:
A função "pilotar" define como será a movimentação da nave uma vez que se sabe onde se encontra o ponto de pouso
pilotar (x,y,vx,vy,fx,fy,c) terreno = if segmentosPouso terreno == [ ] then (1,1)
else if x == fst (pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno)
then pilotarPontoAbaixo (x,y,vx,vy,fx,fy,c) terreno
else if x < fst (pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno)
then pilotarPontoDireito (x,y,vx,vy,fx,fy,c) terreno
else pilotarPontoEsquerdo (x,y,vx,vy,fx,fy,c) terreno
Elaboração do script:
# pilotar (x,y,vx,vy,fx,fy,c) terreno:
pilotarPontoAbaixo define a estratégia de movimentação da nave se o ponto de pouso estiver abaixo da posição atual da nave
Funções Auxiliares Utilizadas
pilotarPontoDireito define a estratégia de movimentação da nave se o ponto de pouso estiver do lado direito da posição atual da nave
pilotarPontoEsquerdo define a estrategia de movimentacao da nave se o ponto de pouso estiver do lado esquerdo da posicao atual da nave
pontoMedioPouso (x,y,vx,vy,fx,fy,c) terreno = (hAux(gAux(head(ladoPousoCandidato (x,y,vx,vy,fx,fy,c) terreno))))
Elaboração do script:
# pilotar (x,y,vx,vy,fx,fy,c) terreno:
A função "gAux" é uma função auxiliar que possui como argumento uma tupla-4 e tem como saída os dois primeiros elementos dessa tupla
gAux ((x1,y1),(x2,y2),_,_) = ((x1,y1),(x2,y2))
A função auxiliar "hAux" tem como parâmetros uma tupla-2 de pontos e tem como saída uma tupla-2 com o ponto médio do segmento determinado pelos pontos passados como parâmetros
hAux ((x1,y1),(x2,y2)) = (a/2,b/2) where
a = x1 + x2b = y1 + y2
top related