html-canvas 直线图形(2)

[重]  W3C坐标系:y轴正方向向下

直线绘制

一条直线


语法:

cxt.moveTo(x1,y1);  //起点坐标,moveTo:将画笔移到(x1,y1),开始绘制
cxt.lineTo(x2,y2);  //终点坐标,lineTo:将画笔从(x1,y1)开始画,一直到(x2,y2)
//上两句代码仅仅指定起点/终点坐标这两个状态,需调用下面的stroke()方法才有效
cxt.stroke();    //连线

例:

    <body>
		<canvas id="canvas" width="200" height="150" style="border:1px solid red"></canvas>
    </body>
	<script>
		function $$(id){
			return document.getElementById(id);
		}
		window.onload = function(){
			var cnv = $$("canvas");
			var cxt = cnv.getContext("2d");
			cxt.moveTo(50,100);
			cxt.lineTo(150,50);
			cxt.stroke();
		}
	</script>

多条直线


语法:

cxt.moveTo(x1,y1);
cxt.lineTo(x2,y2);
cxt.lineTo(x3,y3);    //多个lineTo()方法
...
cxt.stroke();

例:

//两条直线,有交点
cxt.moveTo(50,100);
cxt.lineTo(150,50);
cxt.lineTo(100,90);

//两条直线无交点
cxt.moveTo(200,100);
cxt.lineTo(250,60);
cxt.moveTo(180,100);
cxt.lineTo(250,50);
			
//三角形
cxt.moveTo(20,30);
cxt.lineTo(20,60);
cxt.lineTo(60,60);
cxt.lineTo(20,30);
			
//矩形
cxt.moveTo(160,160);
cxt.lineTo(300,160);
cxt.lineTo(300,250);
cxt.lineTo(160,250);
cxt.lineTo(160,160);
cxt.stroke();

矩形绘制

在canvas中,矩形分为两种:“描边”矩形和“填充”矩形

描边矩形


语法:

注:strokeStyle是context对象的一个属性,strokeRect()是context对象的一个方法
//当两句代码顺序互换后,strokeStyle属性不会生效
cxt.strokeStyle = 属性值;
cxt.strokeRect(x,y,width,height);

填充矩形


语法:

注:fillStyle是context对象的一个属性,fillRect()是context对象的一个方法
//fillStyle属性同strokeStyle,fillRect()方法同strokeRect()方法
//当两句代码顺序互换后,fillStyle属性不会生效
cxt.fillStyle = 属性值;
cxt.filRect(x,y,width,height);

例:描边+填充  

window.onload = function(){
	var cnv= $$("canvas");
	var cxt = cnv.getContext("2d");
	//描边矩形
	//strokeStyle()有三种取值(颜色值、渐变色、图案)
	cxt.strokeStyle = "#FF0000";	// red、rgb(255,0,0)、rgba(255,0,0,0.8)
	//strokeRect()用于确定矩形坐标(x,y为左上角坐标)
	cxt.strokeRect(50,50,80,80);
			
	//描边+填充
	cxt.strokeStyle = "black";
	cxt.strokeRect(140,140,50,50);
	cxt.fillStyle = "rgba(255,0,0,0.5)";
	cxt.fillRect(140,140,50,50);
}

rect()方法


语法:

rect(x,y,width,height);

注:

rect()方法在调用后并不会把矩形绘制出来,只有在使用rect()方法后调用stroke()或fill()方法,才会把矩形绘制出来。

例:

//rect()方法
//绘制描边矩形
cxt.strokeStyle="red";
cxt.rect(150,50,80,80);
cxt.stroke();
//绘制填充矩形
cxt.fillStyle="#FFE8E8";
cxt.rect(150,50,80,80);
cxt.fill();

清空矩形


语法:

cxt。clearRect(x,y,width,height);

例:

//清空矩形
cxt.fillStyle = "HotPink";
cxt.fillRect(50,200,50,50);
cxt.clearRect(65,215,20,20);


//绑定点击事件
cxt.fillStyle = "rgba(255,0,0,0.5)";
cxt.fillRect(50,50,80,80);
var btn = $$("btn");
btn.onclick= function(){
    //删除某一块
    //cxt.clearRect(60,60,40,40);
    //删除canvas
    cxt.clearRect(0,0,cnv.width,cnv.height);
}

注:

所有Canvas图形操作的属性和方法都是基于context对象的

 

多边形

canvas绘制箭头


事先确定箭头的7个顶点坐标,然后使用moveTo()和lineTo()来绘制

canvas绘制正多边形


正三角形分析   根据正三角形的特点,可以将其封装一个绘制正多边形的函数:createPolygon()

例:

<body>
		<canvas id="canvas" width="200" height="150" style="border:1px dashed gray;"></canvas>
	</body>
	<script>
		function $$(id){
			return document.getElementById(id);
		}
		window.onload = function(){
			var cnv = $$("canvas");
			var cxt = cnv.getContext("2d");
			//调用自定义的方法createPolygon()
			createPolygon(cxt,3,100,75,50);
			cxt.fillStyle = "HotPink";
			cxt.fill();
		}
		/*
		 * n:表示n边型
		 * dx,dy:表示n边形中心坐标
		 * size:表示n边形大小
		 */
		function createPolygon(cxt,n,dx,dy,size){
			cxt.beginPath();    //开始一条新路径
			var degree = (2*Math.PI)/n;
			for(var i=0;i<n;i++){
				var x = Math.cos(i*degree);
				var y = Math.sin(i*degree);
				cxt.lineTo(x*size+dx,y*size+dy);
			}
			cxt.closePath();    //关闭路径
		}
	</script>

createPolygon()只能绘制“正多边形”,不可以用于绘制“不规则多边形”。

绘制五角星


先获取各个顶点的坐标,再用moveTo()和lineTo()把五角星绘制出来。

例:

function $$(id){
	return document.getElementById(id);
}
window.onload = function(){
    var cnv = $$("canvas");
    var cxt = cnv.getContext("2d");
    cxt.beginPath();
    for(var i=0;i<5;i++){
		cxt.lineTo(Math.cos((18+i*72)*Math.PI / 180)*50+100,-Math.sin((18+i*72)*Math.PI / 180)*50+100);
		cxt.lineTo(Math.cos((54+i*72)*Math.PI / 180)*25+100,-Math.sin((54+i*72)*Math.PI / 180)*25+100);
	}
	cxt.closePath();
	cxt.stroke();
}

绘制调色板


方格调色板,例:

window.onload = function(){
	var cnv = $$("canvas");
	var cxt = cnv.getContext("2d");
	for(var i=0;i<6;i++){
		for(var j=0;j<6;j++){
			cxt.fillStyle="rgb("+Math.floor(255-42.5*i)+","+Math.floor(255-42.5*j)+",0)";
			cxt.fillRect(j*25,i*25,25,25);
		}
	}
}

渐变调色板,例:

var r=255,g=0,b=0;
for(i=0;i<150;i++){
    if(i<25) 
	    g+=10;
    else if(i>25&&i<50) 
	    r-=10;
    else if(i>50&&i<75) {
	    g-=10; b+=10; 
    }
    else if(i>=75&&i<100) 
	    r+=10;
    else b-=10;
    cxt.fillStyle = "rgb("+r+","+g+","+b+")";
    cxt.fillRect(3*i,0,3,cnv.height);
}

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值