[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