WebGL笔记:使用鼠标绘制多个线条应用及绘制动感线性星座及修复Mac系统下的渲染缺陷问题

OSG事件之鼠标交互 【代码】OSG事件之鼠标交互。 阅读详情

使用鼠标绘制多个线条

  • 多个线条,肯定不是一笔画过的,而是多次画的线条
  • 既然是多线,那就需要有个容器来管理它们

1 )建立容器对象

建立一个 lineBox 对象,作为承载多边形的容器

// lineBox.js
export default class lineBox {
  constructor(gl) {
    this.gl = gl
    this.children = []
  }
  add(obj) {
    obj.gl = this.gl
    this.children.push(obj)
  }
  updateVertices(params) {
    this.children.forEach(ele => {
      ele.updateVertices(params)
    })
  }
  draw() {
    this.children.forEach(ele => {
      ele.init()
      ele.draw()
    })
  }
}
  • 属性

    • gl webgl上下文对象
    • children 子级
  • 方法

    • add() 添加子对象
    • updateVertices() 更新子对象的顶点数据
    • draw() 遍历子对象绘图,每个子对象对应一个buffer 对象,所以在子对象绘图之前要先初始化

2 )场景应用

场景:鼠标点击画布,绘制多边形路径,鼠标右击,取消绘制,鼠标再次点击,绘制新的多边形

import LineBox from './lineBox'
import Poly from './poly'

// 容器
const lb = new LineBox(gl)
// 当前正在绘制的多边形
let poly = null

// 取消右击提示
canvas.oncontextmenu = function() {
    return false
}

// 鼠标点击事件
canvas.addEventListener("mousedown", (event) => {
    if(event.button === 2) {
        popVertice()
    } else {
        const { x, y } = getMousePosInWebgl(event, canvas)
        poly ? poly.addVertice(x,y) : crtPoly(x,y)
    }
    render()
})

// 鼠标移动
canvas.addEventListener("mousemove", (event) => {
    if (poly) {
        const { x, y } = getMousePosInWebgl(event, canvas)
        poly.setVertice(poly.count - 1, x, y)
        render()
    }
})

// 删除最后一个顶点
function popVertice() {
    poly.popVertice()
    poly = null
}

// 创建多边形
function crtPoly(x,y) {
    poly = new Poly({
        vertices:[x,y,x,y],
        types:['POINTS','LINE_STRIP']
    })
    lb.add(poly)
}

// 渲染方法
function render() {
    gl.clear(gl.COLOR_BUFFER_BIT)
    lb.draw()
}

3 )场景应用

  • 画一个星座
    • 鼠标第1次点击画布时
    • 创建多边形
    • 绘制2个点
    • 鼠标移动时
    • 当前多边形最后一个顶点随鼠标移动
    • 鼠标接下来点击画布时
    • 新建一个点
    • 鼠标右击时
    • 删除最后一个随鼠标移动的点
  • 顶点要有闪烁动画
  • 建立顶点的时候,如果鼠标点击了其它顶点,就不要再显示新的顶点

3.1 )建立顶点着色器

<script id="vertexShader" type="x-shader/x-vertex">
      attribute vec4 a_Attr;
      varying float v_Alpha;
      void main() {
          gl_Position = vec4(a_Attr.x, a_Attr.y, 0.0, 1.0);
          gl_PointSize = a_Attr.z;
          v_Alpha = a_Attr.w;
      }
</script>
  • a_Attr() 是一个4维向量,其参数结构为(x, y, z, w)
    • x,y代表位置
    • z代表顶点尺寸
    • w代表顶点透明度,w会通过 varying 变量 v_Alpha 传递给片元

3.2 )建立片元着色器

<script id="fragmentShader" type="x-shader/x-fragment">
      precision mediump float;
      varying float v_Alpha;
      void main() {
          float dist = distance(gl_PointCoord, vec2(0.5,0.5));
          if(dist < 0.5) {
            gl_FragColor = vec4(0.87, 0.91, 1.0, v_Alpha);
          } else {
            discard;
          }
      }
