-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWorldGraph.java
More file actions
102 lines (82 loc) · 2.04 KB
/
WorldGraph.java
File metadata and controls
102 lines (82 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import java.io.*;
import java.nio.*;
import java.util.*;
import java.lang.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class WorldGraph{
int numCities;
double[][] distance;
String[] cityNames;
double[] lats;
double[] lons;
public double calcDistance(double lat1,double lon1,double lat2,double lon2){
double p = 0.017453292519943295; // Math.PI / 180
double a = 0.5 - Math.cos((lat2 - lat1) * p)/2 +
Math.cos(lat1 * p) * Math.cos(lat2 * p) *
(1 - Math.cos((lon2 - lon1) * p))/2;
return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
}
public WorldGraph(String filename){
parse(filename);
updateDistances();
}
/**
* [parse description]
* @method parse
* @param String filename [description]
*/
public void parse(String filename){
File file = new File(filename);
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String text = null;
text = reader.readLine();
numCities = Integer.parseInt(text);
cityNames = new String[numCities];
lats = new double[numCities];
lons = new double[numCities];
int i = 0;
while ((text = reader.readLine()) != null) {
String[] parts = text.split(",");
cityNames[i] = parts[0];
lats[i] = Double.parseDouble(parts[1]);
lons[i] = Double.parseDouble(parts[2]);
i++;
}
}catch(FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
}
}
}
public double getDistance(int o, int d){
return distance[o][d];
}
public int getnumCities(){
return numCities;
}
public String getLabel(int n){
return cityNames[n];
}
public void updateDistances(){
distance = new double[numCities][numCities];
for(int i = 0; i<numCities; i++){
for(int j = 0; j<numCities; j++){
if(i==j){
distance[i][j] = 0.0;
}else{
distance[i][j] = calcDistance(lats[i], lons[i], lats[j], lons[j]);
}
}
}
}
}