1 / 16

Projeto de Programação

Projeto de Programação. Departamento de Informática – CT XVII Engenharia de Computação Programação I - 2009/1 Maria Claudia Boeres. MOONLANDER. Hudson Martins da Silva (hudsonmarcn@gmail.com) Matricula: 2008101155

libba
Download Presentation

Projeto de Programação

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Projeto de Programação Departamento de Informática – CT XVII Engenharia de Computação Programação I - 2009/1 Maria Claudia Boeres MOONLANDER Hudson Martins da Silva (hudsonmarcn@gmail.com) Matricula: 2008101155 Lucian Borges Corteletti (luciancorteletti@hotmail.com) Matricula: 2008101135

  2. 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)

  3. 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)

  4. Elaboração do script: # OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno Fornece como resposta uma lista de áreas válidas de pouso existentes no 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)

  5. Elaboração do script: # OrdenaAreaPouso (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 pelo criterio 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)

  6. 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 ]

  7. 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 triangulo a 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

  8. 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 triangulo e a respectiva inclinação deste lado segmentosCandidatos terreno = concat (map segmentoInclinacao terreno)

  9. Elaboração do script: # OrdenaAreaPouso (x,y,vx,vy,fx,fy,c) terreno 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))] 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)

  10. 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)

  11. Elaboração do script: # contagem (x,y,vx,vy,fx,fy,c) terreno: A funcao "contagem" possui como argumentos uma nave e um terreno e tem como saida a pontuacao obtida pela nave ao seguir a trajetoria. contagem (x,y,vx,vy,fx,fy,c) terreno = if psu == 1 then 100-p else 0 where p = (100*combustivelGasto)/c

  12. Elaboração do script: # trajetoria (x,y,vx,vy,fx,fy,c) terreno: 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 nave da 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 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"

  13. Elaboração do script: # trajetoria (x,y,vx,vy,fx,fy,c) terreno: 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

  14. 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

  15. Elaboração do script: # pilotar (x,y,vx,vy,fx,fy,c) terreno: Funções Auxiliares Utilizadas pilotarPontoAbaixo define a estratégia de movimentação da nave se o ponto de pouso estiver abaixo da posição atual da nave 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))))

  16. 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 + x2 b = y1 + y2

More Related