Canvas 2D 图形变换

CANoe基础讲解01:从零开始使用CANoe轻松搭建你的第一个CAN网络 本文是一篇CANoe软件入门实操指南,逐步演示了如何从零创建并运行一个CAN FD仿真工程。内容包括:启动软件、配置硬件通道与网络、加载DBC数据库、使用CAPL编写仿真节点发送CAN报文,最终启动测量并在Trace窗口中查看通信结果。通过七个清晰步骤,帮助初学者快速掌握CANoe基本操作,完成首个可运行的仿真网络搭建 阅读详情

先说结论

图形变换没什么玄学。所有效果都是同一个套路:

save() 保存当前上下文 → 改一次变换 → 重画图形 → restore() 还原。

平移、旋转、缩放、矩阵变换,区别只在于中间那步调的是 translate、rotate、scale 还是 transform。想明白这一点,后面全是细节。

一、效果

一块紫色画布,上面一个黄色描边的 100×100 矩形,下面一排绿色按钮:

  • 平移:矩形整体往右下挪 75px,标题变成「平移图形」
  • 旋转:以坐标原点为中心顺时针转 15°,标题变成「旋转图形」
  • 缩放:水平和垂直都放大 2 倍,标题变成「缩放图形」
  • 矩阵变换:水平拉伸 1.25、倾斜 30°、垂直压缩到 0.5,再位移 (50, 50)
  • 还原:清空后重新画出初始矩形
  • 矩形叠加椭圆:先画一个转 30° 的椭圆,再把矩形压在它上面

每次点击都会先把画布清空,所以看到的永远是「一次变换后的结果」,不会越叠越乱。

二、先把画布立起来

新建小程序项目,不勾云服务、不勾模板。画布用新版 2D 类型,CSS 上给宽高,别在标签里写死像素:


<canvas type="2d" id="my-canvas" />


canvas {

width: 100%;

height: 700rpx;

background-color: rebeccapurple;

}

拿绘图上下文要用 createSelectorQuery,老式的 canvas-id 是拿不到 node 的:


const query = wx.createSelectorQuery()

query.select('#my-canvas')

.fields({ node: true, size: true })

.exec((res) => {

const canvas = res[0].node

const ctx = canvas.getContext('2d')

// 后面所有绘制都靠这个 ctx

})

三、三行代码解决高清屏发虚

这是最容易翻车的地方。canvas.width 是物理像素,CSS 里写的是逻辑像素,两者之间差一个设备像素比:


const dpr = wx.getWindowInfo().pixelRatio

canvas.width = width * dpr

canvas.height = height * dpr

ctx.scale(dpr, dpr)

前两行把画布的像素缓冲区放大,第三行把绘图坐标系缩回来。少了 ctx.scale 这一步,图形会缩在左上角;少了前两行,图形边缘就会糊。

四、五个按钮,其实是一个函数

以平移为例:


translate() {

const ctx = this.ctx

ctx.save() // 保存现场

this.clear() // 清空画布

ctx.translate(75, 75) // 坐标原点右移下移

this.drawing() // 重画矩形

ctx.restore() // 恢复现场

this.setData({ title: '平移图形' })

}

剩下三个换成对应的变换即可:ctx.rotate(15 * Math.PI / 180)、ctx.scale(2, 2),以及矩阵变换:


// transform(a, b, c, d, e, f)

// a 水平缩放 | b 水平倾斜 | c 垂直倾斜 | d 垂直缩放 | e 水平位移 | f 垂直位移

ctx.transform(1.25, 30 * Math.PI / 180, 0, 0.5, 50, 50)

save 和 restore 一定要成对出现。它们包住的是「这次变换」,一旦漏掉 restore,变换会污染后面所有的绘制——你会看到第二次点击时图形跑到画布外面去。

清屏也别偷懒:


clear() {

const ctx = this.ctx

const canvas = this.canvas

ctx.clearRect(0, 0, canvas.width, canvas.height)

}

