zoukankan      html  css  js  c++  java
  • 第三 画曲线

    贝塞尔或者二次方程曲线

    如果我们需绘制更加复杂的曲线路径,我们或许该用到贝塞尔或者二次方程曲线。

    bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

    quadraticCurveTo(cp1x, cp1y, x, y)

    两种曲线有何区别?我们可以参看下面这张图,2种曲线都有一个起点和终点(blue point),但是贝塞尔曲线仅有一个“control point”(red point),二次曲线则有2个。

    两个方法中的x和y参数都为曲线的终点坐标,cp1x和cp1y为第一control point的坐标,cp2x和cp2y为2次曲线的第二控制点。

    如果你要问起始点呢?那就是moveTo的点。

    曲线可以做出非常多的图案,当然这个计算也是非常繁琐。需要一点一点的磨合。

    可以看这个链接-quadraticCurveTo示例:

    ctx.beginPath();
    ctx.moveTo(75,25);
    ctx.quadraticCurveTo(25,25,25,62.5);
    ctx.quadraticCurveTo(25,100,50,100);
    ctx.quadraticCurveTo(50,120,30,125);
    ctx.quadraticCurveTo(60,120,65,100);
    ctx.quadraticCurveTo(125,100,125,62.5);
    ctx.quadraticCurveTo(125,25,75,25);
    ctx.stroke();

    如图所示

    bezierCurveTo示例

    ctx.beginPath();
    ctx.moveTo(75,40);
    ctx.bezierCurveTo(75,37,70,25,50,25);
    ctx.bezierCurveTo(20,25,20,62.5,20,62.5);
    ctx.bezierCurveTo(20,80,40,102,75,120);
    ctx.bezierCurveTo(110,102,130,80,130,62.5);
    ctx.bezierCurveTo(130,62.5,130,25,100,25);
    ctx.bezierCurveTo(85,25,75,37,75,40);
    ctx.fill();

    画弧线

    语法:arc(定义一个中心点,半径,起始角度,结束角度,和绘图方向:顺时针或逆时针)

    代码:

    context.arc(centerX, centerY, radius, startingAngle, endingAngle, antiClockwise);

    anticlockwise=false 是顺时针 true是逆时针

    var centerX = 100;
    var centerY = 100;
    var radius = 75;
    var startingAngle = 0.5* Math.PI;
    var endingAngle = 1 * Math.PI;
    var counterclockwise = true;
    context.arc(centerX, centerY, radius, startingAngle, endingAngle, counterclockwise);
    context.lineWidth = 25;
    context.strokeStyle = "black"; // line color
    context.stroke();

    var counterclockwise = false;

    在这个时候发现chrome下:

    计算说直径是150px才对,现在描边25px,如果从外线outline开始是150px,如果是从midline是150-25=125px,如果是inline是150-25-25=100px。目前来看是midline才对。

    所以如果用到计算的时候需要注意下。

    认识一下arcTo() 例子

    arcTo()让很多人困惑。事实上,它也让很多浏览器出错,至目前虽然仍有bug但大部分已经能够正确应用arcTo了。在SeaMonkey浏览器上还有点问题,在火狐上运行很好,Opera还是有点问题。如果你的浏览器不能正确运行arcTo,很抱歉,你需要升级了或者更换浏览器啦。

    公式:context.arcTo(x1, y1, x2, y2, radius)

    虽然是传递了两个点,但实际上有有三个点。(x0,y0)是你调用arcTo之前当前路径的当前点。另外,你传递的两个参数(x1,y1) and (x2,y2),是两个控制点。Radius是你假想的圆的半径。

    他们是这样工作的。通过(x0,y0) and (x1,y1)画一根假想的线,然后通过 (x1,y1) and (x2,y2)画另一根假想的线。以半径radius画假想的圆,与上面两个线相切。这个时候你要明白相切、切线是什么意思哦!

    看了下面这个图你应该很清楚了!

    该图的具体实现代码在附件 arcTo.html

    如何利用这个画一个圆角矩形呢?首先我们分析一下,圆角矩形由几个arcTo组成。

    明白否?这个矩形被分成了四段。首先是 上边线+右上角,右边线+右下角,底边线+左下角,上边线+左上角

    x,y - the top left corner
    width - how wide the rectangle
    height - how high the rectangle
    radius - the radius of the corner
    //上边线+右上角
        ctx.moveTo(x+radius,y);
        ctx.arcTo(x+width,y,x+width,y+radius,radius);
        //右边线+右下角
        ctx.arcTo(x+width,y+height,x+width-radius,y+height,radius);
        //底边线+左下角
        ctx.arcTo(x,y+height,x,y+height-radius,radius);
        //上边线+左上角
        ctx.arcTo(x,y,x+radius,y,radius);

    上图的例子在 附件 arcTo圆角矩形.html

  • 相关阅读:
    第一章 数据库概论
    规范化
    qt mysql驱动问题解绝
    linux文件系统软链接硬链接
    linux命令总结
    shell应用技巧
    如何使滚动条保持在页面底部
    地图定位问题汇总
    webpack基本用法
    git异常操作解决办法合集
  • 原文地址:https://www.cnblogs.com/yixiaoheng/p/canvas-animation-5.html
Copyright © 2011-2022 走看看