当前位置: 首页 > news >正文

HTML5 Canvas 练习及知识点分享之绘制圆及曲线(一)

2016-11-06

Canvas练习及学习笔记第二篇

首先,以下还是我学习了Canvas基础后的一些小练习,源代码大家可以访问我的Github: https://github.com/fanyear

 

 时钟  https://fanyear.github.io/Canvas/Clock/index.html

 (放大镜)鼠标左键   https://fanyear.github.io/Canvas/Magnifier/index.html

 缩放图像  https://fanyear.github.io/Canvas/ScaleImage/index.html

星星动画闪烁  https://fanyear.github.io/Canvas/StarTwinkling/index.html  

炫酷计时动画效果 https://fanyear.github.io/Canvas/Timer/index.html

 

推荐MOOC 教程  

1. http://www.imooc.com/u/108955/courses?sort=publish  (一系列教程 讲得很好 有条理)

2.http://www.imooc.com/learn/338 (星星闪烁教程)

 

以下是我的学习笔记,不算是教程,讲得不全面,是一些注意事项,更多是为了自己忘了的时候可以回来看看,希望说得不好或有错的,还望各位指教。

上一篇讲了绘制线条,矩形,渐变,图形变化以及设置各种属性,这篇将涉及绘制园,曲线的arc()以及arcTo()方法。

 

圆和曲线的绘制

  1、arc()

    arc()是HTML5 canvas的一个API函数,作用是“创建弧/曲线(用于创建圆形或部分圆)”。

    语法: context.arc(x,y,r,startAngle,endAngle,counterclockwise)

    参数值:

 

参数描述
x圆心x坐标
y圆心y坐标
r圆的半径
startAngle起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)
endAngle结束角,以弧度计。
counterclockwise可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。

 

    注意:

       1、无论是顺时针还是逆时针,默认角度位置都如图1-1所示,不改变。

       2、角度为弧度制。

    

图1-1

 

     实例:

      

图1-2

 1 var CANVASWIDTH = 800;
 2 var CANVASHEIGHT = 600;
 3 
 4 var canvas = document.getElementById("canvas");
 5 var context = canvas.getContext("2d");
 6 
 7 canvas.width = CANVASWIDTH;
 8 canvas.height = CANVASHEIGHT;
 9 
10 context.beginPath();
11 context.arc(400,300,200,0,2*Math.PI);
12 context.stroke();

 

      当然也可以用arc()来绘制曲线,只需改一改起始角和终止角就好了。

 

图1-3

      代码:

 1 var CANVASWIDTH = 800;
 2 var CANVASHEIGHT = 600;
 3 
 4 
 5 var canvas = document.getElementById("canvas");
 6 var context = canvas.getContext("2d");
 7 
 8 canvas.width = CANVASWIDTH;
 9 canvas.height = CANVASHEIGHT;
10 
11 
12 context.beginPath();
13 context.arc(400,300,200,0,Math.PI);      //改了终止角为PI
14 context.stroke();

 

  2、arcto()

    arcTo()方法还是和arc()不一样的,敲一敲代码就知道啦。arcTo() 方法在画布上创建介于两个切线之间的弧/曲线。

     语法:arcTo(x1,y1,x2,y2,radius)

     参数值:

      

参数描述
x1 端点 1x坐标
y1   端点1 y坐标
x2端点2 x坐标
y2端点2 y坐标
radius半径

 

        arcTo()方法将利用当前端点(x0,y0)、端点1(x1,y1)和端点2(x2,y2)这三个点所形成的夹角,然后绘制一段与夹角的两边相切并且半径为radius的圆上的弧线。弧线的起点就是当前端点所在边与圆的切点,弧线的终点就是端点2(x2,y2)所在边与圆的切点,并且绘制的弧线是两个切点之间长度最短的那个圆弧。此外,如果当前端点不是弧线起点,arcTo()方法还将添加一条当前端点到弧线起点的直线线段。  

图1-4

      实例:

      

图1-5

 

var CANVASWIDTH = 800;
var CANVASHEIGHT = 600;

var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");

canvas.width = CANVASWIDTH;
canvas.height = CANVASHEIGHT;

context.lineWidth=5;
context.beginPath();
context.moveTo(200,200);
context.lineTo(600,200);
context.lineTo(600,600);
context.strokeStyle="#000"
context.stroke();      //绘制辅助线

context.beginPath();
context.moveTo(200,200);
context.arcTo(600,200,600,600,300);
context.strokeStyle="red"
context.stroke();      //绘制曲线

 

        注意看清楚辅助线会曲线,我们可以看到,arcto()绘制的曲线终点不是所定义的(600,600),而是从起点(200,200)一直到与辅助线相切的坐标点就停止了。而若参数半径比较大,会出现什么情况呢?

    实例:

 

  图1-6

      代码:

var CANVASWIDTH = 800;
var CANVASHEIGHT = 600;


var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");

canvas.width = CANVASWIDTH;
canvas.height = CANVASHEIGHT;

context.lineWidth=5;
context.beginPath();
context.moveTo(200,200);
context.lineTo(600,200);
context.lineTo(600,600);
context.strokeStyle="#000"
context.stroke();

context.beginPath();
context.moveTo(200,200);
context.arcTo(600,200,600,600,600);      //就改了一个参数 将半径设置为600
context.strokeStyle="red"
context.stroke();

          

 

        可以看到,起点还是(200,200),但还未与辅助线相切就停止了。

        熟能生巧,多敲敲几遍代码,就能“摸清楚它的底细”了。

        本人前端小菜鸟,有什么说的不对的,还望各位包涵哈~

  

 

转载于:https://www.cnblogs.com/fanyear/p/6036854.html

相关文章:

  • redis安装出错
  • js基础总结 一
  • 总结Selenium自动化测试方法(四)WebDriver常用的操作
  • js 时间与时间戳的转换
  • HTTP——学习笔记(1)
  • ORACLE 体系结构
  • 数字证书调研整理-基本概念
  • delphi 中sql的语法规范
  • sql数据库链接
  • 脱水缩合
  • AIDL小结
  • jQuery简单的Ajax调用示例
  • 作业1:灯泡问题
  • Tomcat之web项目部署
  • 学习什么是线程安全与线程不安全(转)
  • 78. Subsets
  • Android组件 - 收藏集 - 掘金
  • Angular数据绑定机制
  • C++类中的特殊成员函数
  • CSS实用技巧干货
  • HTTP--网络协议分层,http历史(二)
  • Iterator 和 for...of 循环
  • JavaScript学习总结——原型
  • Koa2 之文件上传下载
  • Python利用正则抓取网页内容保存到本地
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • spring boot 整合mybatis 无法输出sql的问题
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 官方解决所有 npm 全局安装权限问题
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 跨域
  • 数组大概知多少
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 详解移动APP与web APP的区别
  • 应用生命周期终极 DevOps 工具包
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云服务器如何修改远程端口?
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​人工智能书单(数学基础篇)
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #define与typedef区别
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (03)光刻——半导体电路的绘制
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (6)设计一个TimeMap
  • (MATLAB)第五章-矩阵运算
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (一)Java算法:二分查找
  • *Django中的Ajax 纯js的书写样式1
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException