00001
00002 import java.io.*;
00003 import java.util.*;
00004
00006
00012 public final class TerrainFileLoader implements TerrainGenerator
00013 {
00015 private final class Node
00016 {
00017 public final int x;
00018 public final int y;
00019 public final double z;
00020
00021 public Node(final int x, final int y, final double z)
00022 {
00023 this.x = x;
00024 this.y = y;
00025 this.z = z;
00026 }
00027 }
00028
00029 private byte[][] Terrain;
00030 private String filename;
00031 private int min_x = Integer.MAX_VALUE;
00032 private int max_x = Integer.MIN_VALUE;
00033 private int min_y = Integer.MAX_VALUE;
00034 private int max_y = Integer.MIN_VALUE;
00035 private double min_z = Double.POSITIVE_INFINITY;
00036 private double max_z = Double.NEGATIVE_INFINITY;
00037 private double sum_z = 0;
00038
00039 public TerrainFileLoader(String filename)
00040 {
00041 this.filename = filename;
00042
00043 final ArrayList<Node> nodes = parse();
00044 final int x_range = max_x - min_x + 1;
00045 final int y_range = max_y - min_y + 1;
00046 final double scaled_z = 255 / (max_z - min_z);
00047 Terrain = new byte[x_range][y_range];
00048
00049
00050 byte averageValue = (byte) (scaled_z * sum_z / nodes.size());
00051 for(int x = 0; x < x_range; x++)
00052 {
00053 Arrays.fill(Terrain[x], averageValue);
00054 }
00055
00056
00057 for(Iterator<TerrainFileLoader.Node> it = nodes.iterator(); it.hasNext();)
00058 {
00059 TerrainFileLoader.Node node = it.next();
00060 Terrain[node.x - min_x][node.y - min_y] = (byte) (scaled_z * (node.z - min_z));
00061 }
00062 }
00063
00064 public byte[][] getTerrain()
00065 {
00066 return Terrain;
00067 }
00068
00069 private ArrayList<Node> parse()
00070 {
00071 try
00072 {
00073 final ArrayList<Node> nodes = new ArrayList<TerrainFileLoader.Node>();
00074 BufferedReader in = new BufferedReader(new FileReader(filename));
00075 String str;
00076 while((str = in.readLine()) != null)
00077 {
00078 final StringTokenizer parser = new StringTokenizer(str);
00079 final int x = Integer.parseInt(parser.nextToken()) / 10;
00080 final int y = Integer.parseInt(parser.nextToken()) / 10;
00081 final double z = Double.parseDouble(parser.nextToken());
00082 nodes.add(new Node(x, y, z));
00083 updateLimits(x, y, z);
00084 }
00085 in.close();
00086 return nodes;
00087 }
00088 catch(Exception ex)
00089 {
00090 throw new RuntimeException("Unable to parse file");
00091 }
00092 }
00093
00094 private void updateLimits(final int x, final int y, final double z)
00095 {
00096 min_x = Math.min(min_x, x);
00097 max_x = Math.max(max_x, x);
00098 min_y = Math.min(min_y, y);
00099 max_y = Math.max(max_y, y);
00100 min_z = Math.min(min_z, z);
00101 max_z = Math.max(max_z, z);
00102 sum_z += z;
00103 }
00104 }