merge adjacent intervals with small gaps in cells to reduce total interval number to maximum
| 183 | |
| 184 | // merge adjacent intervals with small gaps in cells to reduce total interval number to maximum |
| 185 | void LASinterval::merge_intervals(U32 maximum_intervals) |
| 186 | { |
| 187 | U32 diff = 0; |
| 188 | LASintervalCell* cell; |
| 189 | LASintervalCell* delete_cell; |
| 190 | |
| 191 | // each cell has minimum one interval |
| 192 | |
| 193 | if (maximum_intervals < get_number_cells()) |
| 194 | { |
| 195 | maximum_intervals = 0; |
| 196 | } |
| 197 | else |
| 198 | { |
| 199 | maximum_intervals -= get_number_cells(); |
| 200 | } |
| 201 | |
| 202 | // order intervals by smallest gap |
| 203 | |
| 204 | my_cell_map map; |
| 205 | my_cell_hash::iterator hash_element = ((my_cell_hash*)cells)->begin(); |
| 206 | while (hash_element != ((my_cell_hash*)cells)->end()) |
| 207 | { |
| 208 | cell = (*hash_element).second; |
| 209 | while (cell->next) |
| 210 | { |
| 211 | diff = cell->next->start - cell->end - 1; |
| 212 | map.insert(my_cell_map::value_type(diff, cell)); |
| 213 | cell = cell->next; |
| 214 | } |
| 215 | hash_element++; |
| 216 | } |
| 217 | |
| 218 | // maybe nothing to do |
| 219 | if (map.size() <= maximum_intervals) |
| 220 | { |
| 221 | if (map.size() == 0) |
| 222 | { |
| 223 | LASMessage(LAS_VERBOSE, "maximum_intervals: %u number of interval gaps: 0 ", maximum_intervals); |
| 224 | } |
| 225 | else |
| 226 | { |
| 227 | diff = (*(map.begin())).first; |
| 228 | LASMessage(LAS_VERBOSE,"maximum_intervals: %u number of interval gaps: %u next largest interval gap %u", maximum_intervals, (U32)map.size(), diff); |
| 229 | } |
| 230 | return; |
| 231 | } |
| 232 | |
| 233 | my_cell_map::iterator map_element; |
| 234 | U32 size = (U32)map.size(); |
| 235 | |
| 236 | while (size > maximum_intervals) |
| 237 | { |
| 238 | map_element = map.begin(); |
| 239 | diff = (*map_element).first; |
| 240 | cell = (*map_element).second; |
| 241 | map.erase(map_element); |
| 242 | if ((cell->start == 1) && (cell->end == 0)) // the (start == 1 && end == 0) signals that the cell is to be deleted |
nothing calls this directly
no test coverage detected