记录使用VTK画3D图,数据为3维离散点,通过Z轴高度体现3D图高度差

1、导入.NET VTK库

2、导入离散点并创建vtkAvtor

归一化处理:

 //数据归一化处理,将高度差距放大一百倍
            foreach (var item in points)
            {
                var z = (item.Z - zMin) / (zMax - zMin) * 100;
                pointsTemp.Add(new Point3D(item.X, item.Y, 0));
                pointsTemp.Add(new Point3D(item.X, item.Y, z));
            }

注意:传入的    List<Point3D> Points 已经做过归一化处理

  private vtkActor CreateLineAvtor(List<Point3D> Points)
        {
            try
            {
                float zMax = (float)Points.Select(x => x.Z).Max();
                float zMin = (float)Points.Select(x => x.Z).Min();
                //几何数据可视化表达容器
                var pointsActor = new vtkActor();
                // 创建一个点集
                vtkPoints vtkpoint = vtkPoints.New();
                创建一个拓扑数据对象
                var cellpoint = vtkCellArray.New();
                //用于存放Z轴高度,后续用于颜色映射
                vtkFloatArray scal = new vtkFloatArray();
                //添加3D点集
                for (int i = 0; i < Points.Count; i++)
                {
                    vtkpoint.InsertPoint(i, Points[i].X, Points[i].Y, Points[i].Z);
                    scal.InsertNextTuple1(Points[i].Z);
                }
                // 添加拓扑信息
                for (int i = 0; i < Points.Count / 2; i++)
                {
                    vtkIdList vtkIdList = vtkIdList.New();
                    vtkIdList.InsertNextId(2 * i);
                    vtkIdList.InsertNextId(2 * i + 1);
                    cellpoint.InsertNextCell(vtkIdList);
                }
                //多边形几何数据
                vtkPolyData polyData = vtkPolyData.New();
                //设置点集信息

                polyData.SetPoints(vtkpoint);
                //画线段
                polyData.SetLines(cellpoint);
                //将高度属性映射为颜色
                polyData.GetPointData().SetScalars(scal);
                //渲染多边形几何数据
                var mapper = vtkPolyDataMapper.New();
                mapper.SetInput(polyData);
                mapper.SetScalarRange(zMin, zMax);
                pointsActor.SetMapper(mapper);
                vtkpoint?.Dispose();
                cellpoint?.Dispose();
                scal?.Dispose();
                return pointsActor;
            }
            catch (Exception ex)
            {

                throw new Exception(ex.Message);
            }

        }

 // 三维点
    public class Point3D
    {
        public double X { get; set; }
        public double Y { get; set; }
        public double Z { get; set; }
        public Point3D()
        {

        }
        public Point3D(double x, double y, double z)
        {
            X = x;
            Y = y;
            Z = z;
        }
    }

3、开始渲染

               var lineActor = CreateLineAvtor(Points);

            //新建一个渲染场景,负责管理场景的渲染过程
            var renderer = renderwindowcontrol1.RenderWindow.GetRenderers().GetFirstRenderer();

            interactor = vtkRenderWindowInteractor.New();

            interactor.SetRenderWindow(renderWindow);
            //注册鼠标移动事件
            interactor.MouseMoveEvt += Renderer_MouseMoveEvt;

            //存放渲染场景中的可视化数据、属性等
            vtkCamera camera = new vtkCamera();
            //设置相机位置
            camera.SetPosition(150, 150, 800);
            //设置相机焦点
            camera.SetFocalPoint(150, 150, 50);
            //设置相机视角
            camera.SetViewUp(0, 1, 0);

            renderer.SetActiveCamera(camera);

            renderer.ResetCamera();
            //开始渲染
            renderer.AddActor(lineActor);

4、注册鼠标回调事件

 /// <summary>
        /// 注册鼠标移动事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <exception cref="Exception"></exception>
        private void Renderer_MouseMoveEvt(vtkObject sender, vtkObjectEventArgs e)
        {
            try
            {
                if (interactor == null)
                {
                    interactor = vtkRenderWindowInteractor.SafeDownCast(sender);
                }
                if (interactor != null)
                {
                    //得到了鼠标在窗体内的相对于屏幕像素的坐标值
                    int[] screenPos = interactor.GetEventPosition();
                    // 获取鼠标点击位置的物体坐标
                    interactor.GetPicker().Pick(screenPos[0], screenPos[1], 0, this.renderer);
                    double[] viewPos = new double[3];
                    //用Picker得到世界坐标系
                    viewPos = interactor.GetPicker().GetPickPosition();
                    var rawHeight = ParseToRawHeight(viewPos[2]);
                    ShowCoordInfo(viewPos[0], viewPos[1], rawHeight);
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

        }

 /// <summary>
        /// 将数据归一化后的高度转换为原始基恩士高度
        /// </summary>
        /// <param name="height"></param>
        /// <returns></returns>
        private double ParseToRawHeight(double height)
        {
            double rawHeight = 0f;
            rawHeight = (height / 100) * (RawMaxHeight - RawMinHeight) + RawMinHeight;
            return rawHeight;
        }

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
31套vtk3d像体绘制/vtk光线投射法/vtk重建程序源码是一套用于可视化和处理三数据的工具集。其中包括了vtk库中的一些功能和算法。 vtk3d像体绘制是指利用vtk库中的相关函数来创建和绘制三数据像。vtk库提供了一系列绘制基本形的函数,并可以通过组合这些基本形来创建并显示三数据。利用vtk3d像体绘制,我们可以将三数据以一种生动直观的方式呈现出来。 vtk光线投射法是指利用光线投射算法对三数据进行可视化和模拟。该算法通过投射一束光线到三像中,并根据光线与不同物体的相交情况来计算光线在像中的传播和衰减。通过vtk提供的光线投射函数,我们可以将计算得到的光线在三像上进行显示,从而达到模拟真实光线传输的效果。 vtk重建程序源码通过利用vtk库中的三重建函数,实现对二数据进行三重建的功能。该算法通过对多个二像进行处理和比对,来推测出像所代表物体的三形状。vtk提供了一系列三重建函数和算法,可以根据不同的需求选择适用的方法。利用vtk重建程序源码,我们可以将多个二数据转化为一个三模型,并进行后续的可视化和分析。 总的来说,这套31套vtk3d像体绘制/vtk光线投射法/vtk重建程序源码是一个功能强大的工具集,可以帮助我们处理和可视化数据,并进行相应的模拟和分析。无论是在科学研究、医学影像还是工程设计等领域,这套工具都具有广泛的应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值