-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTreeNode.java
More file actions
182 lines (164 loc) · 6.84 KB
/
TreeNode.java
File metadata and controls
182 lines (164 loc) · 6.84 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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Comparator;
/**
* Αυτή η κλάση απεικονίζει έναν κόμβο στο R*
*/
public class TreeNode implements Serializable {
//παιδιά του κόμβου όταν αυτός δεν είναι φύλλο (αποθήκευση κόμβων)
private ArrayList<TreeNode> children;
//παιδιά του κόμβου όταν αυτός είναι φύλλο (αποθήκευση σημείων)
private ArrayList<Point> points;
//ορθογώνιο που σχηματίζεται από τον κόμβο
private MBR mbr;
//μέγιστος αριθμός θέσεων σε κάθε κόμβο
private int upper_limit =5;
//απόσταση κόμβου από ένα σημείο
private double distance_from_point = Double.MAX_VALUE;
/**
* Κατασκευαστής με 4 ορίσματα
* @param x1 : η μικρότερη τιμή στον άξονα x
* @param x2 : η μεγαλύτερη τιμή στον άξονα x
* @param y1 : η μικρότερη τιμή στον άξονα y
* @param y2 : η μεγαλύτερη τιμή στον άξονα y
*/
public TreeNode(double x1, double x2, double y1, double y2){
mbr = new MBR(x1,x2,y1,y2);
children = new ArrayList<>(upper_limit);
points = new ArrayList<>(upper_limit);
}
/**
* Getter για την απόσταση μεταξύ ενός κόμβου και ένός σημείου
*/
public double getDistance_from_point(){
return distance_from_point;
}
/**
* Setter για την απόσταση μεταξύ ενός κόμβου και ένός σημείου
*/
public void setDistance_from_point(double other_distance){
distance_from_point =other_distance;
}
/**
* Getter για τα σημεία του κόμβου αν αυτός είναι φύλλο
*/
public ArrayList<Point> getPoints(){
return points;
}
/**
* Setter για τα σημεία του κόμβου
*/
public void setPoints(ArrayList<Point> new_points){
points.clear();
points=new_points;
}
/**
* Getter για τα παιδιά του κόμβου
*/
public ArrayList<TreeNode> getChildren(){
return children;
}
/**
* Setter για τα παιδιά του κόμβου
*/
public void setChildren(ArrayList<TreeNode> new_children){
children.clear();
children =new_children;
}
/**
* Getter για το mbr
*/
public MBR getMbr(){
return mbr;
}
/**
* Μέθοδος που επιστρέφει αν ένας κόμβος είναι φύλλο ή όχι
*/
public boolean isLeaf(){
return children.isEmpty() ;
}
/**
* Μέθοδος που προσθέτει έναν καινούργιο κόμβο ως παιδί αν ο κόμβος-γονιός δεν είναι φύλλο
* @param new_node ο κόμβος που θέλουμε να προσθέσουμε ως παιδί
*/
public void add_new_child_node(TreeNode new_node){
//προσθήκη νέου κόμβου στη λίστα με τα παιδιά
children.add(new_node);
//αλλαγή στις τιμές των x1, x2, y1, y2 του MBR
mbr.setNewDimensions(new_node.getMbr().getAllValues().get(0),new_node.getMbr().getAllValues().get(1),new_node.getMbr().getAllValues().get(2),new_node.getMbr().getAllValues().get(3));
}
/**
* Μέθοδος που προσθέτει ένα σημείο ως παιδί αν ο κόμβος-γονιός είναι φύλλο
* @param new_point το σημείο που θέλουμε να προσθέσουμε
*/
public void add_new_point(Point new_point){
//
points.add(new_point);
mbr.setNewDimensions(new_point.getLat(),new_point.getLon());
}
/**
* Συνάρτηση που προσθέτει καινούργια παιδιά σε έναν κόμβο
* @param points λίστα από σημεία που θέλουμε να προσθέσουμε
*/
public void add_children_nodes(ArrayList<Point> points){
this.points = points;
}
/**
* Συνάρτηση που συγκρίνει δύο κόμβους σύμφωνα με τις τιμές των ορθογωνίων τους
* πρώτα γίνεται ταξινόμηση ως προς τη μικρότερη τιμή του x και μετά ως προς τη μεγαλύτερη τιμή του x
*/
static class RectangleComparatorX implements Comparator<TreeNode> {
@Override
public int compare(TreeNode o1, TreeNode o2) {
if(o1.getMbr().getAllValues().get(0) > o2.getMbr().getAllValues().get(0)){
return -1;
}
else if(o1.getMbr().getAllValues().get(0) < o2.getMbr().getAllValues().get(0)){
return 1;
}
else if(o1.getMbr().getAllValues().get(0).equals(o2.getMbr().getAllValues().get(0))){
if(o1.getMbr().getAllValues().get(1) > o2.getMbr().getAllValues().get(1)){
return -1;
}
else if(o1.getMbr().getAllValues().get(1) < o2.getMbr().getAllValues().get(1)){
return 1;
}
else {
return 0;
}
}
else{
return 0;
}
}
}
/**
* Συνάρτηση που συγκρίνει δύο κόμβους σύμφωνα με τις τιμές των ορθογωνίων τους
* πρώτα γίνεται ταξινόμηση ως προς τη μικρότερη τιμή του y και μετά ως προς τη μεγαλύτερη τιμή του y
*/
static class RectangleComparatorY implements Comparator<TreeNode>{
@Override
public int compare(TreeNode o1, TreeNode o2) {
if(o1.getMbr().getAllValues().get(2) > o2.getMbr().getAllValues().get(2)){
return -1;
}
else if(o1.getMbr().getAllValues().get(2) < o2.getMbr().getAllValues().get(2)){
return 1;
}
else if(o1.getMbr().getAllValues().get(2).equals(o2.getMbr().getAllValues().get(2))){
if(o1.getMbr().getAllValues().get(3) > o2.getMbr().getAllValues().get(3)){
return -1;
}
else if(o1.getMbr().getAllValues().get(3) < o2.getMbr().getAllValues().get(3)){
return 1;
}
else {
return 0;
}
}
else{
return 0;
}
}
}
}