</script>
  • 通过v_Alpha接收透明度,然后设置片元的颜色

3.3 )建立夜空对象,用于承载多边形

const lb = new lineBox(gl)

3.4 )建立合成对象,用于对顶点数据做补间运算

const compose = new Compose();

3.5 )声明两个变量,用于表示当前正在绘制的多边形和鼠标划上的点

// 当前正在绘制的多边形
let poly = null
// 鼠标划上的点
let point = null

3.6 )取消右击提示

// 取消右击提示
canvas.oncontextmenu = function() {
  return false;
}

3.7 )鼠标按下事件

// 鼠标按下事件
canvas.addEventListener("mousedown", (event) => {
  if(event.button === 2) {
    // 右击删除顶点
    poly && popVertice()
  } else {
    const {x,y} = getMousePosInWebgl(event, canvas)
    if(poly) {
      // 连续添加顶点
      addVertice(x,y)
    } else {
      // 建立多边形
      crtPoly(x, y)
    }
  }
});
  • getMousePosInWebgl() 方法是用于获取鼠标在webgl 画布中的位置,我们之前说过。

  • crtPoly() 创建多边形

    function crtPoly(x, y) {
      let o1 = point ? point : { x, y, pointSize: random(), alpha: 1 }
      const o2 = { x, y, pointSize: random(), alpha: 1 }
      poly = new Poly({
        size: 4,
        attrName: 'a_Attr',
        geoData: [o1,o2],
        types: ['POINTS','LINE_STRIP']
      })
      lb.add(poly)
      crtTrack(o1)
      crtTrack(o2)
    }
    
  • 建立两个顶点数据o1,o2,如果鼠标点击了其它顶点,o1的数据就是此顶点的数据

  • 顶点的尺寸是一个随机数random()

    function random() {
      return Math.random() * 8.0 + 3.0
    }
    
  • 基于两个顶点数据,建立多边形对象和两个时间轨对象

  • crtTrack() 建立时间轨

    function crtTrack(obj) {
      const { pointSize } = obj
      const track = new Track(obj)
      track.start = new Date()
      track.timeLen = 2000
      track.loop = true
      track.keyMap = new Map([
        [
          "pointSize",
          [
            [500, pointSize],
            [1000, 0],
            [1500, pointSize],
          ],
        ],
        [
          "alpha",
          [
            [500, 1],
            [1000, 0],
            [1500, 1],
          ],
        ],
      ]);
      compose.add(track)
    }
    
  • addVertice() 添加顶点

    function addVertice(x, y) {
      const { geoData } = poly
      if(point) {
        geoData[geoData.length-1] = point
      }
      let obj = { x, y, pointSize:random(), alpha: 1 }
      geoData.push(obj)
      crtTrack(obj)
    }
    
  • 如果鼠标点击了其它顶点,就让多边形的最后一个顶点数据为此顶点

  • 建立下一个顶点的顶点数据,添加新的顶点,建立新的时间轨

  • popVertice() 删除最后一个顶点

    function popVertice() {
      poly.geoData.pop()
      compose.children.pop()
      poly = null
    }
    

3.8 )鼠标移动事件

canvas.addEventListener("mousemove", (event) => {
  const { x, y } = getMousePosInWebgl(event, canvas)
  point = hoverPoint(x, y)
  if(point) {
    canvas.style.cursor = 'pointer'
  } else {
    canvas.style.cursor = 'default'
  }
  if(poly) {
    const obj = poly.geoData[poly.geoData.length-1]
    obj.x = x
    obj.y = y
  }
});
  • 基于鼠标是否划上顶点,设置鼠标的视觉状态

  • 设置正在绘制的多边形的最后一个顶点点位

  • hoverPoint() 检测所有顶点的鼠标划入,返回顶点数据

    function hoverPoint(mx, my) {
      for(let { geoData } of lb.children) {
        for(let obj of geoData) {
          if(poly && obj === poly.geoData[poly.geoData.length-1]) {
            continue
          }
          const delta = {
            x: mx - obj.x,
            y: my - obj.y
          }
          const { x,y } = glToCssPos(delta, canvas)
          const dist = x * x + y * y;
          if(dist < 100) {
            return obj
          }
        }
      }
      return null
    }
    
  • 遍历 lb 中的所有顶点数据,忽略绘图时随鼠标移动的点,获取鼠标和顶点的像素距离,若此距离小于10像素,返回此点;否则,返回null

  • glToCssPos() webgl坐标系转css坐标系,将之前说过的getMousePosInWebgl() 方法逆向思维即可

    function glToCssPos({x,y},{width,height}){
      const [halfWidth, halfHeight] = [width / 2, height / 2]
      return {
        x:x*halfWidth,
        y:-y*halfHeight
      }
    }
    

