C++ VTK 8.2 如何绘制弹簧图形

2023-11-07

//创建圆柱

        vtkSmartPointer<vtkCylinderSource> spCylinderSource = vtkSmartPointer<vtkCylinderSource>::New();
        spCylinderSource->SetHeight(m_dCylinderHeight);    // 设置圆柱的高度
        spCylinderSource->SetRadius(m_dCylinderRadius);    // 设置圆柱的半径
        spCylinderSource->SetResolution(50); // 设置圆柱的分辨率(面的数量)
        spCylinderSource->SetCenter(m_dCylinderCenter);
        //做旋转90°
        vtkSmartPointer<vtkTransform> spTransform = vtkSmartPointer<vtkTransform>::New();
        spTransform->RotateX(90);

        // 应用变换到圆柱几何数据
        vtkSmartPointer<vtkTransformPolyDataFilter> spTransformFilter = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
        spTransformFilter->SetTransform(spTransform);
        spTransformFilter->SetInputConnection(spCylinderSource->GetOutputPort());
        spTransformFilter->Update();

        // 创建映射器和显示节点
        vtkSmartPointer<vtkPolyDataMapper> spCylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
        spCylinderMapper->SetInputConnection(spTransformFilter->GetOutputPort());
        m_spCylinderActor = vtkSmartPointer<vtkActor>::New();
        m_spCylinderActor->SetMapper(spCylinderMapper);


        //创建螺旋线

        vtkSmartPointer<vtkPoints> spSpiralLinePoints =vtkSmartPointer<vtkPoints>::New();
        int nCountPoints = 5000;  //值设置大一下比较圆滑
        double dRadius = m_dCylinderRadius+0.1;
        double dHeight = m_dCylinderHeight;
        for (int nPoint = 0; nPoint < nCountPoints; ++nPoint)
        {
            double dAngle = (m_dCylinderHeight*5) * vtkMath::Pi() * nPoint / nCountPoints;  //高度的3倍,螺旋线的圈数
            double dX = dRadius * cos(dAngle);    //x轴的位置
            double dY = dRadius * sin(dAngle);
            double dZ = dHeight * nPoint / nCountPoints;
            spSpiralLinePoints->InsertNextPoint(dX, dY, dZ);   //螺旋上的点
        }

        // 点创建不封闭线
        vtkSmartPointer<vtkPolyLine> spSpiralLine =vtkSmartPointer<vtkPolyLine>::New();
        spSpiralLine->GetPointIds()->SetNumberOfIds(nCountPoints);
        for (int nPointIndex = 0; nPointIndex < nCountPoints; ++nPointIndex)
        {
            spSpiralLine->GetPointIds()->SetId(nPointIndex, nPointIndex);
        }

        // 给线段构造单元格
        vtkSmartPointer<vtkCellArray> spSpiralLineCells =vtkSmartPointer<vtkCellArray>::New();
        spSpiralLineCells->InsertNextCell(spSpiralLine);

        // 构造line的参数
        vtkSmartPointer<vtkPolyData> spSpiralLinePolyData = vtkSmartPointer<vtkPolyData>::New();
        spSpiralLinePolyData->SetPoints(spSpiralLinePoints);
        spSpiralLinePolyData->SetLines(spSpiralLineCells);

        // 设置弹簧的大小
        vtkSmartPointer<vtkTubeFilter> spSpiralLineTubeFilter =vtkSmartPointer<vtkTubeFilter>::New();
        spSpiralLineTubeFilter->SetInputData(spSpiralLinePolyData);
        spSpiralLineTubeFilter->SetRadius(0.04);            //弹簧半径的大小
        spSpiralLineTubeFilter->SetNumberOfSides(50);     
        spSpiralLineTubeFilter->Update();

        //创建映射
        vtkSmartPointer<vtkPolyDataMapper> spSpiralLineMapper =vtkSmartPointer<vtkPolyDataMapper>::New();
        spSpiralLineMapper->SetInputConnection(spSpiralLineTubeFilter->GetOutputPort());
        m_spSpiralLineActor =vtkSmartPointer<vtkActor>::New();
        m_spSpiralLineActor->SetMapper(spSpiralLineMapper);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ VTK 8.2 如何绘制弹簧图形 的相关文章