为什么我画出来的不是弯月?仔细核对了代码,没找到问题,求指点

来源:6-3 绘制一角弯月

白水向前冲

2015-01-26 13:27

var canvas =document.getElementById("canvas");
if (canvas.getContext("2d")) {
   var context = canvas.getContext("2d");
}
else {
   alert("当前浏览器不支持Canvas,推荐使用Chrome浏览器")
}

54c5d0230001c24a05000350.jpg

 $("#moon").bind("click",function () {
       var cxt = canvas.getContext("2d");
       fillMoon(cxt,2,200,200,100,30);
   });

   function fillMoon(cxt,d,x,y,R,rot){

       cxt.save();
       cxt.translate(x,y);
       cxt.rotate( rot * Math.PI / 180);
       cxt.scale(R,R);
       pathMoon(cxt,d);
/*
       var linearGrad = cxt.createLinearGradient(0,0,800,800);
       linearGrad.addColorStop(0.0,'white')
       linearGrad.addColorStop(0.5,'yellow')
       linearGrad.addColorStop(1.0,'white')
       cxt.fillStyle=linearGrad;

       var radialGrad = cxt.createRadialGradient(400,400,0,400,400,500);
       radialGrad.addColorStop(0.0,'white')
       radialGrad.addColorStop(0.5,'yellow')
       radialGrad.addColorStop(1.0,'white')

       cxt.fillStyle=radialGrad;
       cxt.fill();
*/
       cxt.strokeStyle="#caff67"
       cxt.stroke();
       cxt.restore();
   }

   function pathMoon(cxt,d){
       cxt.beginPath();
       cxt.arc(0, 0, 1, 0.5*Math.PI , 1.5*Math.PI , true);
       cxt.moveTo(0 , -1);
       cxt.arcTo(d, 0, 0, 1, dis( 0, -1, d, 0) / d );
       cxt.closePath();
   }

   function dis(x1,y1,x2,y2){
       return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
   }

写回答 关注

2回答

  • 小王子抓猫咪
    2015-08-31 19:14:17

    你应该用fill填充而不是stroke画线,这样你就可以用scale缩放任意倍数拉。

  • 小王子抓猫咪
    2015-08-31 18:34:55

    建议不要使用scale(R,R)来进行缩放,同时你的pathMoon方法里的moveTo(0,-1)语句不能要

    arc画圆终点在0,R,然后直接从这个点开始画弧线arcTo指定两个点就可以了

    你试试吧

Canvas绘图详解

Canvas系列教程第二课,详解Canvas各接口,让同学彻底掌握Canvas绘图

72881 学习 · 422 问题

查看课程

相似问题