[js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API

我们接着上文[js高手之路] html5 canvas系列教程 - 认识canvas以及基本使用方法继续.

一、直线的绘制

cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点

cxt.lineTo( x2, y2 ):将画笔从起点开始画直线,一直画到终点坐标( x2, y2 )

cxt.stroke();用画笔连线,moveTo,lineTo并不会产生实际的线条

x1,y1,x2,y2是点的坐标,canvas的坐标原点在canvas的左上角.

画一根直线:

 1 <style>
 2     body {
 3         background:#000;
 4     }
 5     #canvas {
 6         background:white;
 7     }
 8 </style>
 9 <script>
10     window.onload = function(){
11         var oCanvas = document.querySelector( "#canvas" ),
12             oGc = oCanvas.getContext( '2d' );
13         oGc.moveTo( 50, 50 );
14         oGc.lineTo( 250, 50 );
15         oGc.stroke();
16     }
17 </script>
18 </head>
19 <body>
20 <canvas id="canvas"></canvas>
21 </body>

如果把stroke注释了,是不会出现线条的,stoke的作用就是用来将点连起来

通过2个实例来区分,moveTo与lineTo的区别

 1 <style>
 2     body {
 3         background:#000;
 4     }
 5     #canvas {
 6         background:white;
 7     }
 8 </style>
 9 <script>
10     window.onload = function(){
11         var oCanvas = document.querySelector( "#canvas" ),
12             oGc = oCanvas.getContext( '2d' );
13         oGc.moveTo( 50, 50 );
14         oGc.lineTo( 250, 50 );
15         oGc.moveTo( 50, 200 );
16         oGc.lineTo( 250, 200 );
17         oGc.stroke();
18 
19         oGc.moveTo( 300, 50 );
20         oGc.lineTo( 500, 50 );
21         oGc.lineTo( 300, 200 );
22         oGc.lineTo( 500, 200 );
23         oGc.stroke();
24     }
25 </script>
26 </head>
27 <body>
28 <canvas id="canvas" width="600" height="400"></canvas>
29 </body>

左右两边的线形图,代码就一点区别,左边图形是第二个点用了lineTo, 第三个点用了moveTo, 右边图形第二个点用了lineTo,第三个点还是lineTo,从图中你应该能感受到这两个方法的区别吧?

 画三角形

 1 <style>
 2     body {
 3         background:#000;
 4     }
 5     #canvas {
 6         background:white;
 7     }
 8 </style>
 9 <script>
10     window.onload = function(){
11         var oCanvas = document.querySelector( "#canvas" ),
12             oGc = oCanvas.getContext( '2d' );
13 
14         oGc.moveTo( 50, 50 );
15         oGc.lineTo( 450, 50 ); 
16         oGc.lineTo( 450, 300 );
17         oGc.lineTo( 50, 50 );
18         oGc.stroke();
19     }
20 </script>
21 </head>
22 <body>
23 <canvas id="canvas" width="600" height="400"></canvas>
24 </body>

把上面的代码,稍微修改下,就能画出一个矩形了

 1 <style>
 2     body {
 3         background:#000;
 4     }
 5     #canvas {
 6         background:white;
 7     }
 8 </style>
 9 <script>
10     window.onload = function(){
11         var oCanvas = document.querySelector( "#canvas" ),
12             oGc = oCanvas.getContext( '2d' );
13 
14         oGc.moveTo( 50, 50 );
15         oGc.lineTo( 450, 50 ); 
16         oGc.lineTo( 450, 300 );
17         oGc.lineTo( 50, 300 );
18         oGc.lineTo( 50, 50 );
19         oGc.stroke();
20     }
21 </script>
22 </head>
23 <body>
24 <canvas id="canvas" width="600" height="400"></canvas>
25 </body>

二,canvas提供了画矩形的API

 通过线条我们也能拼接出一个矩形,但是代码太多,每个点都要把握,显得比较麻烦,canvas为我们提供了画矩形的API,有两种,一种是描边矩形,一种是填充矩形.

cxt.strokeStyle = 属性值

cxt.strokeRect( x, y, width, height )

strokeStyle后面的属性是为了修饰线条的,主要包括( 颜色值,渐变色,图案 ),颜色支持英文单词,十六进制,RGB, RGBA格式的颜色设置.

strokeRect: x, y为矩形的左上角坐标,width和height为矩形的宽度和高度

 1     <script>
 2         window.onload = function(){
 3             var oCanvas = document.querySelector( "#canvas" ),
 4                 oGc = oCanvas.getContext( '2d' );
 5     
 6             oGc.strokeStyle = '#09f';
 7             oGc.strokeRect( 50, 50, 500, 300 );
 8         }
 9     </script>
