百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

HTML5 Canvas坐标变换

zhezhongyun 2025-01-08 18:39 49 浏览

我们在使用 Canvas 绘制图形时,可能会想对绘制的图形进行变换,例如让图形旋转90度,或者让图像缩小放大等,这些效果都可以通过 Canvas API 的坐标轴变换处理功能来实现。

图形旋转

如果我们要想将图形进行旋转,例如下面这张图片:


可以通过 rotate() 方法来实现这个效果,rotate() 方法用于旋转当前的绘图,带有一个参数 angle,表示旋转角度。旋转的中心点是坐标的原点,是以顺时针方向进行旋转,如果想要以逆时针方向来旋转,可以将参数设置为负数。

示例:

例如上图的实现代码如下所示:

<!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>HTML5学习(9xkd.com)</title>
        </head>
        <body>
            <canvas id="mycanvas" width="250px" height="150px" style="border: 1px solid #000;"></canvas>
            <script>
                var can = document.getElementById("mycanvas");
                var ctx = can.getContext("2d");
                ctx.fillStyle = "pink";  // 填充颜色
                ctx.rotate(20*Math.PI/180);
                ctx.fillRect(50, 30, 100, 50);
            </script>
        </body>
    </html>    

图形缩放

图形缩放可以使用 scale() 方法来实现,可以对图形进行放大或缩小设置。注意,这个函数有两个参数,第一个参数为水平方向的缩放倍数,第二个参数为垂直方向的缩放倍数。要将图形缩小,可以将参数值设置为0到1之间的小数,例如 0.5 表示将图形缩小一倍。或者也可以将参数值设置为百分数,例如 0.5=50%、1 = 100%、2=200% 等。

示例:

将图形放大一倍:

<!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>HTML5学习(9xkd.com)</title>
        </head>
        <body>
            <canvas id="mycanvas" width="250px" height="150px" style="border: 1px solid #000;"></canvas>
            <script>
                var can = document.getElementById("mycanvas");
                var ctx = can.getContext("2d");
                ctx.fillStyle = "pink";  // 填充颜色
                ctx.fillRect(50, 30, 100, 50);
                ctx.scale(1.5, 1.5);
                ctx.fillRect(50, 30, 100, 50);
            </script>
        </body>
    </html>    

在浏览器中的预览效果:


图形平移

移动图形可以通过 translate() 方法来实现,这个方法中的第一个参数表示将坐标轴向右边移动若干个单位,第二个参数表示将坐标轴圆点向下移动若干个单位。

示例:

将图形水平移动50px,向下移动50px:

<!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>HTML5学习(9xkd.com)</title>
        </head>
        <body>
            <canvas id="mycanvas" width="250px" height="150px" style="border: 1px solid #000;"></canvas>
            <script>
                var can = document.getElementById("mycanvas");
                var ctx = can.getContext("2d");
                ctx.fillStyle = "pink";  // 填充颜色
                ctx.fillRect(50, 30, 100, 50);
                ctx.translate(50, 50);
                ctx.fillRect(50, 30, 100, 50);
            </script>
        </body>
    </html>    

在浏览器中的预览效果:


小练习

我们通过上述学习的三个方法,来实现下图所示效果:


实现代码如下所示:

<!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>HTML5学习(9xkd.com)</title>
            <script>
                window.onload = function() {
                
                var can = document.getElementById("mycanvas");
                var ctx = can.getContext("2d");

                ctx.translate(200, 10); 
                ctx.fillStyle = "rgba(219,112,147, 0.7)"; 
                for(var i = 0; i < 50; i++){ 
                    ctx.translate(27, 27); 
                    ctx.scale(0.95, 0.95); 
                    ctx.rotate(Math.PI / 10); 
                    ctx.fillRect(0, 0, 90, 50); 
                }
            }     
            </script>
        </head>
        <body>
            <canvas id="mycanvas" width="400" height="300" style="border: 1px solid #000;"></canvas>

        </body>
    </html>    

总结

我们在绘制图形的时候,经常会用到上述几个方法来进行图形变化,需要注意的是,这个变化的不是画布,而是画布上的画进行变化。

查看更多可以点击链接:https://www.9xkd.com/

相关推荐

perl基础——循环控制_principle循环

在编程中,我们往往需要进行不同情况的判断,选择,重复操作。这些时候我们需要对简单语句来添加循环控制变量或者命令。if/unless我们需要在满足特定条件下再执行的语句,可以通过if/unle...

CHAPTER 2 The Antechamber of M de Treville 第二章 特雷维尔先生的前厅

CHAPTER1TheThreePresentsofD'ArtagnantheElderCHAPTER2TheAntechamber...

CHAPTER 5 The King&#39;S Musketeers and the Cardinal&#39;S Guards 第五章 国王的火枪手和红衣主教的卫士

CHAPTER3TheAudienceCHAPTER5TheKing'SMusketeersandtheCardinal'SGuard...

CHAPTER 3 The Audience 第三章 接见

CHAPTER3TheAudienceCHAPTER3TheAudience第三章接见M.DeTrévillewasatt...

别搞印象流!数据说明谁才是外线防守第一人!

来源:Reddit译者:@assholeeric编辑:伯伦WhoarethebestperimeterdefendersintheNBA?Here'sagraphofStea...

V-Day commemorations prove anti-China claims hollow

People'sLiberationArmyhonorguardstakepartinthemilitaryparademarkingthe80thanniversary...

EasyPoi使用_easypoi api

EasyPoi的主要特点:1.设计精巧,使用简单2.接口丰富,扩展简单3.默认值多,writelessdomore4.springmvc支持,web导出可以简单明了使用1.easypoi...

关于Oracle数据库12c 新特性总结_oracle数据库12514

概述今天主要简单介绍一下Oracle12c的一些新特性,仅供参考。参考:http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NEWFT...

【开发者成长】JAVA 线上故障排查完整套路!

线上故障主要会包括CPU、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题...

使用 Python 向多个地址发送电子邮件

在本文中,我们将演示如何使用Python编程语言向使用不同电子邮件地址的不同收件人发送电子邮件。具体来说,我们将向许多不同的人发送电子邮件。使用Python向多个地址发送电子邮件Python...

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

linux常用系统命令_linux操作系统常用命令

系统信息arch显示机器的处理器架构dmidecode-q显示硬件系统部件-(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性hdparm-tT/dev/s...

小白入门必知必会-PostgreSQL-15.2源码编译安装

一PostgreSQL编译安装1.1下载源码包在PostgreSQL官方主页https://www.postgresql.org/ftp/source/下载区选择所需格式的源码包下载。cd/we...

Linux操作系统之常用命令_linux系统常用命令详解

Linux操作系统一、常用命令1.系统(1)系统信息arch显示机器的处理器架构uname-m显示机器的处理器架构uname-r显示正在使用的内核版本dmidecode-q显示硬件系...

linux网络命名空间简介_linux 网络相关命令

此篇会以例子的方式介绍下linux网络命名空间。此例中会创建两个networknamespace:nsa、nsb,一个网桥bridge0,nsa、nsb中添加网络设备veth,网络设备间...