1. 程式人生 > 其它 >2021-1-4 activiz建立顏色相間的格子(cellArray的使用-線)

2021-1-4 activiz建立顏色相間的格子(cellArray的使用-線)

技術標籤:activizc#vtk

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();

效果如圖:
在這裡插入圖片描述