10     </head>
11     <body>
12     <canvas id="canvas" width="600" height="400"></canvas>
13     </body>

注意:oGc.strokeStyle = '#09f'; 如果把这句代码放在oGc.strokeRect( 50, 50, 500, 300 );的后面,那么设置的线条样式将不会生效,strokeStyle一定要在画图之前设置,否则是不会应用到的

 填充矩形API

 cxt.fillStyle = 属性值;

cxt.fillRect( x, y, width, height );

跟上面是一样的,只是把stoke换成了fill,fill就是填充的意思

画一个带有透明度的矩形:

 1 <script>
 2     window.onload = function(){
 3         var oCanvas = document.querySelector( "#canvas" ),
 4             oGc = oCanvas.getContext( '2d' );
 5 
 6         oGc.fillStyle = 'rgba( 255, 0, 0, 0.3 )';
 7         oGc.fillRect( 50, 50, 500, 300 );
 8     }
 9 </script>
10 </head>
11 <body>
12 <canvas id="canvas" width="600" height="400"></canvas>
13 </body>

另一种绘制矩形的API:cxt.rect( x, y, width, height );

他与strokeRect和fillRect有什么区别呢?

1,共同点:参数的意思相同

2,不同点,调用strokeRect和fillRect会立即绘制出矩形,而rect并不会,他需要调用stoke()或者fill()方法,才能把矩形绘制出来

 1 <script>
 2     window.onload = function(){
 3         var oCanvas = document.querySelector( "#canvas" ),
 4             oGc = oCanvas.getContext( '2d' );
 5 
 6         oGc.fillStyle = 'rgba( 255, 0, 0, 0.3 )';
 7         oGc.rect( 50, 50, 500, 300 );
 8         // oGc.stroke();
 9         oGc.fill(); 
10     }
11 </script>
12 </head>
13 <body>
14 <canvas id="canvas" width="600" height="400"></canvas>
15 </body>

清空矩形API:cxt.clearRect( x, y, width, height ); 参数跟strokeRect,fillRect意思一样

 1 <script>
 2     window.onload = function(){
 3         var oCanvas = document.querySelector( "#canvas" ),
 4             oGc = oCanvas.getContext( '2d' );
 5 
 6         oGc.fillStyle = 'rgba( 255, 0, 0, 0.3 )';
 7         oGc.fillRect( 50, 50, 500, 300 );
 8 
 9         oGc.clearRect( 100, 100, 200, 200 );
10     }
11 </script>
12 </head>
13 <body>
14 <canvas id="canvas" width="600" height="400"></canvas>
15 </body>

 

用fillRect和clearRect画一个加号,当然你可以用moveTo和lineTo,不过代码应该比这种方法多了不少.

 1 <script>
 2     window.onload = function(){
 3         var oCanvas = document.querySelector( "#canvas" ),
 4             oGc = oCanvas.getContext( '2d' );
 5 
 6         oGc.fillStyle = 'rgba( 255, 0, 0, 0.3 )';
 7         oGc.fillRect( 100, 100, 200, 200 );
 8         oGc.clearRect( 100, 100, 50, 50 );
 9         oGc.clearRect( 250, 100, 50, 50 );
10         oGc.clearRect( 250, 250, 50, 50 );
11         oGc.clearRect( 100, 250, 50, 50 );
12     }
13 </script>
14 </head>
15 <body>
16 <canvas id="canvas" width="400" height="400"></canvas>
17 </body>

绘制一个调色板:

 1 <style>
 2     body {
 3         background:#000;
 4     }
 5     #canvas {
 6         background:white;
 7     }
 8 </style>
 9 <script>
10     window.onload = function(){
11         var oCanvas = document.querySelector( "#canvas" ),
12             oGc = oCanvas.getContext( '2d' ),
13             aColor = [ '00', '33', '66', '99', 'cc', 'ff' ],
14             aMiddle = [ 'ff', 'cc', '99', '66', '33', '00' ], count = 0;
15         for( var i = 0; i < 12; i++ ){
16             for( var j = 0; j < 18; j++ ){
17                 count++;
18                 if ( i < 6 && count < 6 && j < 6 )
19                     oGc.fillStyle = `#${aColor[i]}${aMiddle[0]}${aColor[j]}`;
20                 else if( i < 6 && count < 12 && j < 12 )
21                     oGc.fillStyle = `#${aColor[i]}${aMiddle[1]}${aColor[j-6]}`;
22                 else if ( i < 6 && count < 18 && j < 18 )
23                     oGc.fillStyle = `#${aColor[i]}${aMiddle[2]}${aColor[j-12]}`;
24                 else if ( count < 6 && j < 6 )
25                     oGc.fillStyle = `#${aColor[i-6]}${aMiddle[3]}${aColor[j]}`;
26                 else if ( count < 12 && j < 12 )
27                     oGc.fillStyle = `#${aColor[i-6]}${aMiddle[4]}${aColor[j-6]}`;
28                 else if ( count < 18 && j < 18 )
29                     oGc.fillStyle = `#${aColor[i-6]}${aMiddle[5]}${aColor[j-12]}`;
30                 oGc.fillRect( j * 40, i * 40, 40, 40 );
31             }
32             count = 0;
33         }
34     }
35 </script>
36 </head>
37 <body>
38 <canvas id="canvas" width="720" height="720"></canvas>
39 </body>

