[vtkusers] Draw 2D Ellipse annotation/overlay over a 2D graphics object

NIPL msvinod+vtk at gmail.com
Fri Feb 27 01:30:36 EST 2009


Hi all,

Method 3 is working now. I changed SetPoint to InsertPoint .
ellipsePoints.InsertPoint(id, r1 * Math.Cos(angle) + CenterX, r2 *
Math.Sin(angle) + CenterY, 0);







NIPL wrote:
> 
> Hi all,
> I want to draw a 2D ellipse annotation over a DICOM image loaded in a 2D
> View.
> There is no builtin function/class for ellipse. But there is a
> vtkSphereSource and it is 3D. Can I derive a 2D ellipse from it by using
> vtkPolyDataMapper2D? I tried using the vtkPoints first and have some
> issues. I am using the vtkDotnet wrapper for c#.
> I have done like this:
> Method 1:
>                  vtk.vtkPoints ellipsePoints = new vtk.vtkPoints();
>                 double angle = 0;
>                 double r1, r2;
>                 int id = 0;
>                 int CenterX = 0, CenterY = 0;
>                 CenterX = 100; 
>                 CenterY = 100; 
>                 r1 = 40;
>                 r2 = 20;
>  
>                 while (angle <= 2F * Math.PI + (Math.PI / 30F))
>                 {
>            ellipsePoints.InsertPoint(id, r1 * Math.Cos(angle) + CenterX,
> r2 * Math.Sin(angle) + CenterY, 0);
>                     angle = angle + (Math.PI / 30F);
>                     id++;
>                 }
>                 vtk.vtkPolyLine ellipse = new vtk.vtkPolyLine();
>                 ellipse.GetPointIds().SetNumberOfIds(id);
>  
>                 for (int i = 0; i < id; i++)
>                 {
>                     ellipse.GetPointIds().SetId(i, i);
>  
>                 }
> 
>                 vtk.vtkUnstructuredGrid grid = new
> vtk.vtkUnstructuredGrid();
>                 grid.Allocate(1, 1);
>                 grid.InsertNextCell(ellipse.GetCellType(),
> ellipse.GetPointIds());
>                 grid.SetPoints(ellipsePoints);
>                 grid.Update();
> 
>                 vtk.vtkDataSetMapper m = new vtk.vtkDataSetMapper();
>                 m.SetInput(grid);
>                 m.SetColorModeToMapScalars();
> 
>                 vtk.vtkActor aSphere = new vtk.vtkActor();
>                 aSphere.SetMapper(m);
>                 aSphere.GetProperty().SetColor(0, 0, 1); // color blue
>                 aSphere.GetProperty().SetInterpolationToFlat();
>                 aSphere.VisibilityOn();
>                 // a renderer for the data
>                 //vtk.vtkRenderer ren1 = new vtk.vtkRenderer();
>                 irenderer.AddActor(aSphere);
>                  iwindow.Render();
> 
> But the ellipse is no visible while i draw.
> 
> Method 2:
>                 vtk.vtkSphereSource vtkEllipse = new
> vtk.vtkSphereSource();
>                 vtkEllipse.SetRadius(100);
>                 vtkEllipse.SetCenter(100, 100, 0);
>                 vtkEllipse.SetThetaResolution(360);
>                 vtkEllipse.SetPhiResolution(90);
>                 vtkEllipse.SetEndPhi(90);
>                 vtkEllipse.SetStartPhi(70);
>                 vtk.vtkTransformPolyDataFilter tf = new
> vtk.vtkTransformPolyDataFilter();
>                 vtk.vtkTransform tr = new vtk.vtkTransform();
>                 tr.Identity();
>                 tf.SetInput(vtkEllipse.GetOutput());
>                 tf.SetTransform(tr);
>                 tf.Update();
>                 vtk.vtkPolyDataMapper2D m = new vtk.vtkPolyDataMapper2D();
>                 vtk.vtkActor2D vtkActor = new vtk.vtkActor2D();
>                 m.SetInput(tf.GetOutput());
>                 vtkActor.SetMapper(m);
>                 vtkActor.VisibilityOn();
>                 vtkActor.GetProperty().SetColor(1, .5, 0);
>                 irenderer.AddViewProp(vtkActor);
>                 iwindow.Render();
> But this is not what i want. the line width is not correct.
> 
> Method 3:
>                 double angle = 0;
>                 double r1, r2;
>                 int id = 0;
>                 int CenterX , CenterY;
>                 CenterX = 100; 
>                 CenterY = 100; 
>                 r1 = 40;
>                 r2 = 20;
> 
>                 vtk.vtkPoints ellipsePoints = new vtk.vtkPoints();
>                 ellipsePoints.SetNumberOfPoints(31);
>                 while (angle <= 2F * Math.PI + (Math.PI / 30F))
>                 {
>                     ellipsePoints.SetPoint(id, r1 * Math.Cos(angle) +
> CenterX, r2 * Math.Sin(angle) + CenterY, 0);
>                     angle = angle + (Math.PI / 30F);
>                     id++;
>                 }
>                 //id = ellipsePoints.GetNumberOfPoints();
>                 vtk.vtkCellArray c_lines = new vtk.vtkCellArray();
>                 c_lines.Allocate(1, 1);
>                 c_lines.InsertNextCell(id);
>                 c_lines.SetNumberOfCells(id);
>                 for (int k = 0; k < id; ++k)
>                     c_lines.InsertCellPoint(k);
> 
>                 vtk.vtkPolyData c_polyData = new vtk.vtkPolyData();
>                 c_polyData.ReleaseDataFlagOn();
>                 c_polyData.Allocate(1, 1);
>                 c_polyData.SetPoints(ellipsePoints);
>                 c_polyData.SetLines(c_lines);
> 
>                 vtk.vtkPolyDataMapper2D c_polyDataMapper = new
> vtk.vtkPolyDataMapper2D();
>                 c_polyDataMapper.SetInput(c_polyData);
> 
>                 vtk.vtkActor2D c_actor = new vtk.vtkActor2D();
> 
>                 //c_actor.GetProperty().SetOpacity(.50);
>                 //c_actor.GetProperty().SetLineWidth(2.0f);
> 
>                 c_actor.SetMapper(c_polyDataMapper);
>                 c_actor.VisibilityOn();
>                 c_actor.GetProperty().SetColor(1, .5, 0);
>                 irenderer.AddViewProp(c_actor);
> 
>                 iwindow.Render();
>                 c_polyData.Dispose();
>                 c_lines.Dispose();
>                 ellipsePoints.Dispose();
> 
> This one is working fine. I can see the ellipse and it looks great. But
> when I draw a second ellipse on same image, it crashes. The constructor
> returns null pointer.
> 
> Is my logic correct or am I missing something? The Method 1 is not
> crashing but it is is not visible. Can anyone please help me fixing it?
> 
> Thanks in advance.
> 

-- 
View this message in context: http://www.nabble.com/Draw-2D-Ellipse-annotation-overlay-over-a-2D-graphics-object-tp22034221p22240274.html
Sent from the VTK - Users mailing list archive at Nabble.com.




More information about the vtkusers mailing list