[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