Пример #1
0
CurvaturePartial::CurvaturePartial( Vertex& v, Vertex& w ){
  wrtRadius = true;
  verticesMatch = (v.getIndex() == w.getIndex());
  verticesAdjacent = ( v.isAdjVertex( w.getIndex() ) );

  if( ! ( verticesMatch || verticesAdjacent ) ) return;

  vRadius = Radius::At( v );
  vCurv = Curvature3D::At( v );

  vRadius->addDependent(this);
  vCurv->addDependent(this);

  dualAreas = new vector<DualArea*>();
  dihSums = new vector<DihedralAngleSum*>();
  lengths = new vector<Length*>();
  etas = new vector<Eta*>();
  radii = new vector<Radius*>();

  vector<int> edges;
  if( verticesMatch ){
    edges = *(v.getLocalEdges());
  } else if ( verticesAdjacent ){
    edges = listIntersection( v.getLocalEdges(), w.getLocalEdges() );
  }
  
  StdEdge se;
  DualArea* da; 
  DihedralAngleSum* ds;
  Length* l;
  Eta* eta;
  Radius* r;

  for(int ii = 0; ii < edges.size(); ii++){
    Edge& ed = Triangulation::edgeTable[ edges[ii] ];

    da = DualArea::At( ed );
    da->addDependent( this );
    dualAreas->push_back( da );

    ds = DihedralAngleSum::At( ed );
    ds->addDependent( this );
    dihSums->push_back( ds );

    l = Length::At( ed );
    l->addDependent( this );
    lengths->push_back( l );
    
    eta = Eta::At( ed );
    eta->addDependent( this );
    etas->push_back( eta );

    se = labelEdge( ed, v );
    r = Radius::At( Triangulation::vertexTable[ se.v2 ] );
    r->addDependent( this );
    radii->push_back( r );
  }
}
Пример #2
0
void dfsvisit(graph * g, int source, int * p, int * b , int * f , int *s, int *tm) {
	printf("%x\n", tm);

	 *tm = *tm + 1;
	b[source] = *tm;
	s[source] = 1;

	node * ele;
	int t;
	ele = g->adj[source];

	while(ele != NULL) {
		t = ele->v;

		if(s[t] == 0) {
			// discovery edge
			p[t] = source;
			labelEdge(g, source, t, 'd');
			dfsvisit(g, t, p, b, f, s, tm);
		}
		else if(b[t] < b[source] && s[t] == 1) {
			//backward edge
			labelEdge(g, source, t, 'b');
		}
		else if(b[t] > b[source] && s[t] == 2 && f[t] > b[t]) {
			// forward edge
			labelEdge(g, source, t, 'f');		
		}
		else {
			// cross edge 
			labelEdge(g, source, t, 'c');
		}
		ele = ele->next;
	}
	*tm = *tm + 1;
	f[source] = *tm;
	s[source] = 2;
}