2.9 )连续渲染方法

!(function animate() {
  compose.update(new Date())
  lb.updateVertices(['x', 'y', 'pointSize', 'alpha'])
  render()
  requestAnimationFrame(animate)
})();
  • 更新动画数据
  • 更新Vertices 数据
  • render() 渲染
    function render(){
      gl.clear(gl.COLOR_BUFFER_BIT)
      lb.draw()
    }
    

mac系统下绘制线条兼容性问题解决

  • 这里着重说一下,在mac系统下,在用鼠标绘制线条的时候,就是线条的效果是断开的,如下图

  • 这个效果是由片源着色器导致的,这个片元着色器还是以前用于绘制原点的片元着色器

    precision mediump float;    
    void main(){ 
        float dist = distance(gl_PointCoord, vec2(0.5,0.5));
        if(dist<0.5){
            gl_FragColor = vec4(1,1,0,1);
        } else {
            discard;
        }
    }
    
  • 这个着色器在mac系统会把一部分线条中的片元给过滤掉,也就是走了后面的discard方法放弃了一部分片元的绘制

  • 而这个问题在window电脑里就没有

解决

  • 需要告诉着色器当前的绘图方式, 如果我是用 POINTS 方法去绘图的话,那么就过滤一下圆圈以外的片元,也就是说只画圆圈以内的,就像现在这个逻辑一样
  • 那如果我的绘图方式不是points,而是线或者面之类的那我就直接正常绘图就可以了

接下来咱们看一下代码实现

  • 1)先给片元着色器添加一个uniform 变量

    precision mediump float;
    uniform bool u_IsPOINTS;
    void main() {
        if(u_IsPOINTS) { 
            float dist = distance(gl_PointCoord,vec2(0.5,0.5));
            if(dist < 0.5) {
                gl_FragColor = vec4(1,1,0,1);
            } else {
                discard;
            }
        } else {
            gl_FragColor = vec4(1,1,0,1);
        }
    }
    
  • 2)给 Poly 对象添加两个属性

      const defAttr = () => ({
        circleDot: false,
        u_IsPOINTS: null,
        ...
      })
    
    • circleDot 是否是圆点
    • u_IsPOINTS uniform变量
  • 3)在初始化方法中,如果是圆点,就获取一下uniform 变量

    init() {
        ...
        if (circleDot) {
          this.u_IsPOINTS = gl.getUniformLocation(gl.program, "u_IsPOINTS");
        }
    }
    
  • 4 )在渲染的时候,如果是圆点,就基于绘图方式修改 uniform 变量

    draw(types = this.types) {
        const {gl,count,u_IsPOINTS,circleDot} = this;
        for (let type of types) {
            circleDot && gl.uniform1f(u_IsPOINTS, type==='POINTS');
            gl.drawArrays(gl[type],0,count);
        }
    }
    
基于 Qt 6 / C++17 的多算法加解密工具(学习研究用途) 涵盖编码、古典密码、对称/非对称加密、哈希摘要共 24 种算法,全部纯 C++ 自实现,不依赖 OpenSSL/GmSSL 基于 Qt 6 / C++17 的多算法加解密工具(学习研究用途)。涵盖编码、古典密码、对称/非对称加密、哈希摘要共 24 种算法,全部纯 C++ 自实现,不依赖 OpenSSL/GmSSL。含图形界面、批量文件加解密、密钥管理、性能测试与操作日志。提供标准测试向量自测。 立即下载

相关推荐

考虑一次调频以及二次调频和各机组调频特性的双目标风光水火储动态调度研究(Matlab代码实现)

考虑一次调频以及二次调频和各机组调频特性的双目标风光水火储动态调度研究(Matlab代码实现)内容概要:本文研究了一种考虑一次调频、二次调频以及各机组调频特性的双目标优化模型,用于风光水火储多能互补系统的动态调度问题。该模型以系统运行成本最小化和新能源消纳最大化为双重优化目标,综合考虑了各类电源的出力特性、储能系统的充放电行为及电网频率响应要求。通过Matlab编程实现了完整的求解流程,采用多目标优化算法对复杂约束条件下的调度方案进行求解,并对不同场景下的调度结果进行仿真分析,验证了所提模型在提升系统经济性与稳定性方面的有效性。研究还探讨了储能系统在平抑新能源波动、参与频率调节中的关键作用,为高比例可再生能源接入下的电力系统调度提供了理论支持和技术路径。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事新能源调度、电力系统优化等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决含多种能源形式的复杂电力系统在实际运行中的动态调度问题;②研究储能系统在调频和促进新能源消纳中的协同机制;③掌握多目标优化在电力系统调度中的建模与实现方法; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件处理及多目标折衷分析方法,同时可通过修改参数进行不同场景的仿真实验,以加深对系统动态行为的理解。

WEBGL(5):绘制线

注意:线段的点的数据必须是成对出现的。根据绘制参数的不同,绘制不同的线。

u013938578的博客 865

图腾柱无桥PFC变换器+平均电流控制+PI电压双闭环前馈控制设计(Simulink仿真实现)

内容概要:本文系统研究了图腾柱无桥PFC变换器的高性能控制策略,采用平均电流控制与PI电压双闭环前馈控制相结合的方法,并基于Simulink平台构建了完整的仿真模型进行验证。文章深入剖析了控制系统的结构设计,重点阐述了电压外环与电流内环的协同工作机理,其中前馈控制的引入显著增强了系统对输入扰动的抑制能力和动态响应速度。通过仿真结果表明,该复合控制策略能够有效实现单位功率因数运行,大幅降低输入电流的总谐波畸变率(THD),同时确保直流母线电压具有优异的稳态精度和快速跟踪能力。本研究为高效率、高功率密度的PFC变换器设计提供了坚实的理论支撑和可靠的实践范例。; 适合人群:从事电力电子、电气自动化、新能源变换器研发的高校研究生、科研人员及企业工程师。; 使用场景及目标:①掌握图腾柱无桥PFC变换器的工作原理与建模方法;②深入理解平均电流控制、PI双闭环及前馈控制在电力电子系统中的综合应用;③学习使用Simulink进行电力电子变换器的系统级仿真与性能分析。; 阅读建议:建议读者结合文中提供的仿真模型,分模块(主电路、控制逻辑、调制环节)进行参数设置与仿真调试,重点关注电压环与电流环的动态响应、稳态精度以及THD指标的变化,以深化对控制策略的理解。

osg画线_在osgearth里头画线

线的画法和osg里头一样,可参看osggeometry.cpp,但是点的坐标需要经过转换,实践证明是可行的,应该也可以用到其它几何体上。新手上路,欢迎大牛们拍砖。这部分放在main()或者InitSceneGraph( void )中osg::ref_ptr&ltosg::Geode&gt geode = new osg::Geode();mRoot-&gtaddChild...

weixin_39905500的博客 1742

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)

