void closest_grouped(ivl_vector_t& vx, ivl_vector_t& vy, std::vector<int>& indices_x, std::vector<int>& indices_y, std::vector<int>& overlap_sizes, std::vector<int>& distance_sizes) { ivl_tree_t tree_y(vy) ; std::pair<int, ivl_vector_t> min_dist; // initiatialize maximum left and right distances to minimize for closest int max_end = std::max(vx.back().stop, vy.back().stop) ; for (auto const& vx_it : vx) { ivl_vector_t closest ; ivl_vector_t closest_ivls ; min_dist = std::make_pair(max_end, closest_ivls) ; tree_y.findClosest(vx_it.start, vx_it.stop, closest, min_dist) ; for (auto const& ov_it : closest) { auto overlap = intervalOverlap(vx_it, ov_it) ; if (overlap > 0) { indices_x.push_back(vx_it.value) ; indices_y.push_back(ov_it.value) ; overlap_sizes.push_back(overlap < 0 ? -overlap : overlap) ; distance_sizes.push_back(0); } else if (ov_it.start >= vx_it.stop) { indices_x.push_back(vx_it.value) ; indices_y.push_back(ov_it.value) ; overlap_sizes.push_back(0) ; distance_sizes.push_back(-(overlap - 1)); } else { indices_x.push_back(vx_it.value) ; indices_y.push_back(ov_it.value) ; overlap_sizes.push_back(0) ; distance_sizes.push_back(overlap - 1); } } closest.clear() ; } }
void intersect_group(ivl_vector_t vx, ivl_vector_t vy, std::vector<int>& indices_x, std::vector<int>& indices_y, std::vector<int>& overlap_sizes) { ivl_tree_t tree_y(vy) ; ivl_vector_t overlaps ; for (auto it : vx) { tree_y.findOverlapping(it.start, it.stop, overlaps) ; // store current intervals for (auto oit : overlaps) { int overlap_size = intervalOverlap(it, oit) ; overlap_sizes.push_back(overlap_size) ; indices_x.push_back(it.value) ; indices_y.push_back(oit.value) ; } overlaps.clear() ; } }