这里传的是 canvas.width(物理像素),不是 CSS 宽度。按物理像素清,才清得干净。

五、扩展一个「矩形叠加椭圆」

椭圆是这次扩展唯一的难点。Canvas 2D 有现成的 ellipse(),七个参数:


// ellipse(圆心x, 圆心y, 横半径, 纵半径, 旋转弧度, 起始角, 结束角)

ctx.beginPath()

ctx.ellipse(100, 105, 88, 58, 30 * Math.PI / 180, 0, 2 * Math.PI)

ctx.stroke()

ctx.strokeRect(50, 50, 100, 100) // 矩形叠在椭圆之上

三个要点,记住就不会画歪:

  1. 必须先 beginPath()。不调用它,椭圆会和上一次的路径连成一笔,描出来的线乱七八糟。
  1. 画完整的椭圆,起止角是 0 到 2 * Math.PI,不是 0 到 360。
  1. 旋转要传弧度,30 * Math.PI / 180 才是 30°。

椭圆画在下面、矩形画在上面,两者的描边颜色和线宽都一致,看起来就是「矩形叠加椭圆」的叠加效果。如果想让椭圆更扁一点,调小纵半径;想更倾斜,把旋转角加大。

六、踩过的三个坑

拼错的属性名。 课件里写的是 ctx.linewidth = 3,小写 w。这个属性根本不存在,赋值不会报错,只是静默失效,线宽一直是默认的 1 像素。正确的是 ctx.lineWidth,驼峰。

画布发虚。 只设 CSS 宽高、不设 canvas.width/height,在 iPhone 这种高倍屏上一定糊。开头那三行不能省。

变换残留。 中途 return 或者抛异常,restore 就漏了,下一次绘制会带着上一次的矩阵。写的时候把 save 和 restore 贴在一起写,中间再填内容,能少踩很多。

七、最后

整个工程一共 9 个文件,真正有逻辑的只有 pages/index/index.js 里那六个方法:drawing、clear、translate、rotate、scale、transform、reset、rectEllipse。wxml 和 wxss 负责排版,画布部分只有三行样式。

【吐血整理-历时两个月,长达万字】FDTD Solutions学习笔记 原教学视频来自于Ansys-Lumerical官方的FDTD100,所看视频来自B站大佬UP主 【Nestor_呐等】 的幸苦翻译,本文内容粘贴自我个人在学习FDTD100时,通过字幕和一些个人理解总结的一份word。整理不易,强烈建议收藏!... 阅读详情

相关推荐

HTTPS接口测试翻车实录:为什么浏览器能访问而curl报证书错误?

本文深入分析了HTTPS接口测试中浏览器访问正常而curl报证书错误的典型问题。通过对比浏览器、Postman和curl的工具行为差异,结合Nginx日志与Wireshark抓包,揭示了问题根源在于网络架构中HTTPS请求被意外“降级”为HTTP传输,导致SSL握手失败。文章重点探讨了curl工具严格验证机制暴露的`Peer's Certificate issuer is not recognized`错误,并提供了网络配置修正方案与标准化测试流程。

u9v0w的博客 279

微信小程序 Canvas 2D 图形变换实践

变换方法会改变当前坐标系的变换矩阵,若不恢复,变换效果会累积到后续绘制中,导致每次点击后图形偏移越来越大、角度越来越乱。本次传入的参数中,水平与垂直方向的缩放系数不同,并带有倾斜与位移分量,因此绘制后的矩形呈现非等比缩放与倾斜的组合形态。每个变换方法遵循相同的结构:先保存上下文状态,再清空画布,然后执行变换并绘制基准图形,最后恢复上下文状态,并更新标题以反馈当前操作。旋转通过旋转方法实现,传入弧度值。矩阵变换通过变换方法实现,传入六个参数,构成一个二维变换矩阵,可同时实现缩放、倾斜、旋转与平移的组合效果。

2501_91034542的博客 299

RK3588多路MIPI摄像头采集与WiFi低延迟传输实战指南

