Ejemplo n.º 1
0
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 << " ");
}
Ejemplo n.º 2
0
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;
    }
  }
}