[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