2021-1-4 activiz建立顏色相間的格子(cellArray的使用-線)
阿新 • • 發佈:2021-01-05
vtkPolyData的一種建立方式,vtkcellArray的使用:以點建立線。
List<int[]> pts2 = new List<int[]>();
...
vtkCellArray lines = new vtkCellArray();
lines.InsertNextCell(2); //2為線,4為面。
for (int j = 0; j < 2; j++)
{
lines.InsertCellPoint(pts2[i][j]);
}
vtkFloatArray和vtkLookupTable建立物體顏色對映,vtkLookupTable為顏色參照表格。
vtkFloatArray scalars = new vtkFloatArray();
...
scalars.InsertTuple1(i, 0); //i為物體數值,0為對應的顏色數值
...
vtkLookupTable pColorTable = vtkLookupTable.New();
pColorTable.SetNumberOfColors(2);//顏色個數為2
pColorTable.SetTableValue(0, 1.0, 0.0, 0.0, 1.0);//定義顏色數值0對應的顏色
pColorTable.SetTableValue(1, 1.0, 1.0, 1.0, 1.0);//定義顏色數值1對應的顏色
pColorTable. Build();
...
cube.SetPoints(points); //polydata中加入vtk點
cube.SetLines(lines); //polydata中加入vtk線
cube.GetCellData().SetScalars(scalars); //對polydata中的cell資料設定對應顏色標量
...
cubeMapper.SetInput(cube);
cubeMapper.SetScalarRange(0, 1); //對mapper設定顏色標量的變化範圍
cubeMapper.SetLookupTable(pColorTable);//對mapper設定顏色對映表
完整程式碼如下:
double l = 1.0; //應該有10*l個格子
double d = 0.05; //每個格子相距5cm
List<double[]> xx = new List<double[]>();
List<int[]> pts2 = new List<int[]>();
for (int i = 0; i <= l / (2 * d); i++)//每個格子相距5cm 所以得出10這個數
{
//從左下開始逆時針
xx.Add(new double[] { -d - i * d, -d - i * d, 0 });
xx.Add(new double[] { d + i * d, -d - i * d, 0 });
xx.Add(new double[] { d + i * d, d + i * d, 0 });
xx.Add(new double[] { -d - i * d, d + i * d, 0 });
pts2.Add(new int[] { 0 + 4 * i, 4 * i + 1 });
pts2.Add(new int[] { 1 + 4 * i, 4 * i + 2 });
pts2.Add(new int[] { 2 + 4 * i, 4 * i + 3 });
pts2.Add(new int[] { 3 + 4 * i, 4 * i + 0 });
}
int[][] pts = new int[][] { new int[] { 0, 1 }, new int[] { 1, 2 }, new int[] { 2, 3 }, new int[] { 3, 0 } };
vtkPolyData cube = new vtkPolyData();
vtkCellArray lines = new vtkCellArray();
vtkFloatArray scalars = new vtkFloatArray();
vtkPoints points = new vtkPoints();
for (int i = 0; i < xx.Count(); i++)
{
points.InsertPoint(i, xx[i][0], xx[i][1], xx[i][2]);
}
for (int i = 0; i < xx.Count(); i++)
{
lines.InsertNextCell(2);
for (int j = 0; j < 2; j++)
{
lines.InsertCellPoint(pts2[i][j]);
}
//判斷奇偶數決定顏色
if ((i / 4) % 2 == 0)
{
scalars.InsertTuple1(i, 0);
}
else
{
scalars.InsertTuple1(i, 1);
}
}
vtkLookupTable pColorTable = vtkLookupTable.New();
pColorTable.SetNumberOfColors(2);
pColorTable.SetTableValue(0, 1.0, 0.0, 0.0, 1.0);
pColorTable.SetTableValue(1, 1.0, 1.0, 1.0, 1.0);
//上面是顏色手動定義2種,下面是自己定義生成的,使用一種就可以
//pColorTable.SetNumberOfColors(256);
//pColorTable.SetHueRange(1.0, 0.0);
pColorTable.Build();
cube.SetPoints(points);
cube.SetLines(lines);
cube.GetCellData().SetScalars(scalars);
vtkPolyDataMapper cubeMapper = vtkPolyDataMapper.New();
cubeMapper.SetInput(cube);
cubeMapper.SetScalarRange(0, 1);
cubeMapper.SetLookupTable(pColorTable);
vtkActor cubeActor = new vtkActor();
cubeActor.SetMapper(cubeMapper);
cubeActor.GetProperty().SetLineWidth(3); //設定線寬
vtkRenderer renderer = vtkRenderer.New();
renderer.AddActor(cubeActor);
vtkCamera camera = new vtkCamera();
camera.SetPosition(1, 1, 1);
camera.SetFocalPoint(0, 0, 0);
vtkRenderWindow renwin = renderWindowControl1.RenderWindow;
renwin.AddRenderer(renderer);
renwin.Render();
效果如圖: