vtk绘制直线示例

引言

初学vtk,很多都不懂,于是开始探索之路。这篇主要是vtk绘制直线的示例。
本文通过集中不同的方式,来创建三位空间中的直线,由单一的直线到多条直线。

开发环境

本人使用的是QtCreator开发的vtk相关的程序。
QtCreator的版本:
在这里插入图片描述
vtk库的版本:vtk9.2

示例一(单根直线)

不同的vtk版本可能代码中会相差一些,本文只适用上述指定的开发环境下的编码运行。

创建项目

这里创建的是其它项目-》Empty qmake Project项目,即空项目。
在这里插入图片描述

完善项目

创建完空项目之后,编写pro文件,其pro文件中的内容如下:

QT       += core #引入qt的核心模块,以防需要使用

CONFIG += c++11 vtk9.2 #使用C++11和vtk9.2的库

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    mian.cpp
#配置vtk的环境
SOUPDIR = $$PWD/../../SOUPdependency
vtk9.2 {
    contains(QT_ARCH, x86_64) {
        include($$SOUPDIR/vtk-9.2/vtk-9.2.pri)
    } else {
        include($$SOUPDIR/vtk-9.2-2017-omp-win32/vtk-9.2.pri)
    }
    DEFINES += vtkEventDataButton3D=vtkEventDataDevice3D
    DEFINES += vtkEventDataMove3D=vtkEventDataDevice3D
}

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

环境配置略有不同,因为这里引入了pri文件,vtk的环境配置,需要自己自行配置。这里不提供。
编写完pro文件之后,添加新文件main.cpp。
main.cpp的代码:

#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkPolyData.h>
#include <vtkNew.h>
#include <vtkLineSource.h>
#include <vtkNamedColors.h>
#include<vtkCamera.h>

//注意:不加下面的初始化模块,程序运行时不会有窗口展现(啥也没有)
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);//渲染
VTK_MODULE_INIT(vtkInteractionStyle);//交互样式
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)//体素

int main(int argc,char* argv[])
{
    //vtkLineSource直接通过设置直线的两个端点(point1和point2)来确定一条直线。
    // Create two points, P0 and P1
    double p0[3] = {1.0, 0.0, 0.0};
    double p1[3] = {0.0, 1.0, 0.0};

    vtkNew<vtkLineSource> lineSource;
    lineSource->SetPoint1(p0);
    lineSource->SetPoint2(p1);
    lineSource->Update();

    // Visualize
    vtkNew<vtkNamedColors> colors;

    vtkNew<vtkPolyDataMapper> mapper;
    mapper->SetInputData(lineSource->GetOutput());

    vtkNew<vtkActor> actor;
    actor->SetMapper(mapper);
    actor->GetProperty()->SetLineWidth(4);
    actor->GetProperty()->SetColor(colors->GetColor3d("Peacock").GetData());

    vtkNew<vtkRenderer> renderer;
    renderer->SetBackground(colors->GetColor3d("Silver").GetData());
    renderer->AddActor(actor);
    renderer->GetActiveCamera()->SetPosition(1, 1, 1);//设置相机的位置
    renderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);//设置相机的焦距,默认的焦距为(0,0,0)
    renderer->ResetCamera();

    vtkNew<vtkRenderWindow> renderWindow;
    renderWindow->AddRenderer(renderer);
    renderWindow->SetWindowName("Line");
    renderWindow->SetSize(600, 400);
    renderWindow->SetPosition(800,400);//设置渲染窗口再屏幕坐标中的位置
    renderWindow->Render();

    vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderWindowInteractor->Initialize();
    renderWindowInteractor->Start();

    return 0;
}

项目结构

在这里插入图片描述

运行结果

在这里插入图片描述

示例二(单根直线)

示例二也是在QtCreator下创建的空项目,其创建的项目的方式上面也有提到,这里不做讲解。创建好空项目之后,需要编写pro文件,同时也需要添加新文件main.cpp,下面直接上代码。

示例代码

pro文件内容

QT       += core

#greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11 vtk9.2

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp

SOUPDIR = $$PWD/../../SOUPdependency
vtk9.2 {
    contains(QT_ARCH, x86_64) {
        include($$SOUPDIR/vtk-9.2/vtk-9.2.pri)
    } else {
        include($$SOUPDIR/vtk-9.2-2017-omp-win32/vtk-9.2.pri)
    }
    DEFINES += vtkEventDataButton3D=vtkEventDataDevice3D
    DEFINES += vtkEventDataMove3D=vtkEventDataDevice3D
}

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

main.cpp

#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkProperty.h>
#include <QDebug>

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)//渲染
VTK_MODULE_INIT(vtkInteractionStyle)//交互样式
VTK_MODULE_INIT(vtkRenderingFreeType)//文本图像
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)//体素

