Learning vtkjs之ImageStreamline
过滤器 流线
介绍
vtkImageStreamline - 在 vtkImageData 中积分流线
vtkImageStreamline 是一个过滤器,它从定义了向量场的 vtkImageData 输入中生成流线。此过滤器将在输入中查找向量(即 getVectors())。然后,它将使用龙格-库塔 2 法从第二个输入的点定义的起始种子集开始积分这些向量,直到达到指定的最大步数或流线离开域。
输出将是一个包含每条流线的折线的 vtkPolyData。目前,此过滤器不将任何输入场插值到流线的点。
效果
核心代码
数据生成
const vecSource = macro.newInstance((publicAPI, model) => {macro.obj(publicAPI, model); // make it an objectmacro.algo(publicAPI, model, 0, 1); // mixin algorithm code 1 in, 1 outpublicAPI.requestData = (inData, outData) => {// implement requestDataif (!outData[0]) {const id = vtkImageData.newInstance();id.setSpacing(0.1, 0.1, 0.1);const count = 10;id.setExtent(0, count - 1, 0, count - 1, 0, count - 1);const dims = [count, count, count];const newArray = new Float32Array(3 * dims[0] * dims[1] * dims[2]);let i = 0;for (let z = 0; z < count; z++) {for (let y = 0; y < count; y++) {for (let x = 0; x < count; x++) {newArray[i++] = Math.random() * x;const v = 0.1 * y;newArray[i++] = Math.random() * v;newArray[i++] = 0;}}}const da = vtkDataArray.newInstance({numberOfComponents: 3,values: newArray,});da.setName("vectors");const cpd = id.getPointData();cpd.setVectors(da);// Update outputoutData[0] = id;}};
})();
流线提取
const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({background: [0, 0, 0],rootContainer: vtkContainerRef.current,});const renderer = fullScreenRenderer.getRenderer();const renderWindow = fullScreenRenderer.getRenderWindow();const planeSource = vtkPlaneSource.newInstance();// planeSource.setOrigin(0.05, 0.05, 0.05);// planeSource.setPoint1(0.05, 0.85, 0.05);// planeSource.setPoint2(0.05, 0.05, 0.85);planeSource.setOrigin(0.01, 0.0, 0.0);planeSource.setPoint1(0.01, 0.9, 0.0);planeSource.setPoint2(0.01, 0.0, 0.9);const sline = vtkImageStreamline.newInstance();sline.setIntegrationStep(0.01);sline.setInputConnection(vecSource.getOutputPort());sline.setInputConnection(planeSource.getOutputPort(), 1);const outlineFilter = vtkOutlineFilter.newInstance();outlineFilter.setInputConnection(vecSource.getOutputPort());context.current = {planeSource,renderer,renderWindow,};addRepresentation(sline, {diffuseColor: [0, 1, 1],lineWidth: 3,});addRepresentation(outlineFilter, {diffuseColor: [1, 0, 0],lineWidth: 1.5,});addRepresentation(planeSource, {representation: Representation.POINTS,pointSize: 10,});renderer.resetCamera();renderWindow.render();
全部代码都放到github上了
新坑_Learning vtkjs_git地址
关注我,我持续更新vtkjs的example学习案例
也欢迎各位给我提意见,技术交流~
大鸿
WeChat : HugeYen
WeChat Public Account : BIM树洞
做一个静谧的树洞君
用建筑的语言描述IT事物;
用IT的思维解决建筑问题;
共建BIM桥梁,聚合团队。
本学习分享资料不得用于商业用途,仅做学习交流!!如有侵权立即删除!!