本文详细介绍了基于RK3588平台实现多路MIPI摄像头同步采集并通过WiFi进行低延迟传输的完整实战方案。文章深入剖析了从V4L2驱动配置、多线程采集、环形缓冲区设计到UDP网络传输优化的核心技术,旨在帮助开发者在工业检测、智能安防等场景下构建高并发、高实时性的视频流系统,实现端到端延迟控制在100毫秒以内的目标。

tensor9flow的博客 788

微信小程序 Canvas 2D 图形变换:一块矩形,六种花样

Demo 里用的是前一种(绕原点转),视觉效果是矩形沿圆弧位移并倾斜,并不算错——它恰好能让人直观看到「旋转中心就是原点」这件事。

WGClover的博客 199

ORCA(动态避障)算法

A物体沿着向量v1和v2移动,刚好能和B擦肩而过,不会发生碰撞;若V1和V2的夹角再小一点的话就一定会发生碰撞。A的速度为V1,B的速度为V2,A对于B的相对速度(也就是我们把B看做静止,A的速度)就是V1-V2。,那么怎么判定A的速度向量是不是在碰撞区域内呢?这就需要用A相对于B的速度来判定。红线画出来的锥形区域就是A相对于B的。

u012861978的专栏 4769

模拟电子技术课设-压控信号发生器

正弦波产生电路的目的就是使电路产生一定频率和幅度的正弦波,我们一般在放大电路中引入正反馈,并创造条件,使其产生稳定可靠的振荡。由于图2.3-1所示电路中存在RC电路和积分电路两个延迟环节,在实用电路中,将它们“合二为一”,即去掉方波发生电路中的RC回路,使积分运算电路即作为延迟环节,又作为方变三角波电路,滯回比较器和积分运算电路的输出互为另一个电路的输入。接着对各单元电路的工作原理进行了分析,由直流稳压电源电路提供所需电压,文氏振荡器产生正弦波,滞回比较器产生方波,滞回比较器与积分器连接产生三角波。

Sulfurone的博客 5325

微信小程序 Canvas 2D 图形变换实战(含矩形叠加椭圆扩展)

画布模糊问题:一定要乘以设备像素比dpr进行二次缩放,否则在手机端会看到明显的锯齿。变换叠加问题:如果不使用ctx.save()和,每次点击变换按钮,坐标系都会在上一次的基础上再次改变,导致最终图形飞出画布。绘制椭圆的 API不需要像画圆那样通过改变缩放比例来实现,它是原生支持画椭圆的,通过radiusX和radiusY控制椭圆形状。通过本次实战,不仅掌握了微信小程序 Canvas 2D 的核心绘图 API,也加深了对二维图形学中矩阵变换原理的理解。

wyy1085的博客 112

PaddleOCR GPU部署:从环境配置到避坑实战指南

本文详细介绍了PaddleOCR GPU部署的全过程,从环境配置到避坑实战指南。通过分析常见的部署失败原因,提供硬件兼容性自查、软件环境精配方案以及路径配置的解决方案,帮助用户高效完成GPU加速的OCR任务部署,避免90%的常见错误。

weixin_30839881的博客 418

微信小程序Skyline Canvas2D图形变换案例(扩展:矩形叠加椭圆)

本实验基于微信小程序Skyline渲染模式,实现Canvas2D图形变换功能,包括平移、旋转、缩放、矩阵变换及矩形叠加椭圆的扩展效果。通过save()/restore()保持画布状态,正确处理dpr像素比避免模糊,重点规避中文横线导致的JSON解析错误。代码结构清晰,适合初学者理解2D绘图核心机制。

2401_87969726的博客 207

航测无人机las点云数据生成DEM

