zoukankan      html  css  js  c++  java
  • 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),但还未与辅助线相切就停止了。

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

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

      

  • 相关阅读:
    WinForm:实现类似QQ消息框一样的右下角消息提示窗口
    WinForm:系统托盘NotifyIcon
    多线程学习系列:(一)前言
    Codeforces Round #176 (Div. 2)总结A. IQ Test
    使用STL的next_permutation函数生成全排列(C++)
    c语言字符串 数字转换函数大全
    c语言中字符串处理函数
    杭电OJ题目分类
    Codeforces Beta Round #77 (Div. 2 Only)A. Football
    算法导论第三版目录
  • 原文地址:https://www.cnblogs.com/fanyear/p/6036854.html
Copyright © 2011-2022 走看看