// Loads polygons into the scene from the saveFile
  private static void openPolygons() {
    if (saveFile.exists()) {
      polygons.clear();

      try {
        Scanner fileIn = new Scanner(new FileReader(saveFile));

        do {
          if (!fileIn.hasNextLine()) {
            break;
          }

          String name = fileIn.nextLine();

          int size = Integer.valueOf(fileIn.nextLine());

          Polygon p = new Polygon(name);

          for (int i = 0; i < size; i++) {
            String line = fileIn.nextLine();
            String[] pointParts = line.split(",");
            float x = Float.valueOf(pointParts[0]);
            float y = Float.valueOf(pointParts[1]);
            float z = Float.valueOf(pointParts[2]);

            p.addPoint(new Point3Df(x, y, z));
          }

          size = Integer.valueOf(fileIn.nextLine());

          for (int i = 0; i < size; i++) {
            String line = fileIn.nextLine();
            String[] edgeParts = line.split(",");
            int p1 = Integer.valueOf(edgeParts[0]);
            int p2 = Integer.valueOf(edgeParts[1]);

            p.addEdge(new Edge(p1, p2));
          }

          polygons.add(p);
        } while (true);

        rebound();

        fileIn.close();
      } catch (FileNotFoundException ex) {
        // Can't find file
      }
    } else {
      // File doesn't exist
    }
  }
  // Writes polygons to the saveFile
  private static void savePolygons() {
    if (!saveFile.exists()) {
      try {
        saveFile.createNewFile();
      } catch (IOException ex) {
        // Can't create file
      }
    }

    try {
      PrintStream fileOut = new PrintStream(saveFile);
      for (Polygon p : polygons) {
        fileOut.println(p.getName());
        fileOut.println(p.getPoints().size());
        for (Point3Df q : p.getPoints()) {
          fileOut.print(q.x);
          fileOut.print(",");
          fileOut.print(q.y);
          fileOut.print(",");
          fileOut.println(q.z);
        }

        fileOut.println(p.getEdges().size());
        for (Edge q : p.getEdges()) {
          fileOut.print(q.p1);
          fileOut.print(",");
          fileOut.println(q.p2);
        }
      }
      fileOut.close();
    } catch (FileNotFoundException ex) {
      // Can't find file
    }
  }
  private static void rebound() {
    float f = 0.0f;
    float n = 0.0f;
    float b = 0.0f;
    float t = 0.0f;
    float l = 0.0f;
    float r = 0.0f;

    for (Polygon poly : polygons) {
      poly.recalc();

      if (poly.getMinZ() < f) {
        f = poly.getMinZ();
      }
      if (poly.getMaxZ() > n) {
        n = poly.getMaxZ();
      }
      if (poly.getMinY() < b) {
        b = poly.getMinY();
      }
      if (poly.getMaxY() > t) {
        t = poly.getMaxY();
      }
      if (poly.getMinX() < l) {
        l = poly.getMinX();
      }
      if (poly.getMaxX() > r) {
        r = poly.getMaxX();
      }
    }

    float maxSpan = Math.max(Math.max(f - n, t - b), r - l);

    for (Polygon poly : polygons) {
      for (Point3Df p : poly.getPoints()) {
        p.x = p.x * (2 / maxSpan) - (r + l) / (r - l);
        p.y = p.y * (2 / maxSpan) - (t + b) / (t - b);
        p.z = p.z * (2 / maxSpan) - (n + f) / (n - f);
      }

      poly.recalc();
    }
  }
  // Loads polygon from Ply file
  // @ref http://people.sc.fsu.edu/~jburkardt/data/ply/ply.html
  // @todo Check for Ply file type ascii/binary
  // @todo Check for datatypes as per spec
  private static void importPly(File ply) {
    if (ply.exists()) {
      try {
        Scanner fileIn = new Scanner(new FileReader(ply));

        int vertexSize = 0;
        int faceSize = 0;

        do {
          if (!fileIn.hasNextLine()) {
            break;
          } else {
            String line = fileIn.nextLine();

            String[] lineParts = line.split("\\s+");

            if (lineParts[0].equals("element")) {
              if (lineParts[1].equals("vertex")) {
                vertexSize = Integer.valueOf(lineParts[2]);
              } else if (lineParts[1].equals("face")) {
                faceSize = Integer.valueOf(lineParts[2]);
              }
            } else if (lineParts[0].equals("end_header")) {
              break;
            }
          }
        } while (true);

        Polygon p = new Polygon(ply.getName());

        for (int i = 0; i < vertexSize; i++) {
          String line = fileIn.nextLine();
          String[] pointParts = line.split("\\s+");
          float x = Float.valueOf(pointParts[0]);
          float y = Float.valueOf(pointParts[1]);
          float z = Float.valueOf(pointParts[2]);

          p.addPoint(new Point3Df(x, y, z));
        }

        for (int i = 0; i < faceSize; i++) {
          String line = fileIn.nextLine();
          String[] edgeParts = line.split("\\s+");

          int edgeComp = Integer.valueOf(edgeParts[0]);

          for (int j = 0; j < edgeComp - 1; j++) {
            int p1 = Integer.valueOf(edgeParts[j + 1]);
            int p2 = Integer.valueOf(edgeParts[j + 2]);

            p.addEdge(new Edge(p1, p2));
          }
        }

        polygons.add(p);

        rebound();

        fileIn.close();
      } catch (FileNotFoundException ex) {
        // Can't find file
      }
    } else {
      // File doesn't exist
    }
  }