[vtkusers] vtkContourWidget

Karthik Krishnan karthik.krishnan at kitware.com
Mon May 17 11:25:02 EDT 2010


Nicolas:

Replace vtkPolyDataPointPlacer vtkPolygonalSurfacePointPlacer and now I can
no longer move the points ouside teh silhoutte.

Thanks
--
karthik

On Fri, May 14, 2010 at 2:25 PM, Nicolas Sarrasin <
nsarrasin at phenix-systems.com> wrote:

>  Here is a compiling example, I post a picture too to be clearer.
>
> picture : http://img138.imageshack.us/img138/1695/123qny.png
>
> /*        code begins        */
>
> #include <vtkRenderer.h>
> #include <vtkRendererCollection.h>
> #include <vtkRenderWindow.h>
> #include <vtkRenderWindowInteractor.h>
> #include <vtkProperty.h>
> #include <vtkLODActor.h>
> #include <vtkPolyDataMapper.h>
> #include <vtkPolyData.h>
> #include <vtkCellArray.h>
> #include <vtkSphereSource.h>
> #include <vtkContourWidget.h>
> #include <vtkOrientedGlyphContourRepresentation.h>
> #include <vtkLinearContourLineInterpolator.h>
> #include <vtkGlyph3D.h>
> #include <vtkCellPicker.h>
> #include <vtkCallbackCommand.h>
> #include <vtkCamera.h>
> #include <vtkInteractorStyleTrackballCamera.h>
> #include <vtkSmartPointer.h>
> #include <vtkPolyDataPointPlacer.h>
>
> int main(int argc, char*argv[])
> {
>     //définition de la sphere
>     vtkSphereSource* theSphere = vtkSphereSource::New();
>     theSphere->SetCenter( 0, 0, 5);
>     theSphere->SetRadius(1.0);
>
>
>     vtkPolyDataMapper * sphereMapper = vtkPolyDataMapper::New();
>     sphereMapper->SetInput(theSphere->GetOutput());
>
>     vtkLODActor* sphereActor = vtkLODActor::New();
>     sphereActor->SetMapper( sphereMapper);
>
>     // définition Renderer + renderWindow
>     vtkRenderer *renderer1 = vtkRenderer::New();
>     renderer1->SetBackground(0.3, 0.45, 0.6);
>
>     renderer1->AddActor(sphereActor);
>
>     vtkRenderWindow *renWin = vtkRenderWindow::New();
>     renWin->AddRenderer(renderer1);
>     renWin->SetSize(600, 600);
>     renWin->SetPosition(450,150);
>
>     //définition du WindowIteractor
>
>     vtkRenderWindowInteractor *rendIter = vtkRenderWindowInteractor::New();
>     rendIter->SetRenderWindow(renWin);
>
>     // Here comes the image actor constrained handle widget stuff.....
>     vtkContourWidget *widget = vtkContourWidget::New();
>     widget->SetInteractor(rendIter);
>
>     vtkSmartPointer<vtkLinearContourLineInterpolator> contourStyle =
> vtkSmartPointer<vtkLinearContourLineInterpolator>::New();
>
>     vtkOrientedGlyphContourRepresentation *rep
> =vtkOrientedGlyphContourRepresentation::SafeDownCast(
> widget->GetRepresentation() );
>     rep->GetLinesProperty()->SetColor(1, 1, 0);
>     rep->GetLinesProperty()->SetLineWidth(3.0);
>     rep->SetLineInterpolator(contourStyle);
>
>     //on définit un Placer pour forcer le contour a etre sur la sphere
>
>     vtkPolyDataPointPlacer * spherePlacer = vtkPolyDataPointPlacer::New();
>     spherePlacer->AddProp(sphereActor);
>     rep->SetPointPlacer(spherePlacer);
>
>     renWin->Render();
>     rendIter->Initialize();
>     widget->EnabledOn();
>     rendIter->Start();
>
>     //clean
>     rendIter->Delete();
>     renWin->Delete();
>     renderer1->Delete();
>
>     sphereMapper->Delete();
>     sphereActor->Delete();
>     theSphere->Delete();
>
>     return 0;
> }
>
> /*        code ends           */
>
> Thanks
>
>
> Le 14/05/2010 10:13, Karthik Krishnan a écrit :
>
> On Fri, May 14, 2010 at 1:15 PM, Nicolas Sarrasin <
> nsarrasin at phenix-systems.com> wrote:
>
>> Ok thanks for your reply.
>>
>
> Please keep mails on the list, so others may chime in.
>
>
>>
>> I'm gonna use *vtkPolygonalSurfaceContourLineInterpolator*, it satisfied
>> me, for the moment.
>>
>
> Great.
>
>
>>
>>  The interpolator internally traces the shortest path between the two
>> nodes along vertices of the mesh, so its not as good as a projection that
>> cuts through the cells, but if your mesh is dense enough the traced path
>> might be good enough.
>>
>>
>>  What do you suggest me if my mesh isn't dense enough ? How can i project
>> the contour on my sphere ?
>>
>
> The path is an approximation of a projection onto the mesh, such that the
> projected path lies wholly along the vertices of the mesh.
>
>
>> Now I encounter a new "problem" in using contour widget. After closing a
>> contour, everytime I try to modify it by dragging a node, the node can be
>> move outside the surface (it's still inside the silhouette of the sphere but
>> it's not lying on any more and approach the screen).
>>
>
> This should not happen if you are using a vtkPolygonalSurfacePointPlacer to
> constrain the nodes and the vtkPolygonalSurfaceContourLineInterpolator to
> constrain the path.
>
> Please post a minimal, (compiling) example. Also take a look a look at
> TestDijkstraImageGeodesicPath. The contour and the interpolated path are
> confined to the surface of the mesh, while you manipulate interactively.
>
> --
> karthik
>
>
>>
>> How can I manage this problem and constrain the position of the node of
>> the contour during all its lifetime in the visualisation?
>>
>> Thanks by advance,
>>
>> Nicolas
>>
>> Le 12/05/2010 18:43, Karthik Krishnan a écrit :
>>
>> Yes Nicolas:
>>
>> The contour widget uses two sets of classes, which (are generally
>> independent of each other).
>>
>> A subclass of vtkPointPlacer dictates the constraints imposed on the
>> nodes.
>> A subclass of vtkContourLIneInterpolator dictates the constraints imposed
>> on the path in between the nodes.
>>
>> In your case, you might want to look at the following combination :
>>
>>   vtkPolygonalSurfacePointPlacer ->
>> vtkPolygonalSurfaceContourLineInterpolator
>>
>> The interpolator internally traces the shortest path between the two nodes
>> along vertices of the mesh, so its not as good as a projection that cuts
>> through the cells, but if your mesh is dense enough the traced path might be
>> good enough.
>>
>>
>> Something like :
>>
>>
>>    vtkContourWidget *contourWidget = vtkContourWidget::New();
>>   contourWidget->SetInteractor(iren);
>>
>>   vtkOrientedGlyphContourRepresentation *rep =
>>       vtkOrientedGlyphContourRepresentation::SafeDownCast(
>>                         contourWidget->GetRepresentation());
>>
>>   vtkPolygonalSurfacePointPlacer * pointPlacer
>>         = vtkPolygonalSurfacePointPlacer::New();
>>   pointPlacer->AddProp( sphereActor );
>>   rep->SetPointPlacer(pointPlacer);
>>
>>   vtkPolygonalSurfaceContourLineInterpolator * lineInterpolator
>>         = vtkPolygonalSurfaceContourLineInterpolator::New();
>>   rep->SetLineInterpolator(lineInterpolator);
>>
>>   iren->Initialize();
>>   contourWidget->EnabledOn();
>>
>>
>> Hope this helps.. Here is a minimal example..
>>
>> --
>> karthik
>>
>>
>> On Wed, May 12, 2010 at 7:21 PM, Nicolas Sarrasin <
>> nsarrasin at phenix-systems.com> wrote:
>>
>>> Hi all,
>>>
>>> I'm quite new in developping with vtk and I have some questions
>>> concerning vtkContourWidget.
>>>
>>> I built a quick project which uses vtkContourWidget and
>>> vtkPolyDataPointPlacer to display a contour on a sphere.
>>>
>>> When I click on this sphere, there's no problem : the points of the
>>> contour are well positionned on the sphere. But it's not the case for the
>>> spans which are outside or inside the sphere (but not on).
>>>
>>> Is there a way to force the borders of the contour to follow the surface
>>> ?
>>>
>>> A solution would be to project the contour on the sphere but I can find
>>> any documentation about that.
>>>
>>> For more clarity, I post a sample of my code.
>>>
>>> Thanks by advance.
>>>
>>> Nicolas
>>>
>>> code:
>>>
>>>     //sphere definition
>>>
>>>      vtkSphereSource* theSphere = vtkSphereSource::New();
>>>
>>>      vtkPolyDataMapper * sphereMapper = vtkPolyDataMapper::New();
>>>      sphereMapper->SetInput(theSphere->GetOutput());
>>>
>>>      vtkLODActor* sphereActor = vtkLODActor::New();
>>>      sphereActor->SetMapper( sphereMapper);
>>>
>>>      vtkRenderer *renderer1 = vtkRenderer::New();
>>>      renderer1->AddActor(sphereActor);
>>>
>>>      vtkRenderWindow *renWin = vtkRenderWindow::New();
>>>      renWin->AddRenderer(renderer1);
>>>
>>>      vtkRenderWindowInteractor *rendIter = vtkRenderWindowInteractor::New();
>>>      rendIter->SetRenderWindow(renWin);
>>>
>>>      // Here comes the image actor constrained handle widget stuff.....
>>>      vtkContourWidget *widget = vtkContourWidget::New();
>>>      widget->SetInteractor(rendIter);
>>>
>>>      vtkSmartPointer<vtkLinearContourLineInterpolator> contourStyle =
>>> vtkSmartPointer<vtkLinearContourLineInterpolator>::New();
>>>
>>>      vtkOrientedGlyphContourRepresentation *rep
>>> =vtkOrientedGlyphContourRepresentation::SafeDownCast(
>>> widget->GetRepresentation() );
>>>      rep->SetLineInterpolator(contourStyle);
>>>
>>>     // we define a Placer to force the contour to be on the sphere
>>>      vtkPolyDataPointPlacer * spherePlacer = vtkPolyDataPointPlacer::New();
>>>      spherePlacer->AddProp(sphereActor);
>>>      rep->SetPointPlacer(spherePlacer);
>>>
>>>      renWin->Render();
>>>      rendIter->Initialize();
>>>      widget->EnabledOn();
>>>      rendIter->Start();/
>>>
>>>
>>>
>>> --
>>>
>>>
>>> _______________________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Please keep messages on-topic and check the VTK FAQ at:
>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>
>>>
>>
>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20100517/4c3e3c27/attachment.htm>


More information about the vtkusers mailing list