javascript原生实现调色板:

 1         var aColor = [ '00', '33', '66', '99', 'cc', 'ff' ],
 2             aMiddle = [ 'ff', 'cc', '99', '66', '33','00' ];
 3 
 4         document.write( "<table>" );
 5         for( var i = 0; i < 12; i++ ){
 6             document.write( "<tr>" );
 7             for( var j = 0 ; j < 18; j++ ) {
 8                 if ( i < 6 && j < 6 ) //前6行,左6列
 9                     document.write( "<td style='background-color:#" + aColor[i]+ aMiddle[0] + aColor[j] + "'>&nbsp;</td>" );
10                 else if ( i < 6 && j < 12 ){ //前6行 中间6列
11                     document.write( "<td style='background-color:#" + aColor[i]+ aMiddle[1] + aColor[j-6] + "'>&nbsp;</td>" );
12                 }else if ( i < 6 && j < 18 ){ //前6行, 后面6列
13                     document.write( "<td style='background-color:#" + aColor[i]+ aMiddle[2] + aColor[j-12] + "'>&nbsp;</td>" );
14                 }else if ( i < 12 && j < 6 ){ //后6行, 左6列
15                     document.write( "<td style='background-color:#" + aColor[i-6]+ aMiddle[3] + aColor[j] + "'>&nbsp;</td>" );
16                 }else if ( i < 12 && j < 12 ){ //后6行, 中6列
17                     document.write( "<td style='background-color:#" + aColor[i-6]+ aMiddle[4] + aColor[j-6] + "'>&nbsp;</td>" );
18                 }else if ( i < 12 && j < 18 ){ //后6行, 后6列
19                     document.write( "<td style='background-color:#" + aColor[i-6]+ aMiddle[5] + aColor[j-12] + "'>&nbsp;</td>" );
20                 }
21             }
22             document.write( "</tr>" );
23         }
24         document.write( "</table>" );

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金矿问题

Description: 描述&#xff1a; This is a standard interview problem featured in interview coding rounds of Amazon, Flipkart. 这是亚马逊Flipkart的采访编码回合中的标准采访问题。 Problem statement: 问题陈述&#xff1a; Given a gold mine of n*m dimensions, e…

cesium广告牌_公路广告牌

cesium广告牌Description: 描述&#xff1a; This is a standard dynamic programing problem of finding maximum profits with some constraints. This can be featured in any interview coding rounds. 这是在某些约束条件下找到最大利润的标准动态编程问题。 这可以在任何…

【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验

实验现象&#xff1a; 核心代码&#xff1a; int main(void) {/* USER CODE BEGIN 1 */int i;int address,data;char error_flag 0;char receive_data[50];char buffer[8];char *p;/* USER CODE END 1 *//* MCU Configuration-----------------------------------------------…

laravel 项目迁移_在Laravel迁移

laravel 项目迁移Before moving forward we need to know some facts about it, 在继续前进之前&#xff0c;我们需要了解一些事实&#xff0c; Resources: In these directories, we have already a js, lang, sass and view page. Where, sass and js file holf their uncom…

[AtCoder-ARC073F]Many Moves

题目大意&#xff1a;   有一排n个格子和2枚硬币。   现在有q次任务&#xff0c;每一次要你把其中一枚硬币移到x的位置上&#xff0c;移动1格的代价是1。   两枚硬币不能同时移动&#xff0c;任务必须按次序完成。   现在告诉你两枚硬币初始状态所在的位置a和b&#xf…

OpenStack —— DevStack一键自动化安装

一、DevStack介绍Devstack目前是支持Ubuntu16.04和CentOS 7&#xff0c;而且Devstack官方建议使用Ubuntu16.04&#xff0c;所以我们使用Ubuntu 16.04进行安装。默认无论是Devstack和OpenStack&#xff0c;都是采用Master的代码进行安装&#xff0c;这样经常会出现&#xff0c;今…

Scala铸造

Scala中的类型 (Types in Scala) Type also know as data type tells the compiler about the type of data that is used by the programmer. For example, if we initialize a value or variable as an integer the compiler will free up 4 bytes of memory space and it wi…

