three.js绘制网波浪

无图不欢,先上图
在这里插入图片描述
使用方法(以vue3为例)

<template><div class="net" ref="net"></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import NetAnimation from '@/utils/netAnimation.js'let net = ref(null)
onMounted(() => {new NetAnimation({dom: net.value,pointLightsAttr: [{}],axesHelperAttr: {show: true,length: 100},controlAttr: {show: true}})
})</script><style scoped lang="scss">
.net{width: 100%;height: 100%;background-color: #02112e;
}
</style>

netAnimation.js源码

import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";class NetAnimation {constructor(opt) {this.dom = opt.domthis.w = nullthis.h = nullthis.netMaxY = opt.netMaxYthis.scene = nullthis.renderer = nullthis.camera = nullthis.cameraAttr = opt.cameraAttrthis.ambientLight = nullthis.ambientLightAttr = opt.ambientLightAttrthis.pointLights = []this.pointLightsAttr = opt.pointLightsAttrthis.axesHelper = nullthis.axesHelperAttr = opt.axesHelperAttrthis.control = nullthis.controlAttr = opt.controlAttrthis.plane = nullthis.planeAttr = opt.planeAttrthis.animationIndex = 0this.requestAnimationFrame = nullthis.init()}init = () => {if(!this.dom){return}this.w = this.dom.clientWidth * (window.devicePixelRatio || 1)this.h = this.dom.clientHeight * (window.devicePixelRatio || 1)// 创建场景this.scene = this.createScene()// 创建renderthis.renderer = this.createWebGLRenderer({dom: this.dom});// 创建相机const cameraAttr = {style: {fov: 45,aspect: this.w / this.h,near: 0.01,far: 10000},position: {x: this.w / 2,y: this.w / 2,z: this.h * 2}}if(this.cameraAttr){this.cameraAttr = Object.assign(cameraAttr, this.cameraAttr)}else{this.cameraAttr = cameraAttr}this.camera = this.createPerspectiveCamera(this.cameraAttr.style)this.camera.position.set(this.cameraAttr.position.x, this.cameraAttr.position.y, this.cameraAttr.position.z);this.camera.lookAt(this.scene.position);// 创建环境光const ambientLightAttr = {show: true,style: {color: "#fff",intensity: 0.1}}if(this.ambientLightAttr){this.ambientLightAttr = Object.assign(ambientLightAttr, this.ambientLightAttr)}else{this.ambientLightAttr = ambientLightAttr}if(this.ambientLightAttr.show){this.ambientLight = this.createAmbientLight(this.ambientLightAttr.style);this.scene.add(this.ambientLight);}// 创建点光源if(!this.netMaxY){this.netMaxY = 60}const pointLightAttr =  {style: {color: '#fff',intensity: 1,distance: this.w},position: {x: 0,y: this.netMaxY * 2,z: 0}}if(this.pointLightsAttr?.length){this.pointLightsAttr.forEach(pointLightItem => {pointLightItem = Object.assign(pointLightAttr, pointLightItem)const pointLight = this.createPointLight(pointLightItem.style);pointLight.position.set(pointLightItem.position.x, pointLightItem.position.y, pointLightItem.position.z);this.pointLights.push(pointLight)})this.scene.add(...this.pointLights);}// 创建辅助线const axesHelperAttr = {show: false,length: 100}if(this.axesHelperAttr){this.axesHelperAttr = Object.assign(axesHelperAttr, this.axesHelperAttr)}else{this.axesHelperAttr = axesHelperAttr}if(this.axesHelperAttr.show){this.axesHelper = this.createAxesHelper(this.axesHelperAttr.length)this.scene.add(this.axesHelper);}// 创建轨道控制const controlAttr = {show: false}if(this.controlAttr){this.controlAttr = Object.assign(controlAttr, this.controlAttr)}else{this.controlAttr = controlAttr}if(this.controlAttr.show){this.createControl(this.camera, this.dom);}let planeAttr = {width: this.w,height: this.h,widthSegments: Math.floor(this.w / 20),heightSegments: Math.floor(this.h / 60)}if(this.planeAttr){this.planeAttr = Object.assign(planeAttr, this.planeAttr)}else{this.planeAttr = planeAttr}const geometry = this.createPlaneGeometry(this.planeAttr)const material = this.createMeshPlaneMaterial({color: "#ffffff",wireframe: true,});this.plane = this.createMesh({geometry, materialBasic: material});this.plane.rotation.x = Math.PI * -0.5;// this.plane.rotation.z = 45 * (Math.PI / 180);// this.plane.position.z = 100;this.scene.add( this.plane )// 渲染this.render()}render = () => {//循环调用this.requestAnimationFrame = requestAnimationFrame(this.render);this.animation()this.renderer.render(this.scene, this.camera);}unmount = () => {cancelAnimationFrame(this.requestAnimationFrame)}animation = () => {let animationSpeed = 10let sinXNum = this.planeAttr.widthSegmentslet sinYNum = this.planeAttr.heightSegmentsconst geometry = this.plane.geometryconst att_p = geometry.getAttribute('position');let i = 0;let xi = 0let yi = 0while(i < att_p.count){let x = att_p.getX(i)let y = att_p.getY(i)xi = Math.floor(i / sinXNum)yi = i - xi * sinXNumlet z = (Math.sin(((xi + this.animationIndex / animationSpeed) % sinXNum / sinXNum * Math.PI * 2)) + Math.sin(((yi + xi + this.animationIndex / animationSpeed) % sinYNum / sinYNum * Math.PI * 2))) * (this.netMaxY / 2)att_p.setXYZ( i, x, y, z );i += 1;}att_p.needsUpdate = true;geometry.computeVertexNormals();this.animationIndex++this.animationIndex %= sinXNum * sinYNum * animationSpeed}// 以下皆为实体创建方法createScene = () => {return new THREE.Scene();}createPerspectiveCamera = ({ fov, aspect, near, far }) => {// fov — 摄像机视锥体垂直视野角度// aspect — 摄像机视锥体长宽比// near — 摄像机视锥体近端面// far — 摄像机视锥体远端面return new THREE.PerspectiveCamera(fov, aspect, near, far);}createWebGLRenderer = ({ dom, width, height }) => {// renderDom — dom// width — 渲染宽度 一般取domclientWidth// height — 渲染高度 一般取clientHeightif (width === undefined) {width = dom.clientWidth;}if (height === undefined) {height = dom.clientHeight;}const renderer = new THREE.WebGLRenderer();renderer.setPixelRatio(window.devicePixelRatio || 1);renderer.setClearColor('#fff', 0); //设置背景颜色和透明度renderer.setSize(width, height);dom.appendChild(renderer.domElement);return renderer;}createAmbientLight = ({ color, intensity }) => {// color - (可选参数)) 十六进制光照颜色。 缺省值 0xffffff (白色)。// intensity - (可选参数) 光照强度。 缺省值 1。return new THREE.AmbientLight(color, intensity);}createPointLight = ({ color, intensity, distance, decay }) => {// color - (可选参数)) 十六进制光照颜色。 缺省值 0xffffff (白色)。// intensity - (可选参数) 光照强度。 缺省值 1。// distance - 这个距离表示从光源到光照强度为0的位置。 当设置为0时,光永远不会消失(距离无穷大)。缺省值 0.// decay - 沿着光照距离的衰退量。缺省值 2。return new THREE.PointLight(color, intensity, distance, decay);}createPlaneGeometry = ({width, height, widthSegments, heightSegments}) => {return new THREE.PlaneGeometry(width, height, widthSegments, heightSegments);}createMeshPlaneMaterial = (data) => {return new THREE.MeshLambertMaterial(data);}createMesh = ({geometry, materialBasic}) => {return new THREE.Mesh(geometry, materialBasic);}createAxesHelper = (length) => {return new THREE.AxesHelper(length)}createControl = (camera, dom) => {return new OrbitControls(camera, dom);};
}export default NetAnimation