“ 做航测的同僚都知道,Pix4D或者CC(ContextCapture)都可以生成DSM,往往高程点提取以及土方计算都需要用到DEM,PhotoScan软件可以提出地面点并只应用地面点连接三角网,然而分类效果差,生成的DEM不管是平整度还是精度,都不理想。而传统等高线生DEM需要耗费较长时间,以下提供一种参考方法,供大家探讨。 ” 1 点云数据 航测类软件大多可以生成点云数据,如Pix4D,PhotoScan,CC等,此次点云数据为citymapper2相片基于CC生产的Las点云。 2 筛选地面点 筛.

qq_43173805的博客 1万+

Unity采样器过多导致URP默认的Lit.Shader报错(shader error in ‘universal render pipeline/lit’: maximum ps_4_0 samp)

Shader中多个Sample Texture2D,Sample Texture3D或者类似节点的使用,该类节点都需要一个采样器,如果Shader使用超过了16个纹理采样器,如多个Base Color,Normal Map等,就容易超出。是因为每种Shader Model和GPU都有一个对纹理采样器数量的限制,是因为每个采样器都需要在显卡占用一个独立的寄存器,而寄存器的数量是有限的,当超过限制,显卡无法分配更多的寄存器给新的采样器,因此会导致编译错误。2.什么原因导致纹理采样器超出16个?

qq_41884036的博客 4235

微信小程序 Canvas2D 图形变换实战|案例 5.3 平移 / 旋转 / 缩放 / 矩阵变换 + 扩展椭圆叠加

旋转</button><button type="primary" size="mini" bind:tap="scale">缩放

js1020473379的博客 144

Could not create cache adapter cache factory not found: factory for cache adapter ““ was not regist

RROR: Could not create cache adapter error=cache factory not found: factory for cache adapter "" was not registered ERROR: Job failed (system failure): Error response from daemon: OCI runtime create failed: container_linux.go:349: starting co...

知无涯 4034

# 微信小程序 Canvas 2D 图形变换实战:从平移旋转缩放到矩阵叠加(案例5.3 完整实现 + 扩展)

的六个变换 API,把「一个黄色矩形」玩出平移、旋转、缩放、矩阵变换四种效果,并在原案例基础上新增了「矩形叠加椭圆」的扩展功能。会同时放大坐标和线宽,所以矩形从 100×100 变成 200×200、线宽也变粗,右下角溢出画布——这正是案例截图里的效果。// 参数1:水平缩放 1.25,参数2:水平倾斜 30°,参数3:垂直倾斜 0,参数4:垂直缩放 0.5。| 矩形叠加椭圆(扩展) | 矩形与斜置椭圆交叉叠加,两条路径互不影响 |,让椭圆斜置穿过矩形四边,得到截图中的「交叉叠加」感;

Lu985520_的博客 231

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

微信小程序 Canvas 实现 2D 图形变换(平移 / 旋转 / 缩放 / 矩阵变换 + 拓展矩形叠加椭圆)

本文基于微信小程序Skyline渲染模式,通过Canvas2D API实现图形平移、旋转、缩放、矩阵变换及椭圆叠加等效果,重点讲解save()/restore()状态管理、坐标系变换与弧度转换等核心机制。结合实际代码,演示如何避免图形偏移、模糊等问题,适合初学者掌握小程序Canvas二维绘图基础原理与实践技巧。

ANGEL9970的博客 298

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

微信小程序案例 5.3:Canvas 2D 图形变换完整实现

平移坐标原点ctx.rotate(弧度):旋转坐标系:缩放坐标系:矩阵变换(一次完成缩放 + 倾斜 + 平移)ctx.save():保存 / 恢复绘图状态(防止变换累积)画椭圆,配合矩形叠加出效果图。

Ct010的博客 98

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

微信小程序 Canvas 2D 图形变换实战:平移、旋转、缩放与矩阵变换

Canvas 的图形变换本质上是在操作“坐标系”。掌握了translaterotatescale以及底层的transform矩阵,再配合save()与restore()的隔离机制,你就能像变魔术一样,用最基础的代码组合出千变万化的视觉效果。

lmhshje的博客 143

微信小程序 Canvas 2D 图形变换实战

