VTK vtkLookupTable vtkScalarBarActor 颜色条

前言:

   有时需要给数据做一个   vtkScalarBarActor, 我们把显示的数据的一个 坐标系 来显示 颜色条

背景渐变 1---0

 

vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	renderer->GradientBackgroundOn();
	renderer->SetBackground(1, 1, 1);
	renderer->SetBackground2(0, 0, 0);
 

1.以 Z 显示颜色 效果如下

2. 这里我是因为加载了点云数据:

vtkLookupTable

    //建立lookupTable
    lut = vtkSmartPointer< vtkLookupTable >::New();
    //设置颜色映射的数目
    lut->SetNumberOfTableValues(10);
    lut->SetHueRange(0.67, 0.0);        //色调范围从红色到蓝色
    //设置颜色映射的范围
    lut->SetTableRange(p_min.z,p_max.z);
    lut->Build();
    /

 创建数据

  //可以根据颜色标量值在scalarBar中建立一个颜色查找表
     pcl::getMinMax3D(cloud, p_min, p_max);
     double distance  = abs(p_min.z - p_max.z);
     std::cout << "distance : " << distance << "  " << "min.x"<<p_min.z<<" "<<"max.z"<<p_max.z<< std::endl;



    vtkSmartPointer<vtkPoints>points = vtkSmartPointer<vtkPoints>::New();//点数据
    vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();//单元数据 顶点类型
    //存储标量值
    vtkFloatArray* scalars = vtkFloatArray::New();

    vtkUnsignedCharArray *cellData = vtkUnsignedCharArray::New();
    cellData->SetNumberOfComponents(3);
            double rgb[3];
            float ucrgb[3];
    int count = cloud.points.size();
    std::cout << "old point s count : " << count << "  " << std::endl;
    for (int i = 0; i < count; i++)
    {
        //定义存储顶点索引的中间变量,类似Int、long类型
        vtkIdType pointId[1];
        //将每个点的坐标加入vtkPoints,InsertNextPoint()返回加入点的索引号
        pointId[0] = points->InsertNextPoint(cloud.points[i].x, cloud.points[i].y, cloud.points[i].z);
        //为每个坐标点分别创建一个顶点,顶点是单元类型里面的一种

        double zDistance = cloud.points[i].z-p_min.z;
        lut->GetColor(static_cast<double>(zDistance), rgb);

          //convert the d value to rgb value
         for (size_t j = 0; j < 3; j++)
         {
              ucrgb[j] = static_cast<unsigned char>(rgb[j] * 255);

         }
         vertices->InsertNextCell(1, pointId);
         scalars->InsertTuple1(i, cloud.points[i].z);
    }


    //指定数据的几何结构(由points指定)和拓扑结构(由vertices指定)
    polyData->SetPoints(points);
    polyData->SetVerts(vertices);
   //设定每个顶点的标量值
    polyData->GetPointData()->SetScalars(scalars);
 

    pointsMapper->SetScalarRange(scalars->GetRange());
    pointsMapper->SetLookupTable(lut);

    pointsMapper->SetInputData(polyData);
    pointsMapper->Update();
    mCloudActor->SetMapper(pointsMapper);
    mCloudActor->GetProperty()->SetPointSize(1);//设置点的大小

如果是 STL

// read data
vtkSmartPointer<vtkSTLReader> source = vtkSmartPointer<vtkSTLReader>::New();
	source->SetFileName("TEST.stl");
	source->Update();
 
	int numPts = source->GetOutput()->GetPoints()->GetNumberOfPoints();					
	vtkSmartPointer<vtkFloatArray> scalars = vtkSmartPointer<vtkFloatArray>::New();		
	scalars->SetNumberOfValues(numPts);
	for (int i = 0; i < numPts; ++i)		 
		scalars->SetValue(i, i);//这个地方点和标量产生联系(第一个参数是第几个点;第二个参数就是设定的标量值)现在就假设第i个点颜色就是i
 
	vtkSmartPointer<vtkPolyData> poly = vtkSmartPointer<vtkPolyData>::New();
	poly->DeepCopy(source->GetOutput());
	poly->GetPointData()->SetScalars(scalars);
 
	// 创建颜色查找表
	vtkSmartPointer<vtkLookupTable> hueLut = vtkSmartPointer<vtkLookupTable>::New();
	hueLut->SetNumberOfColors(numPts);		// 指定颜色查找表中有多少种颜色
	hueLut->SetHueRange(0.6667, 0.0);	//蓝到红渐变
	hueLut->Build();

添加

vtkScalarBarActor

    /********************************************************************************************/
        //标注类测试
 

    vtkSmartPointer<vtkScalarBarActor > scalarBarActor = vtkSmartPointer< vtkScalarBarActor >::New();
    //scalarBarActor->SetOrientationToHorizontal();
    scalarBarActor->SetTitle("Z(mm)");
    scalarBarActor->SetNumberOfLabels(10);
    scalarBarActor->SetLookupTable(lut);
 
  
    //自己设定色带的位置
     scalarBarActor->GetPositionCoordinate()->SetCoordinateSystemToNormalizedViewport();
     scalarBarActor->GetPositionCoordinate()->SetValue(0.01, 0.01);//参数越小越靠左,第二个参数越大越往上
     scalarBarActor->SetWidth(0.1);
     scalarBarActor->SetHeight(0.8);
     // scalarBar->SetTextPositionToPrecedeScalarBar();//标题和刻度标记是否应在标量栏之前(文字会出现在条形左边)
     //设置标题和条形之间的边距
     scalarBarActor->SetVerticalTitleSeparation(10);
     //设置标题颜色
     scalarBarActor->GetTitleTextProperty()->SetColor(0.0, 0.0, 0.0);

    mRenderer->AddActor2D(scalarBarActor);
    //viewer->resetCamera();

    mRenderer->ResetCamera();
    mRenderer->ResetCameraClippingRange();

    mRenderer->Render();
    ui->qvtkWidget->update();

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值