如果电脑性能不错,可以考虑使用以下netAnimation2.js源码

import * as THREE from "three";
import { MeshLine, MeshLineMaterial } from "three.meshline";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";class NetAnimation {constructor(opt) {this.dom = opt.domthis.w = nullthis.h = nullthis.netMaxY = opt.netMaxYthis.scene = nullthis.renderer = nullthis.camera = nullthis.cameraAttr = opt.cameraAttrthis.ambientLight = nullthis.ambientLightAttr = opt.ambientLightAttrthis.pointLights = []this.pointLightsAttr = opt.pointLightsAttrthis.axesHelper = nullthis.axesHelperAttr = opt.axesHelperAttrthis.control = nullthis.controlAttr = opt.controlAttrthis.points = []this.lines = []this.isSameNormalStyle = opt.isSameNormalStylethis.pointAttr = opt.pointAttrthis.lineAttr = opt.lineAttrthis.pointsAttr = []this.linesArrt = []this.animationIndex = 0this.requestAnimationFrame = nullthis.init()}init = () => {if(!this.dom){return}this.w = this.dom.clientWidth * (window.devicePixelRatio || 1)this.h = this.dom.clientHeight * (window.devicePixelRatio || 1)// 创建场景this.scene = this.createScene()// 创建renderthis.renderer = this.createWebGLRenderer({dom: this.dom});// 创建相机const cameraAttr = {style: {fov: 45,aspect: this.w / this.h,near: 0.01,far: 10000},position: {x: this.w / 2,y: this.w / 2,z: this.h * 2}}if(this.cameraAttr){this.cameraAttr = Object.assign(cameraAttr, this.cameraAttr)}else{this.cameraAttr = cameraAttr}this.camera = this.createPerspectiveCamera(this.cameraAttr.style)this.camera.position.set(this.cameraAttr.position.x, this.cameraAttr.position.y, this.cameraAttr.position.z);this.camera.lookAt(this.scene.position);// 创建环境光const ambientLightAttr = {show: true,style: {color: "#fff",intensity: 0.1}}if(this.ambientLightAttr){this.ambientLightAttr = Object.assign(ambientLightAttr, this.ambientLightAttr)}else{this.ambientLightAttr = ambientLightAttr}if(this.ambientLightAttr.show){this.ambientLight = this.createAmbientLight(this.ambientLightAttr.style);// this.scene.add(this.ambientLight);}// 创建点光源if(!this.netMaxY){this.netMaxY = 60}const pointLightAttr =  {style: {color: '#fff',intensity: 1,distance: this.w},position: {x: this.netMaxY * 5,y: this.netMaxY * 5,z: this.netMaxY * 5}}if(this.pointLightsAttr?.length){this.pointLightsAttr.forEach(pointLightItem => {pointLightItem = Object.assign(pointLightAttr, pointLightItem)const pointLight = this.createPointLight(pointLightItem.style);pointLight.position.set(pointLightItem.position.x, pointLightItem.position.y, pointLightItem.position.z);this.pointLights.push(pointLight)})this.scene.add(...this.pointLights);}// 创建辅助线const axesHelperAttr = {show: false,length: 100}if(this.axesHelperAttr){this.axesHelperAttr = Object.assign(axesHelperAttr, this.axesHelperAttr)}else{this.axesHelperAttr = axesHelperAttr}if(this.axesHelperAttr.show){this.axesHelper = this.createAxesHelper(this.axesHelperAttr.length)this.scene.add(this.axesHelper);}// 创建轨道控制const controlAttr = {show: false}if(this.controlAttr){this.controlAttr = Object.assign(controlAttr, this.controlAttr)}else{this.controlAttr = controlAttr}if(this.controlAttr.show){this.createControl(this.camera, this.dom);}// 创建点、线console.time('a')this.initPointLineData()if(this.pointsAttr?.length){// 点geometry、material// let pointGeometry = null// let pointMaterial = null// let pointmMesh = null// 线geometry、materiallet lineMaterial = nullif(this.isSameNormalStyle === undefined){this.isSameNormalStyle = true// pointGeometry = this.createSphereGeometry(this.pointAttr.style.normal.geometry);// pointMaterial = this.createMeshLambertMaterial(this.pointAttr.style.normal.material);// pointmMesh = this.createMesh({geometry: pointGeometry, materialBasic: pointMaterial});lineMaterial = this.createMeshLineMaterial(this.lineAttr.style.normal.material);}// this.pointsAttr.forEach(pointAttrItem => {//     // 创建点Mesh//     let mesh = null//     if(!this.isSameNormalStyle){//         pointGeometry = this.createSphereGeometry(pointAttrItem.style.normal.geometry);//         pointMaterial = this.createMeshLambertMaterial(pointAttrItem.style.normal.material);//         mesh = this.createMesh({geometry: pointGeometry, materialBasic: pointMaterial});//     }else{//         mesh = pointmMesh.clone();//     }//     mesh.position.set(pointAttrItem.position.x, pointAttrItem.position.y, pointAttrItem.position.z);//     this.points.push(mesh)// })this.linesArrt.forEach(lineAttrItem => {// 创建线Meshlet linePositions = []lineAttrItem.forEach(linePoint => {let i = (linePoint.row * this.pointAttr.col) + linePoint.collinePositions.push({...this.pointsAttr[i].position})})const lineGeometry = this.createLineGeometry(linePositions);// if(!this.isSameNormalStyle){//     lineMaterial = this.createMeshLineMaterial(lineAttrItem.style.normal.material);// }const lineMesh = this.createMesh({geometry: lineGeometry, materialBasic: lineMaterial});this.lines.push(lineMesh)})// this.scene.add(...this.points);this.scene.add(...this.lines);}console.timeEnd('a')// 渲染this.render()}initPointLineData() {const pointAttr = {width: this.w,height: Math.floor(this.w / 2),row: Math.floor(this.w / 40),col: Math.floor(this.w / 20),// width: this.w * 2,// height: this.w,// row: this.w / 20,// col: this.w / 10,// row: 10,// col: 10,style: {normal: {geometry: {radius: 3,widthSegments: 320,heightSegments: 160,},material: {color: "#ffffff",wireframe: false, //是否将几何体渲染为线框,默认值为false(即渲染为平面多边形)},},light: {geometry: {radius: 1,widthSegments: 320,heightSegments: 160,},material: {color: "#ffffff",wireframe: false,},}}}if(this.pointAttr){this.pointAttr = Object.assign(pointAttr, this.pointAttr)}else{this.pointAttr = pointAttr}const lineAttr = {style: {normal: {material: {color: "#fff",// color: "#3587C7",linewidth: 1,},},light: {material: {color: "#ffffff",linewidth: 1,},}}};if(this.lineAttr){this.lineAttr = Object.assign(lineAttr, this.lineAttr)}else{this.lineAttr = lineAttr}const startX = -this.pointAttr.width / 2const startZ = -this.pointAttr.height / 2const stepX = this.pointAttr.width / this.pointAttr.colconst stepZ = this.pointAttr.height / this.pointAttr.rowconst sinXNum = this.pointAttr.row / 4const sinZNum = this.pointAttr.col / 4for(let i = 0 ; i < this.pointAttr.row; i++){for(let j = 0 ; j < this.pointAttr.col; j++){const x = startX + j * stepXconst z = startZ + i * stepZconst y = (Math.sin((i % sinXNum / sinXNum * Math.PI * 2)) + Math.sin(((j + i) % sinZNum / sinZNum * Math.PI * 2))) * (this.netMaxY / 2)this.pointsAttr.push({row: i,col: j,position: {x, y, z},style: {...this.pointAttr.style}})if(!this.linesArrt[i]){this.linesArrt[i] = []}this.linesArrt[i][j] = {row: i,col: j}if(!this.linesArrt[this.pointAttr.row + j]){this.linesArrt[this.pointAttr.row + j] = []}this.linesArrt[this.pointAttr.row + j][i] = {row: i,col: j}}}}render = () => {//循环调用this.requestAnimationFrame = requestAnimationFrame(this.render);this.animation()this.renderer.render(this.scene, this.camera);}unmount = () => {cancelAnimationFrame(this.requestAnimationFrame)}animation = () => {const sinXNum = this.pointAttr.row / 4const sinZNum = this.pointAttr.col / 4const count = this.pointAttr.row * this.pointAttr.colconst animationSpeed = 10 //值越大越慢console.time('b')// if(this.animationIndex % 10 === 0){this.pointsAttr.forEach((pointAttrItem, pointAttrIndex) => {const i = pointAttrItem.rowconst j = pointAttrItem.colpointAttrItem.position.y = (Math.sin(((i + this.animationIndex / animationSpeed) % sinXNum / sinXNum * Math.PI * 2)) + Math.sin(((j + i + this.animationIndex / animationSpeed) % sinZNum / sinZNum * Math.PI * 2))) * 30})this.linesArrt.forEach((lineAttrItem, lineAttrIndex) => {let linePositions = []lineAttrItem.forEach(linePoint => {let i = (linePoint.row * this.pointAttr.col) + linePoint.collet point = this.pointsAttr[i]linePositions.push({...point.position})})const lineGeometry = this.createLineGeometry(linePositions);this.updateGeometry(this.lines[lineAttrIndex].geometry, lineGeometry)})// }console.timeEnd('b')this.animationIndex++this.animationIndex %= count * animationSpeed}updateGeometry = (geometry, geometry_source) => {const att_p = geometry.getAttribute('position');const att_ps = geometry_source.getAttribute('position');let i = 0;while(i < att_p.count){att_p.setXYZ( i, att_ps.getX(i), att_ps.getY(i),att_ps.getZ(i) );i += 1;}att_p.needsUpdate = true;geometry.computeVertexNormals();};rand = (n,m) => {var c = m - n + 1;return Math.floor(Math.random() * c + n);}    // 以下皆为实体创建方法createScene = () => {return new THREE.Scene();}createPerspectiveCamera = ({ fov, aspect, near, far }) => {// fov — 摄像机视锥体垂直视野角度// aspect — 摄像机视锥体长宽比// near — 摄像机视锥体近端面// far — 摄像机视锥体远端面return new THREE.PerspectiveCamera(fov, aspect, near, far);}createWebGLRenderer = ({ dom, width, height }) => {// renderDom — dom// width — 渲染宽度 一般取domclientWidth// height — 渲染高度 一般取clientHeightif (width === undefined) {width = dom.clientWidth;}if (height === undefined) {height = dom.clientHeight;}const renderer = new THREE.WebGLRenderer();renderer.setPixelRatio(window.devicePixelRatio || 1);renderer.setClearColor('#fff', 0); //设置背景颜色和透明度renderer.setSize(width, height);dom.appendChild(renderer.domElement);return renderer;}createAmbientLight = ({ color, intensity }) => {// color - (可选参数)) 十六进制光照颜色。 缺省值 0xffffff (白色)。// intensity - (可选参数) 光照强度。 缺省值 1。return new THREE.AmbientLight(color, intensity);}createPointLight = ({ color, intensity, distance, decay }) => {// color - (可选参数)) 十六进制光照颜色。 缺省值 0xffffff (白色)。// intensity - (可选参数) 光照强度。 缺省值 1。// distance - 这个距离表示从光源到光照强度为0的位置。 当设置为0时,光永远不会消失(距离无穷大)。缺省值 0.// decay - 沿着光照距离的衰退量。缺省值 2。return new THREE.PointLight(color, intensity, distance, decay);}createSphereGeometry = ({radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength}) => {/*radius — 球体半径,默认为1。widthSegments — 水平分段数(沿着经线分段),最小值为3,默认值为32。heightSegments — 垂直分段数(沿着纬线分段),最小值为2,默认值为16。phiStart — 指定水平(经线)起始角度,默认值为0。。phiLength — 指定水平(经线)扫描角度的大小,默认值为 Math.PI * 2。thetaStart — 指定垂直(纬线)起始角度,默认值为0。thetaLength — 指定垂直(纬线)扫描角度大小,默认值为 Math.PI。*/return new THREE.SphereGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength);}createMeshLambertMaterial = (data) => {return new THREE.MeshLambertMaterial(data);}createLineGeometry = (points) => {// const pointsVector3 = [];// for (let i = 0; i < points.length; i++) {//     pointsVector3.push(new THREE.Vector3(points[i].x, points[i].y, points[i].z));// }// const geometry = new THREE.BufferGeometry().setFromPoints(pointsVector3);// const line = new MeshLine();// line.setGeometry(geometry);// return linelet pointsVector3 = []points.forEach(point => {pointsVector3.push(new THREE.Vector3(point.x, point.y, point.z))})let curve = new THREE.CatmullRomCurve3(pointsVector3);var CurvePath = new THREE.CurvePath();// 创建CurvePath对象// CurvePath.curves.push(line1, curve, line2);// 插入多段线条CurvePath.curves.push(curve);return new THREE.TubeGeometry(CurvePath, points.length * 10, 1, 25, false);}createMeshLineMaterial = (data) => {// return new MeshLineMaterial({//     lineWidth: data.linewidth,//     color: data.color || "white",//     dashArray: data.dashArray || 0,//     transparent: true,// })return new THREE.MeshLambertMaterial({color: data.color || "white"});}createMesh = ({geometry, materialBasic}) => {return new THREE.Mesh(geometry, materialBasic);}createAxesHelper = (length) => {return new THREE.AxesHelper(length)}createControl = (camera, dom) => {return new OrbitControls(camera, dom);};
}export default NetAnimation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/583498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EBDP:解锁大数据的奥秘✨

