gon2

EuclideanMST.java

Apr 10th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.31 KB | None | 0 0
  1. package heima11;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. import edu.princeton.cs.algs4.*;
  6.  
  7. public class EuclideanMST {
  8.  
  9.     // Fastar sem skilgreina mörk kortsins sem á að teikna.
  10.     private double xMin = Double.POSITIVE_INFINITY;
  11.     private double xMax = Double.NEGATIVE_INFINITY;
  12.     private double yMin = Double.POSITIVE_INFINITY;
  13.     private double yMax = Double.NEGATIVE_INFINITY;
  14.  
  15.     private ArrayList<Point2D> points; // Skilgreinið þessa breytu í smiðnum.
  16.     private EdgeWeightedGraph G;
  17.     private KruskalMST mst; // Skilgreinið þessa breytu í smiðnum. Hér mætti líka nota PrimMST.
  18.    
  19.     private double max = 0;
  20.  
  21.     public EuclideanMST(In in) {
  22.         /*
  23.          * Les hnit úr inntaksstraumnum <in> og upphafsstillir tilviksbreyturnar <this.mst> og <this.points>.
  24.          */
  25.        
  26.         points = new ArrayList<>();
  27.         fillPoints(in); // fyllum arraylistann
  28.        
  29.         G = new EdgeWeightedGraph((int) max+1);
  30.         fillGraph(in); // fyllum í grafið
  31.        
  32.         mst = new KruskalMST(G); // finnum stysta spanntréð  
  33.     }
  34.    
  35.     /**
  36.      * Sér um að bæta við punktum úr skránni í arraylist
  37.      * @param in Textaskráin okkar
  38.      */
  39.     private void fillPoints(In in) {
  40.         while (!in.isEmpty()) {
  41.             String[] a = in.readLine().split(" ");
  42.             for (int i=1; i<a.length; i++) {
  43.                 Point2D point = new Point2D(Double.valueOf(a[2]), Double.valueOf(a[1]));
  44.                 if (!points.contains(point))
  45.                     points.add(point);
  46.                 if (Double.valueOf(a[1]) > max) max = Double.valueOf(a[1]);
  47.             }
  48.         }
  49.     }
  50.  
  51.     /*
  52.      * Fillum EdgeWeightedGraph af öllum mögulegum leggjum á milli hnúta (fyrir utan lykkjur)
  53.      */
  54.     private void fillGraph(In in) {
  55.         for (int i=0; i<points.size(); i++) {
  56.             Point2D p = points.get(i);
  57.            
  58.             for (int j=0; j<points.size(); j++) {
  59.                 Double d = p.distanceTo(points.get(j));
  60.                 if (i!=j) {
  61.                     Edge e = new Edge(i, j, d);
  62.                     G.addEdge(e);
  63.                 }
  64.             }
  65.         }
  66.     }
  67.  
  68.     private void drawMST() {
  69.         /*
  70.          * Teiknar spanntréð í tilviksbreytunni <this.mst> með hnitin <this.points>.
  71.          * Gerir ráð fyrir að <this.xMax>, <this.xMin>, <this.yMax> og <this.yMin> séu upphafsstillt.
  72.          */
  73.         for (Edge e : mst.edges()) {
  74.             int x = e.either(); // annarhvor endi leggsins
  75.             int y = e.other(x); // hinn endinn
  76.             double x0 = points.get(x).x();
  77.             double y0 = points.get(x).y();
  78.             double x1 = points.get(y).x();
  79.             double y1 = points.get(y).y();
  80.             StdDraw.line(x0-xMin, y0-yMin, x1-xMin, y1-yMin); // teikum línu
  81.         }
  82.        
  83.         StdDraw.save("mst.jpg");
  84.     }
  85.  
  86.     public void drawPoints() {
  87.         /*
  88.          * Teiknar hnitin í <this.points> á striga.
  89.          * Gerir ráð fyrir að <this.xMin> og <this.yMin> hafi verið upphafsstillt. Sjá initializeCanvas().
  90.          *
  91.          */
  92.         for (Point2D p : points) {
  93.             StdDraw.point(p.x() - xMin, p.y() - yMin);
  94.         }
  95.        
  96.         StdDraw.save("punktar.jpg");
  97.     }
  98.  
  99.     public void initializeCanvas() {
  100.         /*
  101.          * Upphafsstillir striga út frá gögnunum í <this.points>.
  102.          * Setur vitræn gildi á <this.xMax>, <this.xMin>, <this.yMax> og <this.yMin>.
  103.          */
  104.  
  105.         // Útgildin fundin
  106.         for (Point2D point : points) {
  107.             if (point.x() < xMin) {
  108.                 xMin = point.x();
  109.             }
  110.             if (xMax < point.x()) {
  111.                 xMax = point.x();
  112.             }
  113.             if (point.y() < yMin) {
  114.                 yMin = point.y();
  115.             }
  116.             if (yMax < point.y()) {
  117.                 yMax = point.y();
  118.             }
  119.         }
  120.         // Ramminn stækkaður aðeins svo allir punktar geti sést
  121.         double xDiff = xMax - xMin;
  122.         double yDiff = yMax - yMin;
  123.         double padding = 0.1; // Stillir hlutfallslega stærð hvíta rýmisins í kringum punktana
  124.         xMin = xMin - xDiff * padding / 2;
  125.         xMax = xMax + xDiff * padding / 2;
  126.         yMin = yMin - yDiff * padding / 2;
  127.         yMax = yMax + yDiff * padding / 2;
  128.  
  129.         // Striginn sjálfur upphafsstilltur
  130.         StdDraw.setCanvasSize((int) (xMax - xMin), (int) (yMax - yMin));
  131.         StdDraw.setXscale(0, (int) (xMax - xMin));
  132.         StdDraw.setYscale(0, (int) (yMax - yMin));
  133.         StdDraw.setPenRadius(0.01);
  134.     }
  135.  
  136.     public double getWeight() {
  137.         /*
  138.         Sækir þyngd undirliggjandi spanntrés
  139.          */
  140.         return this.mst.weight();
  141.     }
  142.  
  143.     public static void main(String[] args) {
  144.         // ATH: Þetta hrynur við keyrslu þar til points og mst tilviksbreyturnar hafa verið skilgreindar.
  145.         EuclideanMST euclideanMST = new EuclideanMST(new In("/heima11/luxembourg.txt"));
  146.  
  147.         StdOut.println(euclideanMST.getWeight());
  148.  
  149.         euclideanMST.initializeCanvas();
  150.         euclideanMST.drawPoints();
  151.         euclideanMST.drawMST();
  152.     }
  153.  
  154. }
Add Comment
Please, Sign In to add comment