sahchas

tp algebra

Nov 7th, 2015
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- DATOS Y SHOW
  2. type Pixel = (Integer, Integer, Integer)
  3. type PixelDelta = (Integer, Integer, Integer)
  4. type Frame = [[Pixel]]
  5.  
  6. data Video = Iniciar Frame | Agregar Frame Video deriving Eq
  7. instance Show Video
  8.    where show (Iniciar f) = mostrarFrame f
  9.          show (Agregar f v) = (mostrarFrame f) ++ "\n" ++ (show v)
  10.  
  11. type PixelComprimido = (Integer, Integer, PixelDelta)
  12. type FrameComprimido = [PixelComprimido]
  13. data VideoComprimido = IniciarComp Frame | AgregarNormal Frame VideoComprimido | AgregarComprimido FrameComprimido VideoComprimido
  14. instance Show VideoComprimido
  15.    where show (IniciarComp f) = "INICIAL \n" ++ mostrarFrame f
  16.          show (AgregarNormal f v) = "NO COMPRIMIDO \n" ++ (mostrarFrame f) ++ "\n" ++ (show v)
  17.          show (AgregarComprimido f v) = "COMPRIMIDO \n" ++ (mostrarFrameComprimido f) ++ "\n" ++ (show v)
  18.  
  19. mostrarFrame :: Frame -> String
  20. mostrarFrame [] = ""
  21. mostrarFrame (x:xs) = (show x) ++ "\n" ++ (mostrarFrame xs)
  22.  
  23. mostrarFrameComprimido :: FrameComprimido -> String
  24. mostrarFrameComprimido [] = ""
  25. mostrarFrameComprimido (x:xs) = "\t" ++ (show x) ++ "\n" ++ (mostrarFrameComprimido xs)
  26.  
  27.  
  28. -- Ejercicio 1/5
  29. ultimoFrame :: Video -> Frame
  30. ultimoFrame (Iniciar f) = f
  31. ultimoFrame (Agregar f _) = f
  32. -- *Main> ultimoFrame video0 == f1
  33. -- True
  34.  
  35. -- Ejercicio 2/5
  36. norma :: (Integer, Integer, Integer) -> Float
  37. norma (v1,v2,v3) = sqrt (fromInteger (v1^2 + v2^2 + v3^2))
  38. -- *Main> norma (10, 20, 30)
  39. -- 37.416573
  40.  
  41. -- Ejercicio 3/5
  42. pixelsDiferentesEnFrame :: Frame -> Frame -> Float -> FrameComprimido
  43. pixelsDiferentesEnFrame frame1 frame2 u = pixelsDiferentesEnFrame_ frame1 frame2 u (0,0)
  44.  
  45. pixelsDiferentesEnFrame_ :: Frame -> Frame -> Float -> (Integer,Integer) -> FrameComprimido
  46. pixelsDiferentesEnFrame_ [] [] _ _ = []
  47. pixelsDiferentesEnFrame_ ([]:xs) ([]:ys) u (i,_) = pixelsDiferentesEnFrame_ xs ys u (i+1,0)
  48. pixelsDiferentesEnFrame_ (((x1,x2,x3):xs):xss) (((y1,y2,y3):ys):yss) u (i,j)    | distancia > u = (i,j,diferencia) : siguiente
  49.                                                                                 | otherwise = siguiente
  50.                                                                                 where
  51.                                                                                 diferencia = (x1-y1,x2-y2,x3-y3)
  52.                                                                                 distancia = norma diferencia
  53.                                                                                 siguiente = pixelsDiferentesEnFrame_ (xs:xss) (ys:yss) u (i,j+1)
  54. -- *Main> pixelsDiferentesEnFrame v1f1 v2f2 1
  55. -- [(0,0,(3,3,3)),(0,1,(3,3,3)),(1,0,(3,3,3)),(1,2,(-3,-3,-3)),(2,1,(-3,-3,-3)),(2,2,(-3,-3,-3))]
  56. pruebaDiferencia = [(0,0,(3,3,3)),(0,1,(3,3,3)),(1,0,(3,3,3)),(1,2,(-3,-3,-3)),(2,1,(-3,-3,-3)),(2,2,(-3,-3,-3))]
  57.  
  58.  
  59. -- Ejercicio 4/5
  60. comprimir :: Video -> Float -> Integer -> VideoComprimido
  61. comprimir (Iniciar f1) u n = IniciarComp f1
  62. comprimir (Agregar f v) u n | (fromIntegral (length frameComp)) > n = AgregarNormal f comp
  63.                             | otherwise = AgregarComprimido frameComp comp
  64.                             where
  65.                             comp = comprimir v u n
  66.                             frameComp = pixelsDiferentesEnFrame f (ultimoFrame v) u
  67.  
  68. -- Ejercicio 5/5
  69. descomprimir :: VideoComprimido -> Video
  70. descomprimir (IniciarComp f) = Iniciar f
  71. descomprimir (AgregarNormal f v) = Agregar f (descomprimir  v)
  72. descomprimir (AgregarComprimido f v) = Agregar (aplicarCambio (ultimoFrame descomprimido) f) descomprimido
  73.                                         where
  74.                                         descomprimido = descomprimir v
  75.  
  76. -- Funciones provistas por la cátedra
  77. sumarCambios :: FrameComprimido -> FrameComprimido -> FrameComprimido
  78. sumarCambios fc1 fc2 = [(i, j, sumar deltas (busqueda i j fc2)) | (i, j, deltas) <- fc1] ++
  79.                        [(i, j, deltas) | (i, j, deltas) <- fc2, busqueda i j fc1 == (0,0,0)]
  80. -- *Main> sumarCambios [(1,1,(2,2,2)),(2,2,(0,0,-1))] [(1,1,(-3,-3,-3)), (1,2,(1,1,1))]
  81. -- [(1,1,(-1,-1,-1)),(2,2,(0,0,-1)),(1,2,(1,1,1))]
  82.  
  83. aplicarCambio :: Frame -> FrameComprimido -> Frame
  84. aplicarCambio f fc = [ [nuevoVal f i j fc| j <- [0..length (f !! i) - 1]] | i <- [0..length f - 1]]
  85.   where nuevoVal f i j fc = sumar ((f !! i) !! j) (busqueda (fromIntegral i) (fromIntegral j) fc)
  86. --  *Main> aplicarCambio [[(1,1,1),(2,2,2)],[(3,3,3),(4,4,4)]] [(0, 1, (1,2,3))]
  87. --  [[(1,1,1),(3,4,5)],[(3,3,3),(4,4,4)]]
  88.  
  89. busqueda :: Integer -> Integer -> FrameComprimido -> PixelDelta
  90. busqueda i j [] = (0, 0, 0)
  91. busqueda i j ((x, y, c) : cs) | x == i && j == y = c
  92.                             | otherwise = busqueda i j cs
  93.  
  94. sumar :: PixelDelta -> PixelDelta -> PixelDelta
  95. sumar (x,y,z) (x2,y2,z2) =  (x+x2,y+y2,z+z2)
  96.  
  97. -- PRUEBAS
  98. p3 :: Pixel
  99. p3 = (3,3,3)
  100.  
  101. p0 :: Pixel
  102. p0 = (0,0,0)
  103.  
  104. -- Video 0:
  105. f0 = [[p0, p0, p0], [p3, p3, p3]]
  106. f1 = [[p3, p3, p3], [p3, p3, p3]]
  107. video0 = Agregar f1 (Agregar f0 (Iniciar f0))
  108.  
  109. -- Video 1:  En la versión comprimida, todos los frames son comprimidos (salvo el inicial)
  110.  
  111. v1f1 :: Frame
  112. v1f1 = [[p3, p3, p0, p0, p0],
  113.       [p3, p3, p0, p0, p0],
  114.       [p0, p0, p0, p0, p0],
  115.       [p0, p0, p0, p0, p0],
  116.       [p0, p0, p0, p0, p0]]
  117.  
  118. v1f2 :: Frame
  119. v1f2 = [[p0, p0, p0, p0, p0],
  120.       [p0, p3, p3, p0, p0],
  121.       [p0, p3, p3, p0, p0],
  122.       [p0, p0, p0, p0, p0],
  123.       [p0, p0, p0, p0, p0]]
  124.  
  125. v1f3 :: Frame
  126. v1f3 = [[p0, p0, p0, p0, p0],
  127.       [p0, p0, p0, p0, p0],
  128.       [p0, p0, p3, p3, p0],
  129.       [p0, p0, p3, p3, p0],
  130.       [p0, p0, p0, p0, p0]]
  131.  
  132. v1f4 :: Frame
  133. v1f4 = [[p0, p0, p0, p0, p0],
  134.       [p0, p0, p0, p0, p0],
  135.       [p0, p0, p0, p0, p0],
  136.       [p0, p0, p0, p3, p3],
  137.       [p0, p0, p0, p3, p3]]
  138.  
  139.  
  140. v1 :: Video
  141. v1 = Agregar v1f4 (Agregar v1f3 (Agregar v1f2 (Iniciar v1f1)))
  142.  
  143. v1Comp :: VideoComprimido
  144. v1Comp = comprimir v1 1 6
  145.  
  146.  
  147. -- Video 2:  En la versión comprimida, sólo los frames 2 y 4 son comprimidos
  148.  
  149. v2f1 :: Frame
  150. v2f1 = [[p3, p3, p0, p0, p0],
  151.       [p3, p3, p0, p0, p0],
  152.       [p0, p0, p0, p0, p0],
  153.       [p0, p0, p0, p0, p0],
  154.       [p0, p0, p0, p0, p0]]
  155.  
  156. v2f2 :: Frame
  157. v2f2 = [[p0, p0, p0, p0, p0],
  158.       [p0, p3, p3, p0, p0],
  159.       [p0, p3, p3, p0, p0],
  160.       [p0, p0, p0, p0, p0],
  161.       [p0, p0, p0, p0, p0]]
  162.  
  163. v2f3 :: Frame
  164. v2f3 = [[p0, p0, p0, p0, p0],
  165.       [p0, p0, p0, p0, p0],
  166.       [p0, p0, p3, p3, p3],
  167.       [p0, p0, p3, p3, p0],
  168.       [p0, p0, p0, p0, p0]]
  169.  
  170. v2f4 :: Frame
  171. v2f4 = [[p0, p0, p0, p0, p0],
  172.       [p0, p0, p0, p0, p0],
  173.       [p0, p0, p0, p0, p3],
  174.       [p0, p0, p0, p3, p3],
  175.       [p0, p0, p0, p3, p3]]
  176.  
  177.  
  178. v2 :: Video
  179. v2 = Agregar v2f4 (Agregar v2f3 (Agregar v2f2 (Iniciar v2f1)))
  180.  
  181. v2Comp :: VideoComprimido
  182. v2Comp = comprimir v2 1 6
Advertisement
Add Comment
Please, Sign In to add comment