number FracturedMediaRefiner<TGrid, TAPosition>::
aspect_ratio(Face* f)
{
	if(!m_aaPos.valid())
		UG_THROW("A position attachment has to be specified before this method is called.");

	EdgeDescriptor ed;
	f->edge_desc(0, ed);

	number eMin = EdgeLength(&ed, m_aaPos);
	number eMax = eMin;

	for(size_t i = 1; i < f->num_edges(); ++i){
		f->edge_desc(i, ed);
		number len = EdgeLength(&ed, m_aaPos);
		if(len < eMin)
			eMin = len;
		else if(len > eMax)
			eMax = len;
	}

	if(eMax <= 0)
		return 0;

	return eMin / eMax;
}
Esempio n. 2
0
double CycleLength(int *ants)
{
	double value=0;

	for(int i=0;i<n-1;i++)
		value+=EdgeLength(ants[i],ants[i+1]);

	value+=EdgeLength(ants[0],ants[n-1]);

	return value;
}
Esempio n. 3
0
double *FindProbabilites(int k, const int city, bool *visited, double **pheromones)
{
  double *taueta = new double[n];
  double sum = 0.0;
  for (int i = 0; i < n; ++i) 
  {
    if (i == city)
      taueta[i] = 0.0; // Prawdopodobie�stwo przej�cia z miasta x do miasta x wynosi 0
    else if (visited[i] == true)
      taueta[i] = 0.0; // Prawdopodobie�stwo przej�cia z miasta x do miasta odwiedzonego wynosi 0
    else 
	{
      taueta[i] = pow(pheromones[city][i], ALPHA) * pow((1.0 / EdgeLength(city, i)), BETA); // obliczenie prawdopodobie�stwa wed�ug okre�lonego wzoru
      if (taueta[i] < 0.0001)
        taueta[i] = 0.0001;
      else if (taueta[i] > (MaxValue() / (n * 100)))
        taueta[i] = MaxValue() / (n * 100);
    }
    sum += taueta[i];
  }
 
  double *probs = new double[n];
  for (int i = 0; i <n; ++i)
    probs[i] = taueta[i] / sum;
 
  return probs;
}
void
FracturedMediaRefiner<TGrid, TAPosition>::
collect_objects_for_refine()
{
//	get the grid on which we'll operate
	if(!BaseClass::get_associated_grid())
		UG_THROW("No grid has been set for the refiner.");

	Grid& grid = *BaseClass::get_associated_grid();

//	make sure that the position accessor is valid
	if(!m_aaPos.valid())
		UG_THROW("A position attachment has to be specified before this method is called.");

//	push all marked degenerated faces to a queue.
//	pop elements from that queue, mark them anisotropic and unmark associated
//	degenerated edges.
//	Furthermore we'll push degenerated faces, which are connected to the current
//	face through a regular edge to the queue (only unprocessed ones).

	typename BaseClass::selector_t& sel = BaseClass::get_refmark_selector();

//	some helpers
	vector<Edge*> edges;
	vector<Face*> faces;

//	we need two while-loops. The outer is required to process changes which
//	stem from the base-class implementation.
//todo:	This is a lot of processing due to repeated calls to collect_objects_for_refine.
	do{
		while(!m_queDegeneratedFaces.empty())
		{
			Face* f = m_queDegeneratedFaces.front();
			m_queDegeneratedFaces.pop();

		//	mark as anisotropic
			if(BaseClass::get_mark(f) != RM_ANISOTROPIC)
				BaseClass::mark(f, RM_ANISOTROPIC);

		//	check edges
			CollectAssociated(edges, grid, f);

		//	get the edge with the maximal length
			number eMax = 0;
			for(size_t i_edge = 0; i_edge < edges.size(); ++i_edge){
				number len = EdgeLength(edges[i_edge], m_aaPos);
				if(len > eMax)
					eMax = len;
			}

			if(eMax <= 0)
				eMax = SMALL;

		//	degenerated neighbors of non-degenerated edges have to be selected.
		//	degenerated edges may not be selected
			size_t numDeg = 0;
			for(size_t i_edge = 0; i_edge< edges.size(); ++i_edge){
				Edge* e = edges[i_edge];
				if(EdgeLength(e, m_aaPos) / eMax >= m_aspectRatioThreshold){
				//	non-degenerated edge
				//	make sure it is selected
					if(BaseClass::get_mark(e) != RM_REFINE)
						BaseClass::mark(e, RM_REFINE);

				//	this edge possibly connects to an unselected degenerated neighbor.
				//	If this is the case, we'll have to mark it and push it to the queue.
					CollectAssociated(faces, grid, e);
					for(size_t i_face = 0; i_face < faces.size(); ++i_face){
						Face* nbr = faces[i_face];
						if(!sel.is_selected(nbr)){
							if(aspect_ratio(f) < m_aspectRatioThreshold){
							//	push it to the queue.
								m_queDegeneratedFaces.push(nbr);
							}
						}
					}
				}
				else{
				//	degenerated edge. unmark it
					BaseClass::mark(e, RM_NONE);
					++numDeg;
				}
			}

		//	if all edges are degenerate, we will have to perform regular refinement
			if(numDeg == edges.size()){
				BaseClass::mark(f, RM_REFINE);
				for(size_t i = 0; i < edges.size(); ++i)
					BaseClass::mark(edges[i], RM_REFINE);
			}
		}

	//	now call the base implementation. If degenerated faces are selected during
	//	that step, then we have to process them too.
		BaseClass::collect_objects_for_refine();
	}while(!m_queDegeneratedFaces.empty());
}