【绘制】HTML5 Canvas坐标变换——坐标系的平

网络 分享 时间: 收藏本文

【绘制】HTML5 Canvas坐标变换——坐标系的平

我的处女作《系列教程》在我的上正在连载更新,希望能得到您的关注和支持,让我有更多的动力进行创作。

教程介绍、教程目录等能在里查阅。

传送门:

引入

有时候,换种思路是可以简化问题的。

比如,当我们要在画布中心绘制n个几何图形时:

其实这里,我们就简化了中心点为(0,0),但极大地简化了在绘制其他图形时所需要的计算了。

介绍

在的绘图环境中,提供了坐标系的平移、缩放和旋转的方法。

xt2D对象中旋转、缩放和平移坐标系的方法 方法描述

( )

按照给定的弧度旋转坐标系。(注意,π弧度等于180角度)

( x, y)

在X和Y方向上分别按照给定的数值进行缩放坐标系

( x, y)

将坐标系平移到给定的X、Y坐标处

为了更加形象地理解,我们以绘制坐标轴的小节为基础,分别演示旋转、缩放和平移。为了演示方便,我们为下面变更的标签添加了黑色边框。

旋转

只传入顺时针旋转的弧度,如π/8就是22.5度。在初始化之前,添加一句代码:

context.rotate(-Math.PI/8);

在线演示 详细代码

我们可以发现,实际上坐标轴的旋转其实就意为着整个坐标轴的旋转,因为后续路径的位置也都是根据坐标来判定的。

缩放

(2,2)就意味着横坐标和纵坐标都同时放大2倍。在初始化之前,添加一句代码:

context.scale(2,2);

在线演示 详细代码

这里的确按照我们想要的2倍放大了,但原点坐标被隐藏到了下面,如果此时我们想得到原点的图像,那么就需要我们配合平移来实现了。

平移

(30,30)意味着我们将坐标轴原点平移到了(30,30)的位置,换句话说,将整个画布图像沿着(0,0)到(30,30)方向移动了。在初始化之前,添加一句代码:

context.translate(30,30);

在线演示 详细代码

坐标轴被平移了,由于宽高限制,目前坐标轴只能展示出这个范围。

镜像

其实镜像的实现,并没有提供API,但可以通过实现镜像的效果。比如说,在绘制了某个图形后,可以调用(1,-1)来绘制水平镜像,或者调用(-1,1)来绘制垂直镜像。

在线演示 详细代码

这里就以画布的x=./2处为镜面实现镜像效果。

 drawGrid('lightgray', 10, 10);
    drawAxis();
    context.translate(canvas.width,0);
    context.scale(-1,1);
    drawAxis();

上面这段代码先调用了()绘制原坐标轴,再将原点平移到的右边界,然后调用(-1,1)按照原来的方法绘制坐标轴即可得到镜面图像。