Activiz 使用筆記-5 數據源(3)

這是根據c#

http://image.szpt.edu.cn/UploadFiles/%E6%95%B0%E6%8D%AE%E9%9B%86%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%B1%9E%E6%80%A7.swf
數據結構

上面的例子改編的,代碼所有改成用C# 實現。app

例子1:生成多邊形數據集
scala

說明:code

立方體有8個頂點,須要有8個頂點座標。component

立方體有6個面,須要六組點來表示。orm

點標量屬性數據是與點一 一對應的。因此其個數必須與點的個數相同。在程序中循環8次調用方法InsertValue()插入標量數據。該方法有兩個參數,第一個參數是對應點的ID,第二個參數是標量值。
索引

  public partial class Form1 : Form
    {
      //  private vtkRenderer _renderer = null;
        //private vtkRenderWindow _renwin = null;
        
        public Form1()
        {
            InitializeComponent();
        }

        private void renderWindowControl1_Load(object sender, EventArgs e)
        {
            vtkPolyData cube = new vtkPolyData();
            vtkPoints points = new vtkPoints();
            vtkCellArray polys = new vtkCellArray();
            vtkFloatArray scalars = new vtkFloatArray();

            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 = renderWindowControl1.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();
            
        }
    }


例子2:結構化點數據集的建立ci

說明:get

結構化點數據集根據其表示的數據的維數分別由線單元(1D)、像素單元(2D)或體素單元(3D)組成。並且這些單元的大小、形狀都是同樣的。因此數據集中的點是很是規則地排列在一塊兒,而且排列的方向是與全局x-y-z座標軸平行的。

正是因爲結構上的規則,定義一個結構化點數據集時,不須要定義全部的點和全部的單元,只須要知道一個起始點的座標以及沿三個座標軸方向上的相鄰點的距離(該距離也就是單元的邊的長度),就能夠算出全部點的座標。這兩個參數經過SetOrigin() 和SetSpacing()進行設置。對於單元,因爲已知單元的類型只屬於上面提到的三種中的一種,而且只有相鄰的點才能構成單元,因此知道知道每一個座標軸方向上有多少個點(nx,ny,nz)就能夠肯定全部的單元了。該參數稱爲尺寸,用方法SetDimensions()進行設置。

也是因爲結構上的規則,數據集中的點和單元能夠用一個i-j-k天然座標系來指定。數據集中共有nx*ny*nz個點,共有(nx-1)(ny-1)(nz-1)個單元。一個特定的點和單元能夠用三個索引i-j-k指定。相似的,一條線能夠用三個索引中的兩個指定,一個面能夠用一個索引指定。

代碼:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void renderWindowControl1_Load(object sender, EventArgs e)
        {
            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=renderWindowControl1.RenderWindow;
            vtkRenderer _render = _renwin.GetRenderers().GetFirstRenderer();

            _render.AddActor(actor);

            _renwin.Render();

            _render.ResetCamera();

        }
    }

效果圖:

結構化點數據集在拓撲和幾何上都是規則的,其幾何和拓撲都是隱式定義的,因此結構化點數據集很容易構造。建立該數據集的步驟能夠總結爲以下散步(假設 vtkStructurePoints的實例名爲vol):

一、使用操做vol.SetDimensions()定義數據集的拓撲。

二、使用操做vol.SetOrigin()和vol.SetSpacing()定義數據集的集幾何。

三、建立點屬性數據並與數據集關聯。

相關文章
相關標籤/搜索