OpenCV探索之路(二十五):制作简易的图像标注小工具

搞图像深度学习的童鞋一定碰过图像数据标注的东西&#xff0c;当我们训练网络时需要训练集数据&#xff0c;但在网上又没有找到自己想要的数据集&#xff0c;这时候就考虑自己制作自己的数据集了&#xff0c;这时就需要对图像进行标注。图像标注是件很枯燥又很费人力物力的一件…

图论 弦_混乱的弦

图论 弦Problem statement: 问题陈述&#xff1a; You are provided an input string S and the string "includehelp". You need to figure out all possible subsequences "includehelp" in the string S? Find out the number of ways in which the s…

「原创」从马云、马化腾、李彦宏的对话,看出三人智慧差在哪里?

在今年中国IT领袖峰会上&#xff0c;马云、马化腾、李彦宏第一次单独合影&#xff0c;同框画面可以说很难得了。BAT关心的走势一直是同行们竞相捕捉的热点&#xff0c;所以三位大Boss在这次大会上关于人工智能的见解&#xff0c;也受到广泛关注与多方解读。马云认为机器比人聪明…

字符串矩阵转换成长字符串_字符串矩阵

字符串矩阵转换成长字符串Description: 描述&#xff1a; In this article, we are going to see how backtracking can be used to solve following problems? 在本文中&#xff0c;我们将看到如何使用回溯来解决以下问题&#xff1f; Problem statement: 问题陈述&#xf…

java awt 按钮响应_Java AWT按钮

java awt 按钮响应The Button class is used to implement a GUI push button. It has a label and generates an event, whenever it is clicked. As mentioned in previous sections, it extends the Component class and implements the Accessible interface. Button类用于…

qgis在地图上画导航线_在Laravel中的航线

qgis在地图上画导航线For further process we need to know something about it, 为了进一步处理&#xff0c;我们需要了解一些有关它的信息&#xff0c; The route is a core part in Laravel because it maps the controller for sending a request which is automatically …

Logistic回归和SVM的异同

这个问题在最近面试的时候被问了几次&#xff0c;让谈一下Logistic回归&#xff08;以下简称LR&#xff09;和SVM的异同。由于之前没有对比分析过&#xff0c;而且不知道从哪个角度去分析&#xff0c;一时语塞&#xff0c;只能不知为不知。 现在对这二者做一个对比分析&#xf…

构建安全网络 比格云全系云产品30天内5折购

一年之计在于春&#xff0c;每年的三、四月&#xff0c;都是个人创业最佳的起步阶段&#xff0c;也是企业采购最火热的时期。为了降低用户的上云成本&#xff0c;让大家能无门槛享受到优质高性能的云服务&#xff0c;比格云从3月16日起&#xff0c;将上线“充值30天内&#xff…

数据结构 基础知识

一。逻辑结构: 是指数据对象中数据 素之间的相互关系。 其实这也是我 今后最需要关注的问题 逻辑结构分为以 四种1. 集合结构 2.线性结构 3.数形结构 4&#xff0c;图形结构 二。物理结构&#xff1a; 1&#xff0c;顺序存储结,2 2. 链式存储结构 一&#xff0c;时间复杂…

ruby 变量类中范围_Ruby中的类

ruby 变量类中范围Ruby类 (Ruby Classes) In the actual world, we have many objects which belong to the same category. For instance, I am working on my laptop and this laptop is one of those laptops which exist around the globe. So, this laptop is an object o…

以云计算的名义 驻云科技牵手阿里云

本文讲的是以云计算的名义 驻云科技牵手阿里云一次三个公司的牵手 可能会改变无数企业的命运 2017年4月17日&#xff0c;对于很多人来说可能只是个平常的工作日&#xff0c;但是对于国内无数的企业来说却可能是个会改变企业命运的日。驻云科技联合国内云服务提供商阿里云及国外…

浏览器端已支持 ES6 规范(包括 export import)

当然&#xff0c;是几个比较优秀的浏览器&#xff0c;既然是优秀的浏览器&#xff0c;大家肯定知道是那几款啦&#xff0c;我就不列举了&#xff0c;我用的是 chrome。 对 script 声明 type 为 module 后就可以享受 es6 规范所带来的模块快感了。 基础语法既然是全支持&#xf…

一文读懂深度学习框架下的目标检测(附数据集)

从简单的图像分类到3D位置估算&#xff0c;在机器视觉领域里从来都不乏有趣的问题。其中我们最感兴趣的问题之一就是目标检测。 如同其他的机器视觉问题一样&#xff0c;目标检测目前为止还没有公认最好的解决方法。在了解目标检测之前&#xff0c;让我们先快速地了解一下这个领…