Guest User

Untitled

a guest
Jul 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.82 KB | None | 0 0
  1. package Practica01;
  2.  
  3. import java.io.*;
  4. import java.util.*;
  5. import java.*;
  6.  
  7.  
  8. /**
  9. * Clase Skyline
  10. * @author Juan Miguel Gabarron Segura y Javier Imbernon Molina
  11. * @version 1.0
  12. */
  13. public class Skyline {
  14.  
  15. private ArrayList<Punto> skyline;
  16. private ArrayList<Edificio> edificios;
  17. private String archivoEntrada;
  18. private String archivoSalida;
  19.  
  20. /**
  21. * Constructor por defecto
  22. */
  23. public Skyline(String archivoEntrada, String archivoSalida)
  24. {
  25. this.skyline = new ArrayList<Punto>();
  26. this.edificios=new ArrayList<Edificio>();
  27. this.archivoEntrada=archivoEntrada;
  28. this.archivoSalida=archivoSalida;
  29. cargarArchivoEdificios();
  30. generarSkyline();
  31. guardarArchivoSalida();
  32. }
  33.  
  34.  
  35.  
  36. private void cargarArchivoEdificios() {
  37.  
  38. StringTokenizer token;
  39. String entrada;
  40. int numElementos;
  41. int x,y,z;
  42. Edificio e=null;
  43.  
  44. skyline = new ArrayList<Punto>();
  45. edificios = new ArrayList<Edificio>();
  46.  
  47. try{
  48. File f = new File(archivoEntrada);
  49. FileReader fr = new FileReader(f);
  50. BufferedReader br = new BufferedReader(fr);
  51.  
  52. numElementos = Integer.parseInt(br.readLine());
  53. for(int i=0; i<numElementos; i++){
  54. entrada=br.readLine();
  55. token = new StringTokenizer(entrada,", ");
  56. try{
  57. x=Integer.parseInt(token.nextToken());
  58. y=Integer.parseInt(token.nextToken());
  59. z=Integer.parseInt(token.nextToken());
  60. e = new Edificio(x,y,z);
  61. edificios.add(e);
  62. }catch(NumberFormatException ex){
  63. System.out.println("Formato de entrada no valido \n");
  64. }
  65.  
  66. }
  67. br.close();
  68. }catch(Exception exception){
  69. exception.printStackTrace();
  70. }
  71. }
  72.  
  73. /**
  74. * <B>Metodo getSkyline.</B>
  75. * Metodo observador de la clase Skyline
  76. * @return nos devuelve el Skyline
  77. */
  78. public void guardarArchivoSalida()
  79. {
  80. try
  81. {
  82. Punto p = new Punto();
  83. PrintWriter fileOut = new PrintWriter (new FileWriter(archivoSalida));
  84.  
  85. fileOut.println(skyline.size());
  86.  
  87. for(int i=0; i<skyline.size(); i++)
  88. {
  89. p=(skyline.get(i));
  90.  
  91. fileOut.write(p.getX()+","+p.getY()+"\n");
  92.  
  93. }
  94. fileOut.close();
  95. }
  96. catch(Exception e){
  97.  
  98. e.printStackTrace();
  99.  
  100. }
  101. }
  102.  
  103. private void generarSkyline() {
  104.  
  105. int pi = 0; //Punto de Inicio del Skyline
  106. int pd = (edificios.size()-1); //Punto de Destino del Skyline
  107.  
  108. skyline=doSkyline(pi, pd);
  109.  
  110. }
  111.  
  112.  
  113. public ArrayList<Punto> doSkyline(int pi, int pd) // Metodo de Divide y Venceras
  114. {
  115. ArrayList<Punto> puntos = new ArrayList<Punto>();
  116.  
  117. Punto p1 = new Punto(); // Punto donde se guardara la variable X y Y del pi
  118. Punto p2 = new Punto(); // Punto donde se guardara la variable X y Y del pi, siendo la Y = 0
  119. Edificio ed = new Edificio(); // Variable donde guardaremos el edificio
  120.  
  121. if(pi==pd) // caso base, la ciudad tiene un unico edificio
  122. {
  123. ed = edificios.get(pi); // cogemos el edificio de la posicion pi
  124. p1.setX(ed.getInicio()); // en la X del p1 guardamos la X de Inicio del Edificio
  125. p1.setY(ed.getAltura()); // en la Y del p1 guardamos la Altura del Edificio
  126. p2.setX(ed.getFin()); // en la X del p2 guardamos la X de Fin del Edificio
  127. p2.setY(0); // La Altura final del Edificio es 0
  128. puntos.add(p1); // agregamos los puntos al Skyline de puntos
  129. puntos.add(p2);
  130. }
  131.  
  132. else // Separamos en 2 los Skyline
  133. {
  134. int medio=(pi+pd)/2;
  135.  
  136. ArrayList<Punto>izq = this.doSkyline(pi,medio); // Skyline desde pi hasta medio
  137. ArrayList<Punto>der = this.doSkyline(medio+1,pd); // Skyline desde medio hasta pd
  138. puntos = skylineFussion(izq,der); // Unimos los Skylines
  139. }
  140.  
  141. return puntos;
  142. }
  143.  
  144. public ArrayList<Punto> skylineFussion(ArrayList<Punto> sk1, ArrayList<Punto> sk2)
  145. {
  146.  
  147. int sk1Y= -1, sk2Y= -1, prev= -1; // "sk1Y" Altura del Skyline 1, "sk2Y" Altura del SkyLine 2, "prev" altura previa del anterior Skyline
  148.  
  149. ArrayList<Punto> salida = new ArrayList<Punto>(); // Skyline de salida
  150.  
  151. Punto pAux; // punto auxiliar, lo usaremos para hacer la "mezcla de puntos"
  152. Punto p1 = new Punto(); // punto donde guardaremos el primer punto del skyline sk1
  153. Punto p2 = new Punto(); // punto donde guardaremos el primer punto del skyline sk2
  154.  
  155. while ((!sk1.isEmpty()) && (!sk2.isEmpty())) // el bucle se realiza hasta que sk1 o sk2 se quede sin elementos
  156. {
  157. pAux = new Punto(); // Inicializamos la variable pAux
  158. p1 = sk1.get(0); // guardamos el primer elemento de sk1
  159. p2 = sk2.get(0); // guardamos el primer elemento de sk2
  160.  
  161. if (p1.getX() < p2.getX()) // Si X del sk1 es menor que la X del sk2
  162. {
  163. pAux.setX(p1.getX()); // Guardamos en pAux la X de p1
  164. pAux.setY(Math.max(p1.getY(), sk2Y)); // Hacemos que el maximo entre la Y del sk1 y la altura previa del sk2 sea la altura Y de pAux
  165.  
  166. if (pAux.getY()!=prev) // Si este maximo no es igual al del segmento anterior
  167. {
  168. salida.add(pAux); // Agregamos el punto al Skyline de salida
  169. prev = pAux.getY(); // Actualizamos prev
  170. }
  171. sk1Y = p1.getY(); // Actualizamos la altura sk1Y
  172. sk1.remove(0); // Eliminamos el punto del sk1
  173. }
  174.  
  175. else if (p1.getX() > p2.getX()) // si X del sk1 es mayor que la X del sk2
  176. {
  177. pAux.setX(p2.getX()); // Guardamos en pAux la X de p2
  178. pAux.setY(Math.max(p2.getY(), sk1Y)); // Hacemos que el maximo entre la Y del sk2 y la altura previa del sk1 sea la altura Y de pAux
  179.  
  180. if (pAux.getY()!=prev) // Si este maximo no es igual al del segmento anterior
  181. {
  182. salida.add(pAux); // Agregamos el punto al Skyline de salida
  183. prev = pAux.getY(); // Atualizamos prev
  184. }
  185. sk2Y = p2.getY(); // Actualizamos la altura sk2Y
  186. sk2.remove(0); // Eliminamos el punto del sk2
  187. }
  188.  
  189.  
  190. else // si la X del s1 es igual a la X del s2
  191. {
  192. if ((p1.getY() > p2.getY()) && (p1.getY()!=prev)) // Guardaremos el punto que tenga la altura mas alta
  193. {
  194. salida.add(p1);
  195. prev = p1.getY();
  196. }
  197. if ((p1.getY() <= p2.getY()) && (p2.getY()!=prev))
  198. {
  199. salida.add(p2);
  200. prev = p2.getY();
  201. }
  202. sk1Y = p1.getY(); // Actualizamos sk1Y e sk2Y
  203. sk2Y = p2.getY();
  204. sk1.remove(0); // Eliminamos el punto del sk1 y del sk2
  205. sk2.remove(0);
  206. }
  207. }
  208. while ((!sk1.isEmpty())) // Mientras sk1 no este vacio
  209. {
  210. pAux=sk1.get(0); // Guardamos en pAux el primer punto
  211.  
  212. if (pAux.getY()!=prev) // Si pAux no tiene la misma altura del segmento previo
  213. {
  214. salida.add(pAux); // Agregamos pAux al Skyline de salida
  215. prev = pAux.getY(); // Actualizamos prev
  216. }
  217. sk1.remove(0); // Eliminamos el punto de sk1
  218. }
  219. while((!sk2.isEmpty())) // Mientras sk2 no este vacio
  220. {
  221. pAux=sk2.get(0); // Guardamos en pAux el primer punto
  222.  
  223. if (pAux.getY()!=prev) // Si pAux no tiene la misma altura del segmento previo
  224. {
  225. salida.add(pAux); // Agregamos pAux al Skyline de salida
  226. prev = pAux.getY(); // Actualizamos prev
  227. }
  228. sk2.remove(0); // Eliminamos el punto de sk2
  229. }
  230. return salida;
  231. }
  232.  
  233.  
  234. }
Add Comment
Please, Sign In to add comment