大数据时代已经来临&#xff0c;你是否也想掌握这门“显学”&#xff1f;&#x1f31f; EBDP&#xff0c;这个让众多专业人士趋之若鹜的认证&#xff0c;究竟有何魅力&#xff1f;今天就带你一探究竟&#xff01; &#x1f31f;EBDP&#xff1a;大数据的“敲门砖”&#x1faa…

Koordinator 助力云原生应用性能提升:小红书混部技术实践

作者&#xff1a;宋泽辉&#xff08;小红书&#xff09;、张佐玮&#xff08;阿里云&#xff09; 编者按&#xff1a; Koordinator 是一个开源项目&#xff0c;是基于阿里巴巴内部多年容器调度、混部实践经验孵化诞生&#xff0c;是行业首个生产可用、面向大规模场景的开源混…

CNAS中兴新支点——源代码审计对企业有哪些好处?

源代码扫描&#xff0c;对应用程序进行静态漏洞扫描&#xff0c;分析源代码中存在的安全风险&#xff0c;运行应用于模拟器中对应用进行实时漏洞攻击检测。 你是否了解源代码扫描对企业的好处&#xff1f; 一、源代码扫描&#xff0c;通常能够帮助企业解决这些问题&#xff1…

BDD - Python Behave 配置文件 behave.ini

