Canvas——坐标系和矩阵的理解

简介: 前言最近一直在寻找可视化文章发现没有合适的,恰好有个粉丝问了坐标系就和大家讲一下, 文字不多,内容比较简单,看完应该就能理解canvas的坐标系和getTransform 的 6 个参数什么意思哈, 后面还有一篇「Rbush」正在奋笔疾书✍️中,关于空间中如何快速搜索🔍百万或者是数十万个点的,敬请期待哈!坐标系canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸。左上角坐标为x=0,y=0的点称作原点。在默认坐标系中,每一个点的坐标都是直接映射到一个CSS像素上。但是如果图像的每次绘制都参考一个固定点将缺少灵活性,于是在canvas中引

前言



最近一直在寻找可视化文章发现没有合适的,恰好有个粉丝问了坐标系就和大家讲一下, 文字不多,内容比较简单,看完应该就能理解canvas的坐标系和getTransform 的 6 个参数什么意思哈, 后面还有一篇「Rbush」正在奋笔疾书✍️中,关于空间中如何快速搜索🔍百万或者是数十万个点的,敬请期待哈!


坐标系



canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸。左上角坐标为x=0,y=0的点称作原点。在默认坐标系中,每一个点的坐标都是直接映射到一个CSS像素上。


但是如果图像的每次绘制都参考一个固定点将缺少灵活性,于是在canvas中引入“当前坐标系”的概念,所谓“当前坐标系”即指图像在此时绘制的时候所参考的坐标系,它也会作为图像状态的一部分。比如rotate旋转操作,改变当前坐标系也就是改变了rotate的参考点,试想下如果没有当前坐标系的概念,无论是旋转,缩放,倾斜等操作不就只能参考画布左上角原点了吗。


注:以下的context均为 getContext("2d")所得的CanvasRenderingContext2D对象。

默认坐标系如下图所示:


image.png

默认坐标系


\1. 如果调用context.translate(100,50),当前坐标系与默认坐标系相对位置如下图

image.png


偏移


\2. 如果调用context.scale(2,2),当前坐标系与原默认坐标系的刻度如下,红色代表当前坐标系


image.png缩放

\3. 如果调用context.rotate(Math.PI/6)顺时针旋转30度,当前坐标系与默认坐标系相对位置如下图

image.png


旋转


矩阵变换transform



上文提到的坐标变形的三种方式,平移translate,缩放scale以及旋转rotate都可以通过transform做到。


现在我们先来看看矩阵变换的定义:Context.transform(m11,m12,m21,m22,dx,dy),该方法使用一个新的变化矩阵与当前变换矩阵进行乘法运算。


m11 m21 dx
m12 m22 dy
0 0 1


image.png

img


也就是说假设A(x,y)要变换成B(x’,y’)可以通过乘以上述矩阵即可得到。

「1 平移context.translate(dx,dy)」


image.png


image-20210719201636718


x’=x+dx


y’=y+dy


可以使用context.transform (1,0,0,1,dx,dy)代替context.translate(dx,dy)。

也可以使用context.transform(0,1,1,0.dx,dy)代替。


「2 缩放context.scale(sx, sy)」


image.png


image-20210719201625367


x’=sx*x


y’=sy*y


(其中,sx 和sy分别表示在x轴和y轴上的缩放倍数)


可以使用context.transform(sx,0,0,sy,0,0)代替context.scale(sx, sy);


也可以使用context.transform (0,sy,sx,0, 0,0)代替;


「3 旋转context.rotate(θ)」


image.png


image-20210719201550685


x’=xcosθ-ysinθ


y’=xsinθ+ycosθ


可以用context.transform(Math.cos(θMath.PI/180),Math.sin(θMath.PI/180),-Math.sin(θMath.PI/180),Math.cos(θMath.PI/180),0,0)替代context.rotate(θ)。


也可以使用context.transform(-Math.sin(θMath.PI/180),Math.cos(θMath.PI/180),Math.cos(θMath.PI/180),Math.sin(θMath.PI/180), 0,0)替代。

相关文章
|
10月前
|
缓存 Windows
文件剪切到一半取消了能找到吗?这样恢复文件试试
在日常电脑操作中,剪切文件时若因误操作或系统卡顿中途取消,可能导致文件“丢失”。本文详解剪切原理及不同场景下文件去向,并提供多种找回方法,包括检查原文件夹、搜索临时缓存、使用数据恢复工具等,助你避免误删风险,关键时刻挽回重要资料。
|
12月前
|
前端开发 数据可视化 Java
Android用Canvas画一个折线图,并加以简单封装
本文介绍了如何用Java绘制动态折线图,从固定折线图的实现到封装成可复用的组件。首先通过绘制XY坐标轴、添加坐标标签和绘制折线及数据点完成基础折线图。接着,将静态数据替换为动态输入,支持自定义X轴、Y轴和折线数据。代码中包含关键方法如`drawDaxes`(绘制坐标轴)、`drawAxispoint`(绘制坐标点)和`drawbrokenLine`(绘制折线)。最终实现可根据传入数据动态生成折线图,适用于Android开发中的数据可视化场景。
409 0
|
前端开发 JavaScript API
前端性能优化-控制并发
【9月更文挑战第7天】前端性能优化-控制并发
423 1
|
存储 前端开发 JavaScript
JavaScript 并发任务控制
【8月更文挑战第31天】JavaScript 并发任务控制
446 2
|
前端开发 API
(WEB前端编辑DWG)在线CAD如何实现图形识别功能
mxcad 提供的图形识别功能可帮助用户快速识别和提取 CAD 图纸中的各种图形,如直线、多段线、弧线、圆及图块,显著提升设计效率。此功能不仅适用于图形分类,还能进行数量统计和快速定位,减少手动操作。用户可通过 API 进行二次开发,自定义识别逻辑。具体步骤包括打开在线示例、选择识别功能、设置识别参数并开始识别。更多开发文档请关注公众号:梦想云图网页 CAD。
|
人工智能 数据库 Python
LangChain之各类提示模板的使用
语言模型的提示是用户提供的一组指令或输入,用于指导模型的响应,帮助模型理解上下文并生成相关且连贯的基于语言的输出,例如回答问题、完成句子或参与某项活动、对话。
959 2
|
数据可视化 IDE 数据挖掘
揭秘Conda:Python开发者必备的包管理神器
揭秘Conda:Python开发者必备的包管理神器
432 1
|
存储 开发框架 前端开发
ABP开发框架中分页查询排序的实现处理
ABP开发框架中分页查询排序的实现处理
vant-函数式组件用法
vant-函数式组件用法
360 0
|
存储 JavaScript API
Vue 3实现的移动端两指控制图片缩放功能
Vue 3实现的移动端两指控制图片缩放功能
1313 0