[vtkusers] vtkContourWidget

Nicolas Sarrasin nsarrasin at phenix-systems.com
Fri May 14 04:55:24 EDT 2010


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 <mailto: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
>>     <mailto: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 <http://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/20100514/093be175/attachment.htm>


More information about the vtkusers mailing list