BDD - Python Behave 配置文件 behave.ini 引言behave.ini配置参数的类型配置项 behave.ini 应用feature 文件step 文件创建 behave.ini执行 Behave查看配置默认值 behave -v 引言 前面文章 《BDD - Python Behave Runner Script》就是为了每次执行 Behave 时不用手动敲一长串…

VSCode Python开发环境配置

目录 1 插件安装2 Debug和测试配置常见问题 1 插件安装 1.1 基础编译插件&#xff0c;Python、Pylance 1.2 修改语言服务器类型&#xff0c;进入用户配置页面搜索Python: Language Server&#xff0c;选择Pylance&#xff08;一定要修改可以提供很多语法提示&#xff09; 1…

根据commitID删除某一次提交

1.查看提交历史 git log --prettyoneline2.找到需要删除的那个commit,然后找到上次提交的commitID 比如想要删除下面这一条 我们找到上次提交的commitID 3.执行rebase git rebase -i efa11da0a684977bf8ac047ebb803e2ded2063a4 进入编辑状态显示如下 将需要删除的那个提交前…

探索 EndNote:卓越文献管理工具的功能与应用

引言 在当今科研与学术写作的领域&#xff0c;文献管理是每一位研究者都不可避免面对的挑战。为了有效地整理、引用和协作&#xff0c;研究者需要强大而灵活的文献管理工具。EndNote作为一款备受推崇的文献管理软件&#xff0c;在解决这一问题上发挥着关键作用。本文将深入探讨…

