private void Window_Activated(object sender, EventArgs e) { vtkPolyData cube = new vtkPolyData(); vtkPoints points = new vtkPoints(); vtkCellArray polys = new vtkCellArray(); vtkFloatArray scalars = new vtkFloatArray(); Kitware.VTK.RenderWindowControl vtkControl = new Kitware.VTK.RenderWindowControl(); vtkControl.AddTestActors = false; vtkControl.Location = new System.Drawing.Point(10, 10); vtkControl.Name = "_renwin"; vtkControl.Size = new System.Drawing.Size(100, 100); vtkControl.TabIndex = 0; vtkControl.TestText = null; vtkControl.Dock = System.Windows.Forms.DockStyle.Fill; vtkformhost.Child = vtkControl; vtkformhost.Visibility = System.Windows.Visibility.Visible; int i; float[][] x = new float[8][] { new float[] { 0, 0, 0 }, //第0个点的坐标 new float[] { 1, 0, 0 }, //第1个点的坐标 new float[] { 1, 1, 0 }, //第2个点的坐标 new float[] { 0, 1, 0 }, //3 new float[] { 0, 0, 1 }, //4 new float[] { 1, 0, 1 }, //5 new float[] { 1, 1, 1 }, //6 new float[] { 0, 1, 1 } //7 }; for (i = 0; i < 8; i++) { points.InsertPoint(i, x[i][0], x[i][1], x[i][2]); //加载点,创建数据结构的几何 } List <int[]> temp = new List <int[]>(); int[] temparray0 = new int[4] { 0, 1, 2, 3 }; //第0,1,2,3个点连接在一起,成为一个单元 int[] temparray1 = new int[4] { 4, 5, 6, 7 }; //第4,5,6,7个点连接在一起,成为一个单元 int[] temparray2 = new int[4] { 0, 1, 5, 4 }; int[] temparray3 = new int[4] { 1, 2, 6, 5 }; int[] temparray4 = new int[4] { 2, 3, 7, 6 }; int[] temparray5 = new int[4] { 3, 0, 4, 7 }; temp.Add(temparray0); temp.Add(temparray1); temp.Add(temparray2); temp.Add(temparray3); temp.Add(temparray4); temp.Add(temparray5); //因为在activiz中没有vtkIdType这个类,所以用了其他的方法代替C++代码中的实现。 for (int j = 0; j < temp.Count; j++) { IntPtr pP = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)) * 4); Marshal.Copy(temp[j], 0, pP, 4); polys.InsertNextCell(4, pP);//加载单元,定义数据集的拓扑 Marshal.FreeHGlobal(pP); } for (i = 0; i < 8; i++) { scalars.InsertTuple1(i, i); //为每一个点设置点属性。 } cube.SetPoints(points); cube.SetPolys(polys); cube.GetPointData().SetScalars(scalars); vtkPolyDataMapper cubemapper = new vtkPainterPolyDataMapper(); cubemapper.SetInput(cube); cubemapper.SetScalarRange(0, 7); vtkActor cubeactor = new vtkActor(); cubeactor.SetMapper(cubemapper); // Create components of the rendering subsystem // vtkRenderWindow _renwin = vtkControl.RenderWindow; vtkRenderer ren1 = _renwin.GetRenderers().GetFirstRenderer(); // Add the actors to the renderer, set the window size // ren1.AddViewProp(cubeactor); _renwin.SetSize(250, 250); _renwin.Render(); ren1.ResetCamera(); }
int build3DViewFull() { Kitware.VTK.RenderWindowControl rw = new Kitware.VTK.RenderWindowControl(); vtkRenderWindow _renwin = rw.RenderWindow; vtkRenderer _render = _renwin.GetRenderers().GetFirstRenderer(); _renwin.AddRenderer(_render); vtkRenderWindowInteractor iren = new vtkRenderWindowInteractor(); iren.SetRenderWindow(_renwin); // 新建文件读取对象,常见的有vtkBMPReader、vtkDICOMImageReader、vtkJPEGReader等 vtkJPEGReader jpegReader = new vtkJPEGReader(); // 不同的reader需要设置的参数是不同的 因此本例仅适合jpegreader jpegReader.SetFilePrefix("C:/Users/DawnWind/Desktop/000/"); // 要打开的路径 jpegReader.SetFilePattern("%s%d.jpg"); // 图片文件名格式,此处为 0.jpg 1.jpg ... jpegReader.SetDataByteOrderToLittleEndian(); jpegReader.SetDataSpacing(1, 1, 1.4); // 设置图片中像素比,我理解得不清楚,具体请百度之 jpegReader.SetFileNameSliceSpacing(1); jpegReader.SetDataExtent(0, 209, 0, 209, 0, 29); // 这里因为在000文件夹里面有0.jpg ~ 29.jpg,所以设置为 0,29 // 每张图片的长宽为210 * 210 因此设置为0,209 jpegReader.Update(); // update这里要注意一下,对于VTK在默认情况下是在最后操作时候才一次性刷新 // 也就是说如果没有自动刷新的话,在一些中间过程中是无法获得到数据的,因为没update进去 vtkContourFilter skinExtractor = new vtkContourFilter(); skinExtractor.SetInputConnection(jpegReader.GetOutputPort()); skinExtractor.SetValue(200, 100); //值越大,保留的部分越少。 //重新计算法向量 vtkPolyDataNormals skinNormals = new vtkPolyDataNormals(); skinNormals.SetInputConnection(skinExtractor.GetOutputPort()); skinNormals.SetFeatureAngle(60.0); //Specify the angle that defines a sharp edge. //If the difference in angle across neighboring polygons is greater than this value, //the shared edge is considered "sharp". //create triangle strips and/or poly-lines 为了更快的显示速度 vtkStripper skinStripper = new vtkStripper(); skinStripper.SetInputConnection(skinNormals.GetOutputPort()); vtkPolyDataMapper skinMapper = new vtkPainterPolyDataMapper(); skinMapper.SetInputConnection(skinStripper.GetOutputPort()); skinMapper.ScalarVisibilityOff(); //这样不会带颜色 vtkActor skin = new vtkActor(); skin.SetMapper(skinMapper); // An outline provides context around the data. // 一个围绕在物体的立体框,可以先忽略 /* * vtkOutlineFilter> outlineData = * vtkOutlineFilter>::New(); * outlineData.SetInputConnection(dicomReader.GetOutputPort()); * * vtkPolyDataMapper> mapOutline = * vtkPolyDataMapper>::New(); * mapOutline.SetInputConnection(outlineData.GetOutputPort()); * * vtkActor> outline = * vtkActor>::New(); * outline.SetMapper(mapOutline); * outline.GetProperty().SetColor(0,0,0); * * aRenderer.AddActor(outline); */ // It is convenient to create an initial view of the data. The FocalPoint // and Position form a vector direction. Later on (ResetCamera() method) // this vector is used to position the camera to look at the data in // this direction. vtkCamera aCamera = new vtkCamera(); aCamera.SetViewUp(0, 0, -1); aCamera.SetPosition(0, 1, 0); aCamera.SetFocalPoint(0, 0, 0); aCamera.ComputeViewPlaneNormal(); aCamera.Azimuth(30.0); aCamera.Elevation(30.0); // Actors are added to the renderer. An initial camera view is created. // The Dolly() method moves the camera towards the FocalPoint, // thereby enlarging the image. _render.AddActor(skin); _render.SetActiveCamera(aCamera); _render.ResetCamera(); aCamera.Dolly(1.5); // Set a background color for the renderer and set the size of the // render window (expressed in pixels). _render.SetBackground(.2, .3, .4); _renwin.SetSize(640, 480); // Note that when camera movement occurs (as it does in the Dolly() // method), the clipping planes often need adjusting. Clipping planes // consist of two planes: near and far along the view direction. The // near plane clips out objects in front of the plane; the far plane // clips out objects behind the plane. This way only what is drawn // between the planes is actually rendered. _render.ResetCameraClippingRange(); // Initialize the event loop and then start it. iren.Initialize(); iren.Start(); return(0); }
//private void InitializeVTK() //{ // Kitware.VTK.RenderWindowControl vtkControl = new Kitware.VTK.RenderWindowControl(); // vtkControl.AddTestActors = false; // vtkControl.Location = new System.Drawing.Point(10, 10); // vtkControl.Name = "_renwin"; // vtkControl.Size = new System.Drawing.Size(100, 100); // vtkControl.TabIndex = 0; // vtkControl.TestText = null; // vtkControl.Dock = System.Windows.Forms.DockStyle.Fill; // vtkformhost.Child = vtkControl; // vtkformhost.Visibility = System.Windows.Visibility.Visible; // vtkSphereSource sphere = vtkSphereSource.New(); // sphere.SetThetaResolution(8); // sphere.SetPhiResolution(16); // vtkShrinkPolyData shrink = vtkShrinkPolyData.New(); // shrink.SetInputConnection(sphere.GetOutputPort()); // shrink.SetShrinkFactor(0.9); // vtkPolyDataMapper mapper = vtkPolyDataMapper.New(); // mapper.SetInputConnection(shrink.GetOutputPort()); // // The actor links the data pipeline to the rendering subsystem // vtkActor actor = vtkActor.New(); // actor.SetMapper(mapper); // actor.GetProperty().SetColor(1, 0, 0); // // Create components of the rendering subsystem // // // Kitware.VTK.vtkRendererCollection rs = vtkControl.RenderWindow.GetRenderers(); // vtkRenderer ren1 = vtkControl.RenderWindow.GetRenderers().GetFirstRenderer(); // vtkRenderWindow renWin = vtkControl.RenderWindow; // // Add the actors to the renderer, set the window size // // // ren1.AddViewProp(actor); // renWin.SetSize(500, 500); // renWin.Render(); // vtkCamera camera = ren1.GetActiveCamera(); // camera.Zoom(1.5); //} private void InitializeVTK() { Kitware.VTK.RenderWindowControl rw = new Kitware.VTK.RenderWindowControl(); rw.AddTestActors = false; rw.Dock = System.Windows.Forms.DockStyle.Fill; vtkformhost.Child = rw; vtkformhost.Visibility = System.Windows.Visibility.Visible; Kitware.VTK.vtkRendererCollection rs = rw.RenderWindow.GetRenderers(); int rsc = rs.GetNumberOfItems(); Console.WriteLine(rsc + " renderers"); Kitware.VTK.vtkRenderer r = rs.GetFirstRenderer(); r.SetBackground(0.1, 0.3, 0.7); r.SetBackground2(0.7, 0.8, 1.0); r.SetGradientBackground(true); int i, j, k, kOffset, jOffset, offset; float s, sp, x, y, z; //创建结构化点数据集,(创建点和单元) vtkStructuredPoints vol = new vtkStructuredPoints(); vol.SetDimensions(26, 26, 26); //x,y,z三个坐标轴方向上各有26个点 vol.SetOrigin(-0.5, -0.5, -0.5); //设置数据集在坐标空间内的起点 sp = (float)(1.0 / 25.0); vol.SetSpacing(sp, sp, sp); //设置坐标轴上每个点的间距 //创建标量数据(作为结构化点数据集的属性数据) vtkFloatArray scalars = new vtkFloatArray(); scalars.SetNumberOfTuples(26 * 26 * 26);//设置标量个数,因为是点属性所以和点的个数相同 for (k = 0; k < 26; k++) { z = (float)(-0.5 + k * sp); kOffset = k * 26 * 26; for (j = 0; j < 26; j++) { y = (float)(-0.5 + j * sp); jOffset = j * 26; for (i = 0; i < 26; i++) { x = (float)(-0.5 + i * sp); s = (float)(x * x + y * y + z * z - (0.4 * 0.4)); //计算标量值,该方程为球体方程,位于球体上的点标量值为0 offset = i + jOffset + kOffset; //计算id scalars.InsertTuple1(offset, s); //插入标量值 } } } vol.GetPointData().SetScalars(scalars); //将标量值与点关联 //抽取标量值为0的点所形成的面 vtkContourFilter contour = new vtkContourFilter(); contour.SetInput(vol); contour.SetValue(0, 0); vtkPolyDataMapper volmapper = new vtkPainterPolyDataMapper(); volmapper.SetInput(contour.GetOutput()); vtkActor actor = new vtkActor(); actor.GetProperty().SetRepresentationToWireframe(); // actor.GetProperty().SetRepresentationToSurface(); // actor.GetProperty().SetRepresentationToPoints(); actor.GetProperty().SetColor(0, 0, 0); actor.SetMapper(volmapper); vtkRenderWindow _renwin = rw.RenderWindow; vtkRenderer _render = _renwin.GetRenderers().GetFirstRenderer(); _render.AddActor(actor); _renwin.Render(); _render.ResetCamera(); }