小白学canvas-圆,弧线,圆角矩形

圆形

  • 调用 beginPath() 方法声明开始一个新路径
  • 使用 arc(x,y,半径,开始角度,结束角度,anticlockwise) 画圆
    (x,y)表示圆心坐标
    角度泽勇用 度数*MAth.PI/180 来表示更为直观
    anticlockwise是一个布尔值,默认为 false(顺时针),当为 true 时表示逆时针
  • 使用 closePath()方法来闭合当前路径
  • 使用 stroke(),fill() 方法将以上描述的状态显示出来
画只 小瓢虫
灯泡眼瓢虫
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
        //封装
        function $$(id){
            return document.getElementById(id);
        }
        window.onload=function(){
            //提取
            var cnv=$$("canvas");
            var cxt=cnv.getContext("2d");
            
            //整圆绘制瓢虫身体
            cxt.beginPath();
            cxt.arc(125,95,45,0,360*Math.PI/180,true);
            cxt.closePath();
            //填充
            cxt.fillStyle="black";
            cxt.fill();

            //半圆绘制瓢虫左边翅膀
            cxt.beginPath();
            cxt.arc(112,98,50,-75*Math.PI/180,105*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="red";
            cxt.fill();
            cxt.strokeStyle="black";
            cxt.stroke();
            //半圆绘制瓢虫右边翅膀
            cxt.beginPath();
            cxt.arc(138,98,50,-105*Math.PI/180,75*Math.PI/180,false);
            cxt.closePath();
            cxt.fillStyle="red";
            cxt.fill();
            cxt.strokeStyle="black";
            cxt.stroke();

            //小半圆绘制瓢虫头部
            cxt.beginPath();
            cxt.arc(125,74,40,-30*Math.PI/180,-150*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();

            //弧线绘制触须,arc方法
            cxt.beginPath();
            cxt.arc(90,45,30,0,-90*Math.PI/180,true);
            //弧线绘制触须,arcTo()方法
            cxt.moveTo(130,45);
            cxt.arcTo(130,15,160,15,30);
            //描边触须
            cxt.strokeStyle="black";
            cxt.stroke();

            //触角上小球
            cxt.beginPath();
            cxt.arc(95,15,5,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();
            cxt.beginPath();
            cxt.arc(155,15,5,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();
            //灯泡眼
            cxt.beginPath();
            cxt.arc(111,43,4,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="yellow";
            cxt.fill();
            cxt.beginPath();
            cxt.arc(139,43,4,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="yellow";
            cxt.fill();
            //左半边背上原点
            cxt.beginPath();
            cxt.arc(100,70,8,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();
            cxt.beginPath();
            cxt.arc(80,93,8,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();
            cxt.beginPath();
            cxt.arc(89,123,8,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();
            cxt.beginPath();
            cxt.arc(112,98,8,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();
            //右半边背上原点
            cxt.beginPath();
            cxt.arc(150,72,8,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();
            cxt.beginPath();
            cxt.arc(170,93,8,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();
            cxt.beginPath();
            cxt.arc(161,123,8,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();
            cxt.beginPath();
            cxt.arc(138,98,8,0,360*Math.PI/180,true);
            cxt.closePath();
            cxt.fillStyle="black";
            cxt.fill();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="250" height="150" style="border:1px dashed gray"></canvas>
</body>
</html>

弧线 - 圆形一部分

上面的绘画中 触须 用到了圆形一部分的弧线,现在把它们单独提取出来看。
画弧线有两种方法,一种用act(),一种用actTo()

act(x,y,半径,开始角度,结束角度,布尔值) 方法

例:从0°到-90°逆时针画一条弧线,0*Math.PI/180可简写为0


act( )方法图解
cxt.beginPath();
cxt.arc(90,45,30,0,-90*Math.PI/180,true);
//添加closePath()起点终点间会有一条直线链接起来
//cxt.closePath(); 
cxt.strokeStyle="red";
cxt.stroke();
对比图
actTo(cx,cy,x2,y2,圆弧半径) 方法
  • 由moveTo()或lineTo()确定弧线起始点,可先画一条线段,再接弧线
    如起始点距离弧线有一段距离,将会自动补上线条,对于处女座应该忍不了
  • 确定起始、终止两点处切线交汇点:控制点坐标(cx,cy)
  • 确定终止点坐标(x2,y2)

例:起始点为(130,45),控制点为(130,15),结束点为(160,15),半径为30的一段弧


arcTo()方法举例图解
cxt.beginPath();
cxt.moveTo(130,45);
cxt.arcTo(130,15,160,15,30);
cxt.strokeStyle="blue";
cxt.stroke();

如两根线的样式相同,可描述玩路径后,再进行显示步骤

圆角矩形函数封装
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
        function $$(id){
            return document.getElementById(id);
        }
        window.onload=function(){
            var cnv=$$("canvas");
            var cxt=cnv.getContext("2d");
            //roundRect(cxt,长,高,圆角半径,左上角顶点x坐标,左上角顶点y坐标)
            roundRect(cxt,170,90,20,40,30);
            cxt.strokeStyle="red";
            cxt.stroke();
        }    
        //圆角矩形封装函数
        function roundRect(cxt,width,height,r,lefttopX,lefttopY){
            cxt.beginPath();
            cxt.moveTo(lefttopX+r,lefttopY);
            cxt.lineTo(lefttopX+width-r,lefttopY);
            cxt.arcTo(lefttopX+width,lefttopY,lefttopX+width,lefttopY+r,r);
            cxt.lineTo(lefttopX+width,lefttopY+height-r);
            cxt.arcTo(lefttopX+width,lefttopY+height,lefttopX+width-r,lefttopY+height,r);
            cxt.lineTo(lefttopX+r,lefttopY+height);
            cxt.arcTo(lefttopX,lefttopY+height,lefttopX,lefttopY+height-r,r);
            cxt.lineTo(lefttopX,lefttopY+r);
            cxt.arcTo(lefttopX,lefttopY,lefttopX+r,lefttopY,r);
            cxt.closePath();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="250" height="150" style="border:1px dashed gray"></canvas>
</body>
</html>
圆角矩形
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容