Canvas坐标系转换

摘要:
默认坐标系和当前坐标系画布中的坐标从左上角开始,x轴沿水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸。然而,如果图像的每个绘制都指向一个固定点,那么它将缺乏灵活性,因此“当前坐标系”的概念被引入到画布中。所谓“当前坐标系”是指此时绘制图像的坐标系,它也将是图像状态的一部分。注意:以下上下文是从getContext获取的CanvasRenderingContext2D对象。
默认坐标系与当前坐标系

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

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

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

默认坐标系如下图所示:

Canvas坐标系转换第1张

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

Canvas坐标系转换第2张

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

Canvas坐标系转换第3张

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

Canvas坐标系转换第4张

矩阵变换transform

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

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

m11m21dx
m12m22dy
001

Canvas坐标系转换第5张

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

1 平移context.translate(dx,dy)

Canvas坐标系转换第6张

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)

Canvas坐标系转换第7张

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(θ)

Html5<wbr>Canvas<wbr>变换矩阵与坐标变形之间的关系(没事动手写写教程,有益身心健康,欢迎点评)

x’=x*cosθ-y*sinθ

y’=x*sinθ+y*cosθ

可以用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)替代。

免责声明:文章转载自《Canvas坐标系转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇集合与函数Spring boot和Spring cloud对应版本兼容问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

前端知识小总结2

(暂时撇开内容、样式、行为的分离) 一: 1-语义化及语义化标签 标签的语义化,是指在看到标签名的情况下基本能理解它所代表的含义,比较直观,便于浏览器的解析和阅读。 语义化的优点, (1)为了在没有css的情况下,页面也能呈现出很好地内容结构、代码结构(2)有利于用户体验(3)有利于SEO和搜索引擎建立良好的沟通。(4)方便其他设备解析以意义的方式来渲染网...

移花接木:借助 IViewLocationExpander 更换 ASP.NET Core View Component 视图路径

端午节在家将一个 asp.net 项目向 asp.net core 迁移时遇到了一个问题,用 view component 取代 Html.RenderAction 之后,运行时 view component 找不到视图文件。 System.InvalidOperationException: The view 'Components/AggSitePos...

使用numpy教你复习线性代数基础

楔子 下面我们来一起复习一下线性代数的基础知识,并同时使用numpy进行演示,所以需要你有一些关于numpy的知识(但不需要太多)。另外在线性代数中,存在行列式和矩阵,它们长得都差不多,都类似于二维表的格式。但是行列式要求其行数和列数必须相等,但是矩阵则没有此要求,而我们在创建在numpy中创建行列式和矩阵的时候均使用numpy.array这个函数,这个函...

机器学习笔记(6)-降维

机器学习笔记(6)-降维 这一节我们来讲降维算法,主要介绍下主成分分析(principle component analysis,PCA),介绍之前先简单复习下矩阵分解和方差、协方差等概念。 均值(mean) 描述的是样本集合的中间点,一般所谓的数据中心化就是样本值减去均值。 [ar x=frac{sum_{i=1}^{n}x_{i}}{n} ] 方差...

Android中对内存和外存的读写

首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。 public void save(){try {FileOutputStream outStream=this.openFileOutput(“a.txt”,Contex...

html2canvas + jsPDF 导出PDF,解决一半文字在上一页一半文字在下一页的问题

html页面转pdf下载 两个js文件可供使用,地址如下: https://github.com/linwalker/render-html-to-pdf 唯一的缺点是图片跨页不好解决,最终的pdf文件如下:   解决下载pdf文件背景是黑色的问题,将div添加背景色为白色,未解决图片跨页问题,解决思路: 通过控制页面html页面元素,控制元素位置,当...