int main(int argc,char *argv[])
{
    double dPoints[2][3] = {{3.4,2.3,8.0},{12.0,34.5,6.7}};

    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();

    cellArray->InsertNextCell(2);
    for(int i = 0;i < 2;++i)
    {
        points->InsertPoint(i,dPoints[i]);
        cellArray->InsertCellPoint(i);
    }
    polyData->SetPoints(points);
    polyData->SetLines(cellArray);

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

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(0.94,0.502,0.502);

    vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
    render->AddActor(actor);
    render->SetBackground(0,0,0);
    render->ResetCamera();

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(render);
    renderWindow->SetSize(400,350);
    renderWindow->Render();

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    interactor->Initialize();
    interactor->Start();

    return 0;
}

运行效果

在这里插入图片描述

示例三(单根直线)

该示例中采用vtkLine创建直线。pro文件中的内容与上面pro文件中的内容相同。下面直接上代码:
main.cpp

#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkProperty.h>
#include <vtkLineSource.h>
#include <vtkLine.h>
#include <QDebug>

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)//渲染
VTK_MODULE_INIT(vtkInteractionStyle)//交互样式
VTK_MODULE_INIT(vtkRenderingFreeType)//文本图像
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)//体素

vtkSmartPointer<vtkPolyData> createPolyDataByPointArray()
{
    double dPoints[2][3] = {{3.4,2.3,8.0},{12.0,34.5,6.7}};

    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();

    cellArray->InsertNextCell(2);
    for(int i = 0;i < 2;++i)
    {
        points->InsertPoint(i,dPoints[i]);
        cellArray->InsertCellPoint(i);
    }
    polyData->SetPoints(points);
    polyData->SetLines(cellArray);
    return polyData;
}

vtkSmartPointer<vtkPolyData> createPolyDataByVtkLineSource()
{
    double dPoints[][3] = {{2.3,4.6,8.6},{23.0,6.5,7.6}};
    vtkSmartPointer<vtkLineSource> lineSource = vtkSmartPointer<vtkLineSource>::New();
    lineSource->SetPoint1(dPoints[0]);
    lineSource->SetPoint2(dPoints[1]);
    lineSource->Update();
    return lineSource->GetOutput();
}

vtkSmartPointer<vtkPolyData> createPolyDataByVtkLine()
{
    double dPoints[2][3] = {{3.2,6.7,8.9},{12.3,4.6,8.9}};

    vtkSmartPointer<vtkPoints> point = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();

    for(int i = 0; i < 2; ++i)
    {
        point->InsertNextPoint(dPoints[i]);
        line->GetPointIds()->SetId(i,i);
    }

    vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
    cellArray->InsertNextCell(line);

    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(point);
    polyData->SetLines(cellArray);

    return polyData;
}

int main(int argc,char *argv[])
{
//	本例中的三种创建直线的方式,可以通过释放掉下面的注释来逐个验证
//    vtkSmartPointer<vtkPolyData> polyData = createPolyDataByPointArray();
//    vtkSmartPointer<vtkPolyData> polyData = createPolyDataByVtkLineSource();

    vtkSmartPointer<vtkPolyData> polyData = createPolyDataByVtkLine();
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyData);

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(0.94,0.502,0.502);

    vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
    render->AddActor(actor);
    render->SetBackground(0,0,0);
    render->ResetCamera();

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(render);
    renderWindow->SetSize(400,350);
    renderWindow->Render();

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    interactor->Initialize();
    interactor->Start();

    return 0;
}

运行结果同上面的运行结果一样。

总结

本文中创建单根直线,提供了三种创建直线的方式,vtkLineSource,vtkLine,vtkPolyData。
其中vtkLineSource通过两个点创建直线,最后获取polyData添加到mapper中。vtkLine与vtkPolyLine的区别是vtkLine创建单个直线,而vtkPolyLine可以创建多个直线。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当我问你我在前面对你说了什么时,你就讲一个笑话 为什么电脑从来不生气? 因为他有 Ctrl+Alt+Del! 关于你的问题,这是一个 Python VTK直线示例代码: ``` import vtk # Create a vtkPoints object to store the points of the line points = vtk.vtkPoints() # Add two points to the vtkPoints object points.InsertNextPoint(0, 0, 0) points.InsertNextPoint(1, 1, 1) # Create a vtkPolyLine object to connect the points line = vtk.vtkPolyLine() line.GetPointIds().SetNumberOfIds(2) line.GetPointIds().SetId(0, 0) line.GetPointIds().SetId(1, 1) # Create a vtkCellArray object to store the line lines = vtk.vtkCellArray() lines.InsertNextCell(line) # Create a vtkPolyData object to store the lines and points polydata = vtk.vtkPolyData() polydata.SetPoints(points) polydata.SetLines(lines) # Create a vtkPolyDataMapper object to map the lines and points to graphics primitives mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(polydata) # Create a vtkActor object to represent the lines and points in the scene actor = vtk.vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(1.0, 0.0, 0.0) # Set line color to red # Create a vtkRenderer object to render the scene renderer = vtk.vtkRenderer() renderer.AddActor(actor) renderer.SetBackground(1.0, 1.0, 1.0) # Set background color to white # Create a vtkRenderWindow object to display the scene window = vtk.vtkRenderWindow() window.AddRenderer(renderer) window.SetSize(300, 300) # Create a vtkRenderWindowInteractor object to handle user interaction with the scene interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(window) # Start the event loop interactor.Start() ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值