canvas基础路径(2)

摘要:
但javascript中的sin接收的是弧度而不是角度,因此我们需要将角度转换为弧度Math.sinx的正值。返回值介于-1.0和1.0之间;Math.cosx的余弦值。返回介于-1.0和1.0之间的数字;这两个函数中的X指的是“弧度”而不是“角度”。弧度的计算公式为:2*PI/360*角-˃PI/180*角;例如,30°角的弧度=2*PI/360*30。

1、canvas路径

canvas路径是指存以贝塞尔曲线为理论基础的区域绘制方式,绘制时产生的线条称为路径。路径由一个或多个直线段或者曲线组成,或者是经过精确计算画出的特殊图形,路径是canvas实现绘图的基础

1.1canvs绘图方法

canvas基础路径(2)第1张

 

1.2canvas绘制直线

1.2.1绘制一条直线

绘制直线时,一般会用到moveTo方法与lineTo两个方法,下面我们来看一下具体怎么样绘制一条直线

step1:获取canvas对象,并创建绘图环境

var mycanvas=document.getElementById('mycanvas'); //获取canvas对象
var context=mycanvas.getContext('2d');  //getContext会返回一个对象,这个对象封装了很多绘图的属性和方法

step2:设置直线的起点和终点

context.moveTo(0,0); //设置直线的起点
context.lineTo(100,100); //设置直线的终点

step3:绘制以定义的路径

context.stroke();  //开始绘制

效果预览:

canvas基础路径(2)第2张

1.2.2绘制多条相连的直线

var mycanvas=document.getElementById('mycanvas'); //获取canvas对象
var context=mycanvas.getContext('2d');  //getContext会返回一个对象,这个对象封装了很多绘图的属性和方法    
context.moveTo(0,0); //设置直线的起点
context.lineTo(100,100); //设置直线的终点
context.lineTo(200,100);
context.lineTo(300,350)
context.stroke();  //开始绘图

如果需要绘制多条连接的线只需要设置多个lineTo即可,lineTo的起点是上一条直线的终点

效果预览:

 canvas基础路径(2)第3张

1.2.3绘制多条跟上条线不相连的直线

var mycanvas=document.getElementById('mycanvas'); //获取canvas对象
var context=mycanvas.getContext('2d');  //getContext会返回一个对象,这个对象封装了很多绘图的属性和方法    
context.moveTo(0,0); //设置直线的起点
context.lineTo(100,100); //设置直线的终点
context.stroke();
                
context.beginPath(); //新开辟一块空间绘制            
context.moveTo(150,150);
context.lineTo(400,400);
context.lineTo(300,350)
context.closePath();
context.stroke();  //开始绘图

说明:

beginPath()会另外开辟一块空间重新绘制,新绘制的直线跟之前绘制的直线将没有联系

closePath()可以将两条线首尾相连,如下效果预览

canvas基础路径(2)第4张

1.2.4在canvas上绘制线条

                var mycanvas=document.getElementById('mycanvas'); //获取canvas对象
                var context=mycanvas.getContext('2d');  //getContext会返回一个对象,这个对象封装了很多绘图的属性和方法    
                mycanvas.onmousedown=function(e){
                    var beginx=e.layerX;
                    var beginy=e.layerY;
                    context.moveTo(beginx,beginx);
                    mycanvas.onmousemove=function(e){
                        var endx=e.layerX;
                        var endy=e.layerY;
                        context.lineTo(endx,endy);
                        context.stroke();
                    }
                    mycanvas.onmouseup=function(){
                        mycanvas.onmousemove=null;
                        mycanvas.onmouseup=null;
                    }
                }

效果预览:

canvas基础路径(2)第5张

 1.3利用路径绘制矩形

step1:封装一个绘制矩形的函数

function drawRect(x,y,w,h){
    context.beginPath();
    context.moveTo(x,y); 
    context.lineTo(x+w,y); //绘制第一条边
    context.lineTo(x+w,y+h);//绘制第二条边
    context.lineTo(x,y+h);//绘制第三条边
    context.closePath(); //将首尾相连
    context.stroke() //开始绘制
}

step2:执行绘制矩形函数

drawRect(50,50,100,100)

效果预览:

canvas基础路径(2)第6张

1.4利用路径绘制圆形

利用路径来绘制一个圆形,首先我们需要知道圆上的每一个点的坐标以及需要绘制的圆的半径,现在圆上每个点的角度以及半径都是我们已知的,我们如何计算出圆上每个点的坐标呢,接下来我们通过以下图示来说明:

canvas基础路径(2)第7张

图示中,a的角度是已知的,r也是已知的,我们知道,a点的横坐标即A边的长度,a点的纵坐标即B边的长度,这两个长度可以通过图示中的计算公式算出。

但是javascript中的sin接收的是一个弧度,而不是一个角度,所以接下来我们需要将角度转换为弧度

Math.sin(x)      x 的正玄值。返回值在 -1.0 到 1.0 之间;

Math.cos(x)    x 的余弦值。返回的是 -1.0 到 1.0 之间的数;

这两个函数中的X 都是指的“弧度”而非“角度”,弧度的计算公式为: 2*PI/360*角度——》PI/180*角度;

例如:30° 角度 的弧度 = 2*PI/360*30。接下来我们来看一下具体代码实现:

step1:封装一个绘制圆的函数

function drawCircle(x,y,r){  //x为圆的起点横坐标,y为圆的起点纵坐标,r为圆的半径
  context.beginPath();//新开辟一块空间绘制矩形
  for(var i=0;i<360;i++){  //因为圆的角度是360度,所以在此我们做个循环,圆的角度从0开始,到360度
    context.lineTo(x+r*Math.cos(i*Math.PI/180),y+r*Math.sin(i*Math.PI/180));  
    context.stroke();
  };                    
};

step2:调用已经封装好的方法,绘制一个圆

drawCircle(100,100,50)

step3:完整代码:

window.onload=function(){
  var mycanvas=document.getElementById('mycanvas'); //获取canvas对象
  var context=mycanvas.getContext('2d');  //getContext会返回一个对象,这个对象封装了很多绘图的属性和方法    
    function drawCircle(x,y,r){  //x为圆的起点横坐标,y为圆的起点纵坐标,r为圆的半径
    context.beginPath();//新开辟一块空间绘制矩形
    for(var i=0;i<360;i++){  //因为圆的角度是360度,所以在此我们做个循环,圆的角度从0开始,到360度
         context.lineTo(x+r*Math.cos(i*Math.PI/180),y+r*Math.sin(i*Math.PI/180));  
         context.stroke();
    };                    
  };          
  drawCircle(100,100,50)
};

效果预览:

canvas基础路径(2)第8张

 1.5路径(线条)的修饰

canvas基础路径(2)第9张

线条可以进行修饰,如下代码实现:

var mycanvas=document.getElementById('mycanvas'); //获取canvas对象
var context=mycanvas.getContext('2d');  //getContext会返回一个对象,这个对象封装了很多绘图的属性和方法    
context.lineWidth=15; //设置线条的宽度
context.lineCap='round'; //给线条的两端添加圆形线帽
context.moveTo(100,100);
context.lineTo(200,200);
context.stroke();

效果预览:

canvas基础路径(2)第10张

免责声明:文章转载自《canvas基础路径(2)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇带你由浅入深探索webpack4(一)ubuntu下如何检查nvidia显卡驱动是否安装OK?下篇

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

相关文章

浪漫桃心的Android表白程序

本文转载于  huachao1001的专栏 几年前,看到过有个牛人用HTML5绘制了浪漫的爱心表白动画。地址在这:浪漫程序员 HTML5爱心表白动画。发现原来程序员也是可以很浪……漫…..的。那么在Android怎么打造如此这个效果呢?参考了一下前面HTML5的算法,在Android中实现了类似的效果。先贴上最终效果图: 生成心形线 心形线的表达式可以参...

数据存储

iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3Core Data应用沙盒每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应用必须待在自己的沙盒里,其他应用不能访问该沙盒应用沙盒的文件系统目录,如下图所示(假设应...

关于D3D11,你必须了解的几件事情(二)

转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2011/08/12/%e5%85%b3%e4%ba%8ed3d11%ef%bc%8c%e4%bd%a0%e5%bf%85%e9%a1%bb%e4%ba%86%e8%a7%a3%e7%9a%84%e5%87%a0%e4%bb%b6%e4%ba%8b%e6%83%85...

spring mvc 的jpa JpaRepository数据层 访问方式汇总

本文转载:http://perfy315.iteye.com/blog/1460226和http://jishiweili.iteye.com/blog/2088265 AppleFramework在数据访问控制层采用了Spring Data作为这一层的解决方案,下面就对Spring Data相关知识作一个较为详细的描述。1.Spring Data所解决的...

Android 3.0 r1 API中文文档(107) —— AsyncPlayer

前言   本章内容是android.media.AsyncPlayer,版本为Android 3.0 r1!期待你一起参与Android API的翻译,联系我over140@gmail.com。 声明   欢迎转载,但请保留文章原始出处:)     博客园:http://www.cnblogs.com/     Android中文翻译组:http:/...

小程序加入echart 图表

github上的地址 https://github.com/ecomfe/echarts-for-weixin 复制到当前项目根目录下 添加展示bar图表例子的文件夹  index.json 中配置使用的组件,以及组件的位置 这一配置的作用是,允许我们在 pages/bar/index.wxml 中使用 <ec-canvas> 组件。注意路径...