设备健康管理系统助力制造企业实现数字化转型

在当今快速变革的制造业环境中&#xff0c;数字化转型已成为制造企业保持竞争力和实现可持续发展的关键。在这个数字化转型的浪潮中&#xff0c;设备健康管理系统正发挥着重要的作用。设备健康管理系统通过实时监测、预测分析和智能诊断等功能&#xff0c;为制造企业提供了全面…

基于PyQt5自定义UI的详细教程

PyQt5和Qt designer的详细安装教程&#xff1a;https://blog.csdn.net/qq_43811536/article/details/135185233?spm1001.2014.3001.5501Qt designer界面和所有组件功能的详细介绍&#xff1a;https://blog.csdn.net/qq_43811536/article/details/135186862?spm1001.2014.3001…

运行天地图Cesium.js三维服务案例

零、技术选型及相关网址 技术选型&#xff1a;Vue2、VueCli5、Cesium.js、天地图 相关网址&#xff1a;三维服务 - 天地图 帮助文档 一、cesium 初始化参数解析 initializeCesium() {this.viewer new Cesium.Map("cesiumContainer", {shouldAnimate: true, // 是否…

gem5学习(7):内存系统中创建 SimObjects--Creating SimObjects in the memory system

目录 一、gem5 master and slave ports 二、Packets 三、Port interface 1、主设备发送请求时从设备忙 2、从设备发送响应时主设备忙 四、Simple memory object example 1、Declare the SimObject 2、Define the SimpleMemobj class 3、Define the SimpleMemobj class…

EST-100身份证社保卡签批屏按捺终端PC版web版本http协议接口文档,支持web网页开发对接使用

<!DOCTYPE html><html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,initial-scale1.0"><title>演示DEMO</title><script type"text/…

亚马逊SEO是什么意思?亚马逊标题的SEO方法是什么?-站斧浏览器

亚马逊SEO是什么意思&#xff1f; 亚马逊SEO主要包括了对标题、描述、五点简介等元素的优化&#xff0c;以及评价和评论的管理等方面。下面将详细分析亚马逊SEO的相关内容&#xff0c;帮助卖家更好地理解和应用。 在亚马逊平台上进行SEO优化需要考虑以下几个方面&#xff1a;…

gin框架使用系列之四——json和protobuf的渲染

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》 上篇我们介绍了如何获取数据&#xff0c;本篇我们介绍一下如何返回固定格式的数据。 一、返回JSON数据 在web开发中…

Linux管理LVM逻辑卷

目录 一、LVM逻辑卷介绍 1. 概述 2. LVM基本术语 2.1 PV&#xff08;Physical Volume&#xff0c;物理卷&#xff09; 2.2 VG (Volume Group&#xff0c;卷组&#xff09; 2.3 LV (Logical Volume&#xff0c;逻辑卷&#xff09; 3. 常用的磁盘命令 4. 查看系统信息的命…

