QML画图-Canvas画基本图形

12 篇文章 0 订阅
1.canvas画矩形
  a.无路径画法   
    ctx.fillRect(200,100,50,40);    //填充
    ctx.strokeRect(200,100,50,40);  //描边
    注:先用fillRect填充了矩形,用stroke(),不能描边,因为虽然有个矩形,但不存在路径。
  b.rect   
    ctx.rect(300,100,50,40);
    ctx.stroke();
    ctx.fill();
    注:填充或描边会消耗大量资源,先画路径再填充或描边。
  c.lineTo
    用4个lineTo画一个矩形,无必要。
  d.圆角矩形
    用arcTo画四个“钩子”,组成圆角矩形。
    
2.Canvas画圆
  ctx.arc(300,300,100,0,Math.PI*2);
  ctx.stroke();
  ctx.fill();


3. Canvas画扇形

    /** 扇形
      * @param x 扇形圆心x左标
      * @param y 扇形圆心y坐标
      * @param r 扇形半径
      * @param angleBegin 扇形开始角度
      * @param angleEnd 扇形结束角度
      * @param ifAnticlockwise 是否是逆时针
      */
    function getsectorPath(ctx, x, y, r, angleBegin, angelEnd, ifAnticlockwise)
    {
        try
        {
            ctx.arc(x, y, r, angleBegin, angelEnd, ifAnticlockwise);
            ctx.lineTo(x,y);
            ctx.closePath();
        } catch(e) {
            console.log(e)
        }
    }

3.Canvas画椭圆

  a.使用lineTo画椭圆
    function getEllipsePath(ctx, xp, yp, a, b)//中点坐标,长轴/2,短轴/2
    {
        ctx.beginPath();
        //lineTo的画法,循环次数多,耗资源
        var xPos = xp + a;
        var yPos = yp;
        ctx.moveTo(xPos, yPos);
        for(var i=0; i<=360; i++)
        {
            var angle = i * Math.PI / 180;
            //参数方程:x=acosθ , y=bsinθ
            xPos = xp + a*Math.cos(angle);
            yPos = yp - b*Math.sin(angle);
            ctx.lineTo(xPos, yPos);
        }
    }
  b.用arc画圆,然后把它缩放成一个椭圆
    ctx.save(); //先保存,之前画的图形不变动
    ctx.scale(a/b, 1); //缩放函数, 圆的中点坐标会改变,a/b:长轴/短轴的一半
    ctx.beginPath();
    ctx.arc(xp*b/a, yp, b, 0, 2 * Math.PI, false);
    ctx.stroke()
    // restore to original state
    ctx.restore() //将画布置回原来的状态,即不拉伸
  c.用四条贝赛尔曲线画出来,起点坐标为椭圆对应矩形的左上角点。
    var kappa = 0.5522848; //取值,来路不明??
    var ox = a * kappa, // control point offset horizontal
    oy = b * kappa, // control point offset vertical
    xe = xp + 2*a, // x-end
    ye = yp + 2*b, // y-end
    xm = xp + a, // x-middle
    ym = yp + b; // y-middle
    ctx.moveTo(xp, ym);
    ctx.bezierCurveTo(xp, ym - oy, xm - ox, yp, xm, yp);
    ctx.bezierCurveTo(xm + ox, yp, xe, ym - oy, xe, ym);
    ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);
    ctx.bezierCurveTo(xm - ox, ye, xp, ym + oy, xp, ym);
    //ctx.closePath();
   d.用四条贝赛尔曲线画出来,起点坐标为椭圆中点
     var kappa = 1 - 0.5522848; //取值,来路不明??
     var ox = a * kappa, // control point offset horizontal
     oy = b * kappa, // control point offset vertical
     xe = xp + 2*a, // x-end
     ye = yp + 2*b, // y-end
     xm = xp + a, // x-middle
     ym = yp + b; // y-middle
     ctx.moveTo(xp-a, yp);
     ctx.bezierCurveTo(xp-a, yp-oy, xp-ox, yp-b, xp, yp-b);
     ctx.bezierCurveTo(xp+ox, yp-b, xp+a, xp-oy, xp+a, yp);
     ctx.bezierCurveTo(xp+a, yp+oy, xp+ox, xp+b, xp, yp+b);
     ctx.bezierCurveTo(xp-ox, yp+b, xp-a, yp+oy, xp-a, yp);
     //ctx.closePath();
   c.用两条贝塞尔曲线画出来
     var k = (2*a/0.75)/2,
     w = a,
     h = b;
     ctx.moveTo(xp, yp-h);
     ctx.bezierCurveTo(xp+k, yp-h, xp+k, yp+h, xp, yp+h);
     ctx.bezierCurveTo(xp-k, yp+h, xp-k, yp-h, xp, yp-h);
     //ctx.closePath();
  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值