Hi Dean,<br><br>I agree. Its wasteful to call Initialize() multiple times, unless the input polygonal dataset has changed. As you've suggested, I would prefer a time-stamp check against the MTIme of the input polydata before rebuilding the adjacency information.
<br><br>Thanks<br>--<br>karthik<br><br><br><div><span class="gmail_quote">On 4/23/07, <b class="gmail_sendername"><a href="mailto:dean.inglis@camris.ca">dean.inglis@camris.ca</a></b> <<a href="mailto:dean.inglis@camris.ca">
dean.inglis@camris.ca</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi,<br><br>I am developing a filter to do Dijkstra's shortest
<br>path algorithm along the lines of vtkDijkstraGraphGeodesicPath<br>which inherits from vtkPolyDataAlgorithm.  My version is<br>directed to vtkImageData and I have also written a<br>vtkContourLineInterpolator so that one can interactively
<br>generate polydata paths between vertices.<br><br>It works but I want to make this more efficient, since in the polydata<br>implementation: vtkPolygonalSurfaceContourLineInterpolator<br>instantiates a new vtkDijkstraGraphGeodesicPath (vtkDGGP) every time
<br>a new pair of vertices are identified by the vtkContourWidget.<br>For every instantiation, vtkDGGP has to initialize itself,<br>build an adjacency list etc.  If the input is not changing,<br>this is unnecessary and only two ivars need to be reset:
<br>  this->IdList->Reset();<br>  this->Hsize = 0;<br>currently this is done in Initialize, but Initialize could<br>be split with the previous two lines placed in a separate<br>Reset() method.  In this way Initialize could be done at
<br>the point of SetInput or SetInputConnection rather than<br>in RequestData.  Am I on the right track here?<br>Would there need to be a time stamp mechanism<br>in the filter's  RequestData so that Initialize is called only when the
<br>input to the filter is changed?<br><br>Dean<br><br>//----------------------------------------------------------------------------<br>int vtkDijkstraGraphGeodesicPath::RequestData(<br>  vtkInformation *           vtkNotUsed( request ),
<br>  vtkInformationVector **    inputVector,<br>  vtkInformationVector *     outputVector)<br>{<br>  vtkInformation * inInfo = inputVector[0]->GetInformationObject(0);<br>  vtkInformation *outInfo =   outputVector->GetInformationObject(0);
<br><br>  vtkPolyData *input = vtkPolyData::SafeDownCast(<br>    inInfo->Get(vtkDataObject::DATA_OBJECT()));<br>  if (!input)<br>    {<br>    return 0;<br>    }<br><br>  vtkPolyData *output = vtkPolyData::SafeDownCast(
<br>    outInfo->Get(vtkDataObject::DATA_OBJECT()));<br>  if (!input)<br>    {<br>    return 0;<br>    }<br><br>/* HERE IS WHERE SOME FORM OF TIME STAMP CHECKING<br>   COULD BE DONE ???? */<br><br>  this->Initialize();
<br><br>/* I.E.:<br>   if (this->BuildTime > this->MTime)<br>     this->Reset();<br>  else<br>     this->Initialize();    */<br><br><br>  this->ShortestPath(this->StartVertex, this->EndVertex);<br>
  this->TraceShortestPath(input, output, this->StartVertex, this->EndVertex);<br>  return 1;<br>}<br><br>//----------------------------------------------------------------------------<br>void vtkDijkstraGraphGeodesicPath::Initialize()
<br>{<br>  vtkPolyData *input = vtkPolyData::SafeDownCast(<br>      this->GetExecutive()->GetInputData(0, 0));<br><br>  this->BuildAdjacency( input );<br><br>/*  this->IdList->Reset();  // move out to a method called Reset*/
<br><br>  this->n = input->GetNumberOfPoints();<br><br>  this->d->SetNumberOfComponents(1);<br>  this->d->SetNumberOfTuples(this->n);<br>  this->pre->SetNumberOfComponents(1);<br>  this->pre->SetNumberOfTuples(this->n);
<br>  this->f->SetNumberOfComponents(1);<br>  this->f->SetNumberOfTuples(this->n);<br>  this->s->SetNumberOfComponents(1);<br>  this->s->SetNumberOfTuples(this->n);<br>  this->p->SetNumberOfComponents(1);
<br>  this->p->SetNumberOfTuples(this->n);<br><br>  // The heap has elements from 1 to n<br>  this->H->SetNumberOfComponents(1);<br>  this->H->SetNumberOfTuples(this->n+1);<br><br> /* this->Hsize = 0;  // move out to a method called Reset*/
<br><br>  this->Reset();  //*** new method<br>}<br><br>//----------------------------------------------------------------------------<br>void vtkDijkstraGraphGeodesicPath::Reset()<br>{<br>  this->IdList->Reset();
<br>  this->Hsize = 0;<br>}<br><br>_______________________________________________<br>vtk-developers mailing list<br><a href="mailto:vtk-developers@vtk.org">vtk-developers@vtk.org</a><br><a href="http://www.vtk.org/mailman/listinfo/vtk-developers">
http://www.vtk.org/mailman/listinfo/vtk-developers</a><br></blockquote></div><br><br>