golang第一卷---go入门

go入门 对于使用go的好处环境变量配置开发工具 参考网站 &#xff1a;go入门 对于使用go的好处 简单好记的关键词和语法。轻松上手&#xff0c;简单易学。更高的效率。比Java&#xff0c;C等拥有更高的编译速度&#xff0c;同时运行效率媲美C&#xff0c;同时开发效率非常高。…

爬虫工作量由小到大的思维转变---<第三十三章 Scrapy Redis 23年8月5日后会遇到的bug)>

前言: 收到回复评论说,按照我之前文章写的: 爬虫工作量由小到大的思维转变---&#xff1c;第三十一章 Scrapy Redis 初启动/conn说明书)&#xff1e;-CSDN博客 在启动scrapy-redis后,往redis丢入url网址的时候遇到: TypeError: ExecutionEngine.crawl() got an unexpected …

数据资产专题3:估值

欢迎关注主页个人介绍及相关链接&#xff0c;获取更多算法源码材料 2023数据资源入表白皮书&#xff0c;推荐系统源码下载-CSDN博客 浅析研发支出费用化和资本化的区别-CSDN博客 商业银行数据资产估值白皮书&#xff0c;推荐系统源码下载-CSDN博客 用友BIP数据资产入表解决…

飞企互联-FE企业运营管理平台 登录绕过漏洞复现

0x01 产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外&#xff0c;支持企业B2B、C2B与O2O等核心需求&#xff0c;为不同行业客户的互联网转型提供支持。 0x02 漏洞概…

【12.28】转行小白历险记-刷算法04

01两两交换链表中的节点 整体思路 1.要修改后一个节点的指向一定要知道前一个节点的指向才可以改变后面一个节点的 2.分情况奇数和偶数节点&#xff0c;终止条件很重要 3.虚拟头节点&#xff0c;是对我们操作的指针是不是头节点进行判断 02删除链表的倒数第N个节点 思路 …