【可视化】地质油藏可视化之二-使用vtkjs可视化数据

摘要:
˂!
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="http://t.zoukankan.com/vtk.js"></script>
    <script type="text/javascript" src="http://t.zoukankan.com/libs/jquery-3.4.1.min.js"></script>
    <title>ZMap</title>
    <style>
    </style>
</head>

<body>
    <div class="content"></div>
    <script>
        var dataUrl = 'data/elevation/base_zmap_convert.csv';
        var imgUrl = 'data/elevation/dem.jpg';

        //----------------------------------------------------------------------------
        //Standard rendering code setup
        //----------------------------------------------------------------------------
const fullScreenRenderer =vtk.Rendering.Misc.vtkFullScreenRenderWindow.newInstance({
            background: [0, 0, 0],
        });
        const renderer =fullScreenRenderer.getRenderer();
        const renderWindow =fullScreenRenderer.getRenderWindow();

        //----------------------------------------------------------------------------
        //Example code
        //----------------------------------------------------------------------------
        var model ={
            origin: [0, 0, 0],
            xSpacing: 0.01568,
            ySpacing: 0.01568,
            zScaling: 0.08888,
            xDirection: 1,
            yDirection: -1,
            requestCount: 0,
        }


        $.ajax({
                //后端程序的url地址
url: dataUrl,
                //也可以使用method,提交数据的方式,默认是'GET',常用的还有'POST'
                type: 'get',
                //dataType: 'json',  // 返回的数据格式,常用的有是'json','html',"jsonp"
                data: { //设置发送给服务器的数据,如果是get请求,也可以写在url地址的?后面
                    "id": '100001'}
            })
            .done(function (resp) { //请求成功以后的操作
console.log(resp);
                model.csv =resp;
                model.elevation =[];

                //Parse data
                const lines = model.csv.split('
');
                lines.forEach((line, lineIdx) =>{
                    model.elevation.push(line.split(',').map((str) =>Number(str)));
                });

                const polydata =vtk.Common.DataModel.vtkPolyData.newInstance();
                polydata.getPoints().setData(new Float32Array(0, 0, 0, 1, 1, 1), 3);

                if(model.elevation) {
                    const jSize =model.elevation.length;
                    const iSize = model.elevation[0].length;

                    //Handle points and polys
                    const points =polydata.getPoints();
                    points.setNumberOfPoints(iSize * jSize, 3);
                    const pointValues =points.getData();

                    const polys =vtk.Common.Core.vtkCellArray.newInstance({
                        size: 5 * (iSize - 1) * (jSize - 1),
                    });
                    polydata.setPolys(polys);
                    const polysValues =polys.getData();
                    let cellOffset = 0;

                    //Texture coords
                    const tcData = new Float32Array(iSize * jSize * 2);
                    const tcoords =vtk.Common.Core.vtkDataArray.newInstance({
                        numberOfComponents: 2,
                        values: tcData,
                        name: 'TextureCoordinates',
                    });
                    polydata.getPointData().setTCoords(tcoords);

                    for (let j = 0; j < jSize; j++) {
                        for (let i = 0; i < iSize; i++) {
                            const offsetIdx = j * iSize +i;
                            const offsetPt = 3 *offsetIdx;

                            //Fill points coordinates
                            pointValues[offsetPt + 0] =model.origin[0] + i * model.xSpacing *model.xDirection;
                            pointValues[offsetPt + 1] =model.origin[1] + j * model.ySpacing *model.yDirection;
                            pointValues[offsetPt + 2] =model.origin[2] + model.elevation[j][i] *model.zScaling;

                            //fill in tcoords
                            tcData[offsetIdx * 2] = i / (iSize - 1.0);
                            tcData[offsetIdx * 2 + 1] = 1.0 - j / (jSize - 1.0);

                            //Fill polys
                            if (i > 0 && j > 0) {
                                polysValues[cellOffset++] = 4;
                                polysValues[cellOffset++] =offsetIdx;
                                polysValues[cellOffset++] = offsetIdx - 1;
                                polysValues[cellOffset++] = offsetIdx - 1 -iSize;
                                polysValues[cellOffset++] = offsetIdx -iSize;
                            }
                        }
                    }
                }

                const mapper =vtk.Rendering.Core.vtkMapper.newInstance();
                const actor =vtk.Rendering.Core.vtkActor.newInstance();

                mapper.setInputData(polydata);
                actor.setMapper(mapper);

                renderer.addActor(actor);
                renderer.resetCamera();
                renderWindow.render();
            })
            .fail(function (error) { //请求失败以后的操作
console.log(error);
            });
    </script>
    <script>const head = document.querySelector('head');

        if(head) {
            [16, 32, 96, 160, 196].forEach((resolution) =>{
                const link = document.createElement('link');
                link.setAttribute('rel', 'icon');
                link.setAttribute(
                    'href',
                    `favicon-${resolution}x${resolution}.png`
                );
                link.setAttribute('sizes', `${resolution}x${resolution}`);
                link.setAttribute('type', 'image/png');
                head.appendChild(link);
            });
        }
    </script>
</body>

</html>

阶段成果:

【可视化】地质油藏可视化之二-使用vtkjs可视化数据第1张

【可视化】地质油藏可视化之二-使用vtkjs可视化数据第2张

研究目标:

【可视化】地质油藏可视化之二-使用vtkjs可视化数据第3张

【可视化】地质油藏可视化之二-使用vtkjs可视化数据第4张

免责声明:文章转载自《【可视化】地质油藏可视化之二-使用vtkjs可视化数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一文学会conda基本使用java使用freemarker模板导出word(带有合并单元格)文档下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

AntDesignVue中关于Table组件的使用

1. 如何自定义表格列头: <a-table :columns="columns":dataSource="dataSource"> <span slot="customTitle"><a-icon type="smile-o"/>Name</span> </a-tabl...

Puppeteer之爬虫入门

译者按: 本文通过简单的例子介绍如何使用Puppeteer来爬取网页数据,特别是用谷歌开发者工具获取元素选择器值得学习。 原文: A Guide to Automating & Scraping the Web with JavaScript (Chrome + Puppeteer + Node JS) 译者: Fundebug 为了保证可...

egg.js jwt 几步实现加解密

1.安装 npm install --save egg-cors egg-jwt 2.配置 // config/config.default.jsconfig.jwt ={ secret: '123456', enable: true, //default is false match: '/jwt', //optional...

Live555 分析(一):类介绍

从程序的结构来看,live项目包括了四个基本库、程序入口类(在mediaServer中)和一些测试代码(在testProgs中)。 四个基本静态库是UsageEnvironment、BasicUsageEnvironment、groupsock和liveMedia。 UsageEnvironment: 包括抽象类UsageEnvironment和抽象类Ta...

京东阅读(web)体验优化

京东有电子书可以购买,可以多端阅读。比如PC客户端,移动端,以及本文提到的PC网站端。 先换个镜头,读书要记笔记(电子版本), 方便以后查阅。 镜头换回来,但是,我们为了方便肯定是想复制,下载啊,分享啊等,但是服务商一般是不允许你这么做的。 我了,在京东买了几本书,程序相关的,为了获取好的体验,在PC网站端阅读, 发现精彩之处,想去复制到笔记里面去。 结果...

在MFC中使dialog自适应缩放

起因 最近用mfc做了不少小软件,界面上都是基于CDialog或者CFormView,界面不能缩放一直是问题。一个办法是在OnSize()里面调用所有控件的MoveWindow()函数,根据比例调整控件大小。但是在界面上控件比较多的时候,这个发放就显得很繁琐了。于是我写了一个CAutoResize类,去实现控件的统一缩放。 工作原理 原理上很简单,对于MF...