vtk地层形成


 

 本来要做的是地层模型,没想到阴差阳错做了两个地层,如果继续把周围点连接成面会得到一个中空的地质体。果断放弃,另辟蹊径。

string Trim(string& str)
{
    //str.find_first_not_of(" \t\r\n"),在字符串str中从索引0开始,返回首次不匹配"\t\r\n"的位置
    str.erase(0, str.find_first_not_of(" \t\r\n"));
    str.erase(str.find_last_not_of(" \t\r\n") + 1);
    return str;
}
 
int main()
{
    vtkSmartPointer color = vtkSmartPointer::New();
    vtkSmartPointerup_line = vtkSmartPointer::New();
    vtkSmartPointer ps = vtkSmartPointer::New();
    vtkSmartPointer ps_1 = vtkSmartPointer::New();
    vtkSmartPointer ps_2 = vtkSmartPointer::New();

    int i_1 = 0;
    double x, y, z;
    ifstream fin("D:\\QTData\\Vtk-new\\ceshi2.csv"); //打开文件流操作-绝对路径
    string line;
    while (getline(fin, line))   //整行读取,换行符“\n”区分,遇到文件尾标志eof终止读取
    {
        //cout <<"原始字符串:"<< line << endl; //整行输出
        istringstream sin(line); //将整行字符串line读入到字符串流istringstream中
        vector fields; //声明一个字符串向量
        string field;
        while (getline(sin, field, ',')) //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符
        {
            fields.push_back(field); //将刚刚读取的字符串添加到向量fields中
        }

        string sx = Trim(fields[0]);
        string sy = Trim(fields[1]);
        string sz = Trim(fields[2]);

        //字符串转换成double型数字
        istringstream streamx, streamy, streamz;
        streamx.str(sx), streamy.str(sy), streamz.str(sz);
        streamx >> x, streamy >> y, streamz >> z;
        ps->InsertPoint(i_1,x, y, z); //新读取的数据赋予点的几何结构
        i_1++;
    }
    fin.close();  //关闭文件

    //获取第一层130个点
    for (int i = 0; i < 130; i++)
    {
        auto p = ps->GetPoint(i);
        //std::cout << "p[" << i << "] " << p[0] << " " << p[1] << " " << p[2] << std::endl;
        ps_1->InsertPoint(i, p);
    }
    
    //获取第二层130个点
    for (int i = 130; i < 260; i++)
    {
        auto p = ps->GetPoint(i);
        std::cout << "p[" << i << "] " << p[0] << " " << p[1] << " " << p[2] << std::endl;
        ps_2->InsertPoint(i, p);
    }

    vtkSmartPointer polyData_1 = vtkSmartPointer::New();
    polyData_1->SetPoints(ps_1);

    vtkSmartPointer polyData_2 = vtkSmartPointer::New();
    polyData_2->SetPoints(ps_2);

    //定义二维点剖分
	vtkSmartPointer delaunay2D_1 = vtkSmartPointer::New();
	delaunay2D_1->SetInputData(polyData_1);
    delaunay2D_1->Update();

    vtkSmartPointer delaunay2D_2 = vtkSmartPointer::New();
    delaunay2D_2->SetInputData(polyData_2);
    delaunay2D_2->Update();

    vtkSmartPointer append_delaunay2D_2 = vtkSmartPointer::New();
    append_delaunay2D_2->AddInputData(delaunay2D_1->GetOutput());
    append_delaunay2D_2->AddInputData(delaunay2D_2->GetOutput());
    //点过滤
    vtkSmartPointer vertexGlyphFilter_1 = vtkVertexGlyphFilter::New();
    vertexGlyphFilter_1->SetInputData(polyData_1);
    vertexGlyphFilter_1->Update();


    //纹理贴图
    std::string fileName = "D:\\QTData\\Vtk-new\\figure2.bmp";
    vtkSmartPointer bmpReader = vtkSmartPointer::New();
    bmpReader->SetFileName(fileName.c_str());

    vtkSmartPointer atext = vtkSmartPointer::New();
    atext->SetInputConnection(bmpReader->GetOutputPort());
    atext->InterpolateOn();

    // Visualize
    //第二层添加
    vtkSmartPointer append_ps_2 = vtkSmartPointer::New();
    append_ps_2->AddInputData(polyData_2);
    append_ps_2->AddInputData(vertexGlyphFilter_1->GetOutput());


    vtkSmartPointer mapper_1 = vtkSmartPointer::New();
    mapper_1->SetInputConnection(append_ps_2->GetOutputPort());

    vtkSmartPointer actor_1 = vtkSmartPointer::New();
    actor_1->SetMapper(mapper_1);
    actor_1->GetProperty()->SetPointSize(4);
    actor_1->GetProperty()->SetColor(0.0, 0.0, 0.0);


    //三角渲染 
    vtkPolyDataMapper* triangleMapper_1 = vtkPolyDataMapper::New();
    triangleMapper_1->SetInputConnection(append_delaunay2D_2->GetOutputPort());
    //triangleMapper->SetInputConnection(delaunay2D_2->GetOutputPort());
    triangleMapper_1->Update();
    vtkActor* triangleActor_1 = vtkActor::New();
    triangleActor_1->SetMapper(triangleMapper_1);


    vtkSmartPointer texturemap = vtkSmartPointer::New();
    texturemap->SetInputConnection(delaunay2D_1->GetOutputPort());
    
    vtkSmartPointer map = vtkSmartPointer::New();
    map->SetInputConnection(texturemap->GetOutputPort());
    vtkSmartPointer map_actor = vtkSmartPointer::New();
    map_actor->SetMapper(map);
    map_actor->SetTexture(atext);
    

    vtkSmartPointer renderer = vtkSmartPointer::New();
    renderer->AddActor(actor_1);
    renderer->AddActor(triangleActor_1);
    renderer->AddActor(map_actor);

    renderer->SetBackground(1.3, 1.6, 1.3); // Background color green

    vtkSmartPointer renderWindow = vtkSmartPointer::New();
    renderWindow->AddRenderer(renderer);


    vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;



}

相关