void rewrite_set( vector<input_t>& setin, vector<output_t>& setout, bool (*connectable)(const input_t&, const input_t&), void (*merge)(const forward_list<input_t*>&, output_t&)) { int dist_ll_count = 0; forward_list<forward_list<input_t*>> components; // create connected components for (int i = 0; i < setin.size(); ++i) { input_t* elem0 = &setin[i]; bool inserted = false; // try to find a connected component where elem0 belongs to for (auto comp = components.begin(); comp != components.end(); ++comp) { for (auto elem1 = comp->begin(); elem1 != comp->end(); ++elem1) { ++dist_ll_count; if (connectable(*elem0, *(*elem1))) { // we found an already exisiting component where elem0 fits in comp->push_front(elem0); inserted = true; break; } } if (inserted) break; } if (!inserted) { // no component fits elem0, create a new one components.push_front(forward_list<input_t*>()); components.front().push_front(elem0); //forward_list<input_t*> comp; //comp.push_front(elem0); //components.push_front(comp); } } // merge the components and put them into a new vector output_t newelem; for (auto comp = components.begin(); comp != components.end(); ++comp) { merge(*comp, newelem); setout.push_back(newelem); } PCV_DEBUG(cout << "dist_ll_count: " << dist_ll_count << " "); }
void ShapeCrest::mergeCandidates() { for (size_t i = 0; i < crest_edges.size(); ++i) { STLVectori temp_edges; temp_edges.push_back(crest_edges[i].first); temp_edges.push_back(crest_edges[i].second); crest_lines.push_back(temp_edges); } // merge connected edge int tag = 0; size_t i = 0; while (i < crest_lines.size()) { int start = crest_lines[i][0]; int end = crest_lines[i][crest_lines[i].size() - 1]; for (size_t j = i + 1; j < crest_lines.size(); ++j) { int cur_start = crest_lines[j][0]; int cur_end = crest_lines[j][crest_lines[j].size() - 1]; // four types if (start == cur_start) { int start_n = crest_lines[i][1]; // the next v_id from start int cur_start_n = crest_lines[j][1]; // the next v_id from start if (connectable(start, start_n, cur_start_n)) { std::reverse(crest_lines[j].begin(), crest_lines[j].end()); crest_lines[i].insert(crest_lines[i].begin(), crest_lines[j].begin(), crest_lines[j].end() - 1); crest_lines.erase(crest_lines.begin() + j); tag = 1; break; } } else if (start == cur_end) { int start_n = crest_lines[i][1]; // the next v_id from start int cur_end_p = crest_lines[j][crest_lines[j].size() - 2]; if (connectable(start, start_n, cur_end_p)) { crest_lines[i].insert(crest_lines[i].begin(), crest_lines[j].begin(), crest_lines[j].end() - 1); crest_lines.erase(crest_lines.begin() + j); tag = 1; break; } } else if (end == cur_start) { int end_p = crest_lines[i][crest_lines[i].size() - 2]; int cur_start_n = crest_lines[j][1]; // the next v_id from start if (connectable(end, end_p, cur_start_n)) { crest_lines[i].insert(crest_lines[i].end(), crest_lines[j].begin() + 1, crest_lines[j].end()); crest_lines.erase(crest_lines.begin() + j); tag = 1; break; } } else if (end == cur_end) { int end_p = crest_lines[i][crest_lines[i].size() - 2]; int cur_end_p = crest_lines[j][crest_lines[j].size() - 2]; if (connectable(end, end_p, cur_end_p)) { std::reverse(crest_lines[j].begin(), crest_lines[j].end()); crest_lines[i].insert(crest_lines[i].end(), crest_lines[j].begin() + 1, crest_lines[j].end()); crest_lines.erase(crest_lines.begin() + j); tag = 1; break; } } } if (tag == 1) { tag = 0; } else { ++i; } } }