内容概要:本文系统研究了基于序贯蒙特卡洛模拟法的配电网可靠性评估方法,重点聚焦于其在含分布式电源的复杂配电网中的应用。文章深入阐述了该方法的理论基础与实现流程,通过建立配电网元件的故障与修复过程的时间序列模型,模拟系统在长期运行中的状态演变,进而精确统计系统及负荷点的关键可靠性指标,如系统平均停电频率(SAIFI)、系统平均停电持续时间(SAIDI)、用户平均停电时间(CAIDI)等。研究依托Matlab平台完成了完整的仿真程序开发,并通过典型算例验证了所提方法的有效性与工程实用性。该方法能够充分考虑系统的时序特性与元件间的相关性,尤其适用于高比例分布式电源接入后带来的随机性与波动性较强的新型配电网可靠性分析。; 适合人群:具备电力系统分析基础知识和一定Matlab编程能力的高校研究生、科研机构研究人员,以及从事配电网规划、运行维护与风险管理的工程技术人员。; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的核心原理与具体实施步骤;②学习如何利用Matlab进行配电网时序仿真建模与可靠性指标的自动化计算;③为含分布式电源的现代配电网的规划设计、运行风险评估及韧性提升提供科学的量化分析工具与技术支撑。; 阅读建议:建议读者结合文中提供的Matlab代码实现,逐行调试并运行仿真程序,深入理解状态抽样、时间推进、故障遍历、指标累加等关键算法环节,并鼓励尝试将其应用于不同的网络拓扑结构或引入更多类型的分布式电源模型,以深化对方法适应性与扩展性的理解。

基于多策略改进蜣螂算法(MSDBO)的多无人机协同三维避障路径规划研究(Matlab代码实现)

内容概要:本文研究基于多策略改进的蜣螂优化算法(MSDBO)在多无人机协同三维避障路径规划中的应用,旨在解决复杂环境下多无人机安全、高效飞行的路径规划问题。通过引入多种优化策略对传统蜣螂算法进行改进,显著增强了算法的全局搜索能力、收敛速度与避障性能,并结合三维空间建模与多无人机协同机制,构建以路径成本(如距离、高度、威胁、转角等)为目标函数的优化模型。文中系统阐述了算法设计原理、路径规划建模方法及仿真实验过程,通过多场景对比实验验证了MSDBO算法在路径安全性、规划效率和多机协同性方面的优越性与鲁棒性。; 适合人群:具备一定算法基础和MATLAB编程能力,从事无人机控制、路径规划、智能优化算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决城市、山区等复杂环境下的多无人机协同飞行路径规划问题;②提升无人机集群在动态障碍物环境中的自主避障与协同能力;③为智能交通、应急救援、军事侦察等领域的多智能体路径规划提供技术支持。; 阅读建议:建议结合提供的Matlab代码进行仿真实践,深入理解算法实现细节与参数调优方法,同时可尝试在不同场景下测试算法性能,进一步掌握其适用边界与优化潜力。

OSG 之学习四:OSG 鼠标键盘交互

文章目录说明1. 交互过程2. 交互详解3. pick 说明 OSG 入门看的,大佬绕道 示例来源于《OSG程序设计教程》 没有此电子书的小伙伴们,我已上传至优快云 1. 交互过程 2. 交互详解 函数功能:鼠标右键单击时牛和飞机都隐藏,鼠标左键双击时牛和飞机都显示,按键盘上面的 LEFT(方向左键) 键,显示牛, 按键盘上面的 RIGHT(方向右键) 键显示飞机。其中显示与隐藏结点我们...

Neverland_LY‘s Domain 4460

阅读档案 低年级版.docx

阅读档案 低年级版.docx

webgl绘制图形API——drawArrays、drawElements

gl.drawArrays()作为webgl中常用的函数图形绘制方法,可以在浏览器按照指定的模式绘制图形,与之相对的gl.drawElements()函数也是常用的绘制函数,本文将介绍二者的区别与使用。

qq_37987033的博客 4244