上一篇写了文件操作,这篇来搞点"看得见"的——用微信小程序的 Canvas 2D 实现图形变换。平移、旋转、缩放、矩阵变换、图形还原,还有矩形叠加椭圆的组合绘制,一篇讲清楚。做完你能得到一个紫色画布,点按钮就能看图形动起来。

2603_96917245的博客 155

在canvas上绘制3d图形

项目简介 文章里有相当多的用到中学数学中的知识,推导3d的几何模型是如何绘制到2d平面中去的,最终利用推导出的结论编写代码,实现一个波纹的demo 项目地址:https://github.com/zz632893783/canvas-3d 安装项目依赖模块 npm install 运行项目 npm run dev 从z轴观察yz平面上的点 想象一下有这么一个三维空间(如图),有一个点B,我们从A点观察B点。那么B点在xy平面上的投影即AB的延长线与平面xy的交点C。..

Annanljz 7854

微信小程序 Canvas 图形变换实战:(案例 5.3 完整实现)

关键词:微信小程序、Canvas 2D、图形变换、矩阵变换、save restore、ellipse。

yu_1030的博客 303

微信小程序:Canvas 2D 图形变换与扩展

本文介绍了微信小程序中Canvas组件的图形绘制与变换实现,涵盖平移、旋转、缩放、矩阵变换及椭圆叠加等核心功能。通过wx.createSelectorQuery()获取画布实例,结合设备像素比(DPR)处理高清屏模糊问题,并利用ctx.save()与ctx.restore()避免变换状态污染。重点实现矩形与椭圆叠加效果,展示Canvas在复杂图形绘制中的强大能力,为小程序开发提供实用参考。

luner_aa的博客 194

2D/3D视图变换、canvas画布

3D视图变换、canvas画布

m0_59023231的博客 1331

手把手教你玩转Canvas 2D绘图(上篇)

通过这篇文章,你已经掌握了Canvas 2D绘图的核心技术:填充与描边、矩形绘制、路径绘制、文本绘制以及坐标变换。这些技术看似简单,但组合起来却能创造出无限可能的视觉效果。记住,Canvas的真正力量不在于单个方法,而在于它们的组合与应用。就像画家手中的画笔,熟练运用这些"笔触",你就能在网页上绘制出令人惊叹的图形。

JakeMa1024的博客 858

图形变换实验报告

本案例基于小程序Canvas 2D API,实现图形的平移、旋转、缩放与矩阵复合变换,并通过save()/restore()防止状态污染。扩展功能“矩形叠加椭圆”实现正方形与旋转椭圆的重叠绘制,直观展示坐标系变换对绘图的影响,强化对画布变换机制的理解。

2601_96878920的博客 132

微信小程序实战:Canvas图形变换与矩阵操作

本次实验全面练习了 Canvas 的图形变换 API,直观理解画布坐标系在图形渲染中的作用。ctx.save()和成对使用,是隔离图形变换状态、防止变换叠加的核心。扩展部分完成矩形叠加椭圆绘制,掌握ellipse椭圆API参数,理解开启新路径,解决图形之间多余连线问题。熟悉Canvas2D图形变换整套开发流程,理解矩阵变换底层原理,提升画布绘图代码健壮性。

2401_87969178的博客 220

微信小程序 canvas 图形变换实战——平移、旋转、缩放与矩阵变换

本文通过《图形变换》小程序,演示如何利用Canvas 2D的变换API实现矩形的平移、旋转、缩放及矩阵变换,并拓展叠加椭圆效果。核心原理是变换作用于坐标系而非图形本身,需遵循“保存—变换—绘制—恢复”流程以避免状态污染。文章强调清屏、弧度转换、缩放位移等关键细节,最终引导读者掌握坐标系操作,为实现动图、时钟指针等复杂视觉效果奠定基础。

Clease的博客 319
上一篇: 微信小程序 Canvas 2D 绘图实战:从圆、虚线到图片绘制
下一篇: 文件复制与删除功能实现
zcmdcsdn_
博客等级 码龄73天 0粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值