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

//创建圆柱

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

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

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


        //创建螺旋线

        vtkSmartPointer spSpiralLinePoints =vtkSmartPointer::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 spSpiralLine =vtkSmartPointer::New();
        spSpiralLine->GetPointIds()->SetNumberOfIds(nCountPoints);
        for (int nPointIndex = 0; nPointIndex < nCountPoints; ++nPointIndex)
        {
            spSpiralLine->GetPointIds()->SetId(nPointIndex, nPointIndex);
        }

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

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

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

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

你可能感兴趣的:(C++,VTK,c++)