VTK使用vtkPlaneSource创建棋盘格并显示

最近做实验需要用到虚拟棋盘格,尝试了很多方法,比如用vtkImageCanvasSource2D绘制,但放大容易失真,图片的话进行spacing设置,用起来比较繁琐。vtkPlaneSource做这种网格色块更简单,只需要设置polydata的颜色即可。关键部分的代码如下,可以根据需要设置rlt和sqrLen:

int rlt = 10; // x,y方向上的方格数量
int sqrLen = 10; // 方格的边长

this->CreateSphere(0, 0, 0);
this->CreateSphere(rlt*sqrLen, rlt*sqrLen, 0);

vtkSmartPointer<vtkPlaneSource> planeSource = vtkSmartPointer<vtkPlaneSource>::New();
planeSource->SetCenter(0.0, 0.0, 0.0);
planeSource->SetOrigin(0, 0, 0);
planeSource->SetPoint1(rlt*sqrLen, 0, 0);
planeSource->SetPoint2(0, rlt*sqrLen, 0);
planeSource->SetResolution(rlt, rlt);
planeSource->Update();

vtkSmartPointer<vtkPolyData> grid = planeSource->GetOutput();

vtkSmartPointer<vtkUnsignedCharArray> cellColor = vtkSmartPointer<vtkUnsignedCharArray>::New();
cellColor->SetNumberOfComponents(3);

unsigned char cBlack[3] = { 0, 0, 0 };
unsigned char cWhite[3] = { 255, 255, 255 };
unsigned char *currentColor = cWhite;
for (quint32 i = 0; i < grid->GetNumberOfCells(); i++)
{
	if (i < rlt || i > rlt * (rlt - 1) || i % rlt == (rlt-1) || i % rlt == 0) // 周边绘制白色
	{
		currentColor = cWhite;
	}
	else
	{
		// 交错绘制黑白方格
		if ((int)(i / rlt) % 2 == 0) // 偶数行
		{
			(i % rlt % 2 == 0) ? (currentColor = cWhite) : (currentColor = cBlack);
		}
		else // 奇数行
		{
			(i % rlt % 2 == 0) ? (currentColor = cBlack) : (currentColor = cWhite);
		}
	}
	cellColor->InsertNextTypedTuple(currentColor);
}

grid->GetCellData()->SetScalars(cellColor);

vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(planeSource->GetOutput());

vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);

可以直接编译运行的代码见Github。

效果图:

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值