基于斜坡补偿的Buck电路峰值电流+电压电流双闭环控制【附说明文档】(Simulink仿真实现)优快云首页发布文章优快云同步助手LLC谐振变换器开环+闭环软启动仿真设计(Simulink

内容概要:本文围绕三电平VIENNA整流器的双闭环控制与中点电位平衡问题展开研究,提出了一种基于电容电压差值补偿的中点电位平衡策略。通过构建电压外环与电流内环的双闭环PI控制系统,实现直流母线电压的稳定与输入电流的快速跟踪;在此基础上,引入上下电容电压差值作为反馈信号,结合SVPWM调制中冗余小矢量的时间分配机制,实现对中点电位的主动调节。仿真结果表明,该策略能有效抑制中点电位波动,显著提升电容电压均衡度,同时保持较低的输入电流THD,验证了“电压稳定—电流低谐波—中点均衡”多目标协同控制的可行性与有效性。; 适合人群:从事电力电子变换器控制、新能源发电、电动汽车充电等领域的科研人员及工程技术人员,尤其是具备一定MATLAB/Simulink仿真基础的研究生和电气工程专业高年级本科生。; 使用场景及目标:① 掌握三电平VIENNA整流器的工作原理与控制难点;② 学习双闭环PI控制器的设计与参数整定方法;③ 理解并应用基于SVPWM冗余矢量的中点电位主动平衡控制策略;④ 实现高性能整流器的仿真建模与性能验证。; 阅读建议:此资源以理论分析与Simulink仿真相结合的方式呈现,建议读者在阅读时同步搭建仿真模型,重点关注双闭环结构搭建、SVPWM调制模块实现以及中点平衡补偿环节的集成,通过对比投入与未投入补偿策略的仿真结果,深入理解控制策略的作用机理与性能边界。

全桥LLC谐振(变频+移相混合控制)变换器闭环仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了全桥LLC谐振变换器在变频控制(PFM)与移相控制相结合的混合控制策略下的闭环仿真模型构建过程,基于Simulink平台实现。该变换器通过融合两种控制方式的优势,实现了高效、稳定的电压调节与软开关特性,适用于中高功率DC-DC转换应用场景。文档系统阐述了系统建模、控制环路设计(包括电压外环与电流内环)、谐振腔关键参数计算、PWM信号生成及闭环反馈机制的实现方法,并通过仿真验证了在不同负载条件下输出电压的稳定性、动态响应性能以及零电压开关(ZVS)的实现效果。同时,文中探讨了该模型与PFC、CLLC、DAB等其他电力电子系统的协同仿真潜力,凸显其在现代电力电子系统设计与研究中的重要价值。; 适合人群:具备扎实的电力电子技术理论基础,熟悉Simulink/Matlab仿真环境,从事开关电源、新能源变换器、电力电子系统设计及相关领域研发工作的工程师与高校研究生。; 使用场景及目标:①用于高校教学与科研项目中,帮助学生深入理解LLC谐振变换器的工作原理、谐振特性及混合控制策略的实现逻辑;②为工业界全桥LLC电源产品的开发提供高保真的仿真原型与设计参考,加速产品迭代;③支持研究人员对变频-移相混合控制下的系统效率优化、动态响应提升、软开关范围拓展等关键技术问题进行深入探究。; 阅读建议:建议读者结合所提供的Simulink仿真模型文件进行实操学习,重点关注控制环路中PI参数的整定过程与谐振元件(如谐振电感、励磁电感、谐振电容)设计之间的强耦合关系,并通过主动调整输入电压、负载大小等工况条件,观察系统的启动过程、稳态性能和抗干扰能力,从而深刻掌握LLC变换器的非线性动态行为与控制规律。

WebGL之旅(三)VBO和多种图形绘制

gl.vertexAttribXX和gl.uniformXX函数,一次只能向shader中传递一个变量,要一次性向shader中传递多个数据就要用到顶点缓冲区对象(VBO)。一 VBOVBO使用步骤: 创建缓冲区对象(gl.createBuffer()); 绑定缓冲区对象(gl.bindBuffer()); 将数据写入缓冲区(gl.bufferData()); 将缓冲区对象分

寒风的技术博客 2973

考虑风光火储+需求响应+P2G多能源系统NSGA-II多目标优化调度(Matlab代码实现)

内容概要:本文针对包含风能、光伏、火电、储能系统、电力转气(P2G)及需求响应的多能源系统,提出了一种基于NSGA-II多目标优化算法的调度模型,并通过Matlab代码实现了仿真求解。该模型综合考虑了系统运行的经济性、环保性以及能源利用效率等多个优化目标,旨在实现多能源系统在复杂约束条件下的协调优化与高效调度。研究详细构建了各类能源单元的数学模型,阐述了P2G技术的工作机理与需求响应机制,建立了完整的多目标优化问题框架,并利用NSGA-II算法求解获得Pareto最优解集,为决策者提供了多样化、权衡明确的调度方案选择。; 适合人群:具备一定电力系统、能源系统或优化理论基础,熟悉Matlab编程与基本优化算法(如遗传算法)的科研人员、研究生及工程技术人员。; 使用场景及目标:① 掌握多能源系统集成建模方法,理解风光火储与P2G、需求响应的协同机制;② 学习NSGA-II等多目标进化算法在复杂工程优化问题中的应用流程与实现技巧;③ 获取可用于科研复现、课题研究或工程方案设计的Matlab代码参考与仿真框架。; 阅读建议:建议读者结合Matlab代码逐步理解模型构建与算法实现细节,重点关注目标函数设计、约束条件处理及Pareto前沿的分析方法,有条件者可进一步扩展模型规模或引入新的优化算法进行对比研究。

WebGL - 七种基本图形的绘制

1、七种基本绘制方式 通过gl.drawArrays(mode, girst,count)方法,可以绘制七种基本图形,如下表所示 基本图形 参数 描述 点 gl.POINTS 一系列的点,绘制在 v0 ,v1,v2.... 线段 gl.LINES 一系列单独的线段,绘制在(v0, v1),(v2,v3)...,若点个数使奇数,则最后一个点被忽略 线条 gl.LINE_STR...

ithanmang 7035

优快云首页 发布文章 优快云同步助手 有限元悬臂梁-含一维和二维多种单元类型研究(Matlab代码实现) 34 100 摘要:会在推荐、列表等场景外露,帮助读者快速了解内容,支持一键将

内容概要:本文针对无线传感器网络(WSN)中因节点能量受限而导致网络寿命缩短的问题,提出了一种改进型LEACH协议,旨在有效延长网络生命周期。该协议在传统LEACH协议基础上,通过优化簇头选举机制、均衡节点剩余能量分布、改进数据聚合与传输策略等方式,显著缓解了部分节点因过度负载而过早死亡的现象。文中系统阐述了改进协议的设计原理、算法流程及关键参数设置,并基于Matlab平台构建仿真环境,通过与原始LEACH协议的对比实验,验证了该改进方案在延长网络生存时间、提升能量利用效率和增强数据传输稳定性方面的优越性能。; 适合人群:具备无线传感器网络基础知识和Matlab编程能力的高校研究生、科研人员以及从事物联网、边缘计算等相关领域技术研发的工程师。; 使用场景及目标:①作为教学案例用于讲授WSN路由协议设计与优化方法;②为实际物联网系统开发提供可借鉴的能量高效型通信协议解决方案;③支撑学术研究中对LEACH类协议性能评估与改进策略验证的需求,助力相关论文撰写与课题研究。; 阅读建议:建议读者结合文中的Matlab代码实现部分进行仿真实验,通过调整网络规模、节点分布、能量参数等变量,深入理解协议运行机制与性能影响因素,并可在现有基础上进一步探索引入分簇优化、多跳传输或机器学习辅助决策等高级改进策略。

matlab相机标定_实战 | 相机标定

点击“计算机视觉life”关注,置顶更快接收消息!本文阅读时间约5分钟什么是相机标定?我们为什么需要相机标定?相机标定就是确定相机内参和外参的过程,其结果精度会直接影响视觉系统后续工作的准确性。坐标系相机标定涉及到了四大坐标系,分别为:像素坐标系图像物理坐标系相机坐标系世界坐标系为了进行相机标定,必须已知世界坐标系中足够多的三维空间点坐标,找到这些空间点在图像中投影点的二维图像坐标,并建...

weixin_39747334的博客 765

WebGL绘制多个相同几何体

WebGL绘制多个几何体 本文是WebGL电子书的1.11节内容 利用WebGL重现三维场景的时候,往往不仅仅有一个几何体,比如像机器人是由多个子零件构成的装配体,可能同一个零件出现在不同的位置,可能两个零件的形状一样颜色不一样,也有颜色形状完全不同的零件。 阅读下面的讲解内容,一方面可以学习如何利用WebGL创建多几何体场景,同时借助实际的问题进一步加深对渲染管线这个硬件黑箱的认知,只有更好的认...

u014291990的博客 1301

OCS2 移动机械臂深度解析:ocs2_mobile_manipulator 与 ocs2_mobile_manipulator_ros 源码全拆解

摘要:本文深入解析OCS2移动机械臂MPC控制框架的两个核心工具包。ocs2_mobile_manipulator负责算法建模,通过MobileManipulatorInterface统一构建最优控制问题,支持4种机械臂模型并实现自动维度推导;ocs2_mobile_manipulator_ros负责ROS集成,包含MPC求解、虚拟跟踪等4个核心节点。文章详细剖析了工具包分工、最优控制建模架构(含动力学、代价约束设计)、ROS运行管线、参数配置映射,并提供了高效的源码阅读顺序建议,帮助开发者快速掌握移动机械

m0_73309445的博客 656

[WebGL入门]十六,绘制多个模型

这次操作的是模型坐标变换矩阵,介绍了重复利用VBO,视图和投影坐标变换矩阵,进行多个模型的绘制的方法。 绘制很多个简单的模型,图形的时候,像这次的做法一样,可以使处理变的简洁一些,避免写很多多余的代码。 这次的demo,HTML的代码和上一次是完全一样的,就是说,顶点着色器和片段着色器没有做任何调整。javascript代码有了一些变化,所以贴出所有代码。另外,在文章的最后面,添加了demo的链接,有支持WebGL的浏览器的话,可以直接打开链接看一下效果。

lufy小屋 1万+

机器学习实例(预测房价中位数)(附代码)

1、下载数据: 下载一个压缩文件housing.tgz即可,其包含housing.csv(已经包含书有数据。),用 tax xzf housing.tgz 来解压提取CSV文件。 import os import tarfile import urllib.request DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml2/master/" HOUSING_PATH = os.path.join("datasets",

qq_51153436的博客 2763

飞书多维表格+影刀RPA:我如何用3个指令搞定每周的销售数据自动汇总(附完整配置截图)

本文详细介绍了如何利用飞书多维表格和影刀RPA实现销售数据的自动化汇总,通过三个核心指令(建立链接、列出记录、更新记录)简化繁琐的手工操作。文章包含完整的配置截图和实战指南,帮助用户快速部署自动化流程,提升工作效率。

weixin_29273849的博客 286

WebGL学习系列-多边形绘制原理

前面学习了通过缓冲区对象来绘制多个点的原理,在实际的3D世界里,有好多复杂的模型,但细化分解后又是由一个个基础的几何图形构成的,掌握了基础图形的绘制才能够理解更加复杂的模型。本节将会讲解三角形,矩形以及利用三角函数绘制圆。

yanyan19880509的专栏 4531

ADS2020实战:村田电感.s2p与.mod文件导入全流程对比(附仿真结果差异分析)

本文详细对比了ADS2020中村田电感的.s2p与.mod文件导入流程及仿真结果差异,重点分析了两种模型在低频段和高频段的精度表现。通过实际案例展示.s2p文件在高频仿真中的优势,以及.mod文件在低频和非线性特性模拟中的准确性,为射频电路设计提供模型选择策略和混合仿真技巧。

weixin_29289821的博客 520
上一篇: WebGL笔记:绘制矩形面的几种方式以及封装封装多边形对象来绘制不同图形
下一篇: 数据结构与算法之字典: LeetCode 3. 无重复字符的最长子串 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Wang's Blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值