canvas基础学习(三)-曲线的绘制


代码实现:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<canvas id="canvas" style="border: 1px solid #aaa;display: block;margin: 50px auto;">
			你当前的浏览器不支持canvas,请更换浏览器再试。
		</canvas>
		
		<script>
			window.onload = function(){
				
				var canvas = document.getElementById("canvas");
				
				canvas.height = 600;
				canvas.width = 800;
				
				var context = canvas.getContext("2d");
				
				//arcTo
				context.beginPath();
				context.moveTo(150, 150);
				context.arcTo(650, 150, 650, 650, 300);
				
				context.lineWidth = 6;
				context.strokeStyle ="#FF0000";
				context.stroke();
				
				//baseLine
				context.beginPath();
				context.moveTo(150, 150);
				context.lineTo(650, 150);
				context.lineTo(650, 650);
				
				context.lineWidth = 2;
				context.strokeStyle = "gray";
				context.stroke();
				
			}
		</script>
		
	</body>
</html>

运行结果如下:


<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<canvas id="canvas" style="border: 1px solid #aaa;display: block;margin: 50px auto;">
			你当前的浏览器不支持canvas,请更换浏览器再试。
		</canvas>
		
		<script>
			window.onload = function(){
				
				var canvas = document.getElementById("canvas");
				
				canvas.height = 600;
				canvas.width = 800;
				
				var context = canvas.getContext("2d");
				
				drawRoundRect(context, 100,100,600,400,50);
				
			}
			
			function drawRoundRect(cxt, x, y, width, height, radius){
				
				cxt.save();
				cxt.translate(x, y);
				pathRoundRect(cxt, width, height, radius);
				cxt.strokeStyle = "black";
				cxt.stroke();
				cxt.restore();
				
			}
			
			function pathRoundRect(cxt, width, height, radius){
				
				cxt.beginPath();
				cxt.arc(width-radius, height-radius, radius, 0, Math.PI/2);
				cxt.lineTo(radius, height);
				cxt.arc(radius, height-radius, radius, Math.PI/2, Math.PI);
				cxt.lineTo(0, radius);
				cxt.arc(radius, radius, radius, Math.PI, Math.PI*3/2);
				cxt.lineTo(width-radius, 0);
				cxt.arc(width-radius,radius,radius,Math.PI*3/2, Math.PI*2);
				cxt.closePath();
				
			}
		</script>
		
	</body>
</html>



<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<canvas id="canvas" style="border: 1px solid #aaa;display: block;margin: 50px auto;">
			你当前的浏览器不支持canvas,请更换浏览器再试。
		</canvas>
		
		<script>
			window.onload = function(){
				
				var canvas = document.getElementById("canvas");
				
				canvas.height = 800;
				canvas.width = 800;
				
				var context = canvas.getContext("2d");
				
				fillMoon(context, 2, 300, 300, 300, 30);
			}
			
			function fillMoon(cxt, d, x, y, R, rot, /*option*/fillColor){
				cxt.save();
				cxt.translate(x, y);
				cxt.rotate(rot*Math.PI/180);
				cxt.scale(R, R);
				pathMoon(cxt, d);
				cxt.fillStyle = fillColor || "#fb5";
				cxt.fill();
				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));
			}
			
		</script>
		
	</body>
</html>



为了更好的了解赛贝尔曲线,可以前去这个网站自己玩玩:http://cubic-bezier.com/#.17,.67,.73,.33

运用赛贝尔曲线完善之前画的星空,添加了下面的草地,具体实现如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<canvas id="canvas" style="border: 1px solid #aaa;display: block;margin: 50px auto;">
			你当前的浏览器不支持canvas,请更换浏览器再试。
		</canvas>
		
		<script>
			window.onload = function(){
				var canvas = document.getElementById("canvas");
				
				canvas.width = 1000;
				canvas.height = 600;
				
				var context = canvas.getContext("2d");
				
				//var skyStyle = context.createLinearGradient(0, 0, 0, canvas.height);//线性渐变
				var skyStyle = context.createRadialGradient(canvas.width/2, canvas.height, 0, canvas.width/2, canvas.height, canvas.height);//径向渐变
				skyStyle.addColorStop(0.0, '#035');
				skyStyle.addColorStop(1.0, 'black');
				context.fillStyle = skyStyle;
				context.fillRect(0,0,canvas.width,canvas.height);
				
				for(var i = 0; i < 200; i ++){
					var r = Math.random()*5+5;
					var x = Math.random()*canvas.width;
					var y = Math.random()*canvas.height*0.65;
					var a = Math.random()*360;
					var dis = Math.min(x,canvas.width-x,y,canvas.height-y);
					if(dis >= r){
						drawStar(context, r, x, y, a);
					}
					
				}
				
				fillMoon(context, 2, 600, 100, 50, 40);
				drawLand(context);
				
			}
			
			function drawLand(cxt){
				cxt.save();
				
				cxt.beginPath();
				cxt.moveTo(0, 400);
				cxt.bezierCurveTo(540, 400, 660, 600, 1000, 500);
				cxt.lineTo(1200, 800);
				cxt.lineTo(0, 800);
				cxt.closePath();
				
				var landStyle = cxt.createLinearGradient(0, 800, 0, 0);
				landStyle.addColorStop(0.0, '#030');
				landStyle.addColorStop(1.0, '#580');
				cxt.fillStyle = landStyle;
				
				cxt.fill();
				
				cxt.restore();
			}
			
			function drawStar(cxt, R, x, y, rot){
				
				cxt.save();
				
				cxt.translate(x,y);
				cxt.rotate(rot/180*Math.PI);
				cxt.scale(R,R);
				
				starPath(cxt);
				
				cxt.fillStyle = "#fd5";
//				cxt.strokeStyle = "#fd5";
//				cxt.lineWidth = 3;
//				cxt.lineJoin = "round";
				
				cxt.fill();
				//cxt.stroke();
				
				cxt.restore();
				
				}
			function starPath(cxt){
				cxt.beginPath();
				for(var i = 0; i < 5; i ++){
					cxt.lineTo(Math.cos((18+i*72)/180*Math.PI),
						   		-Math.sin((18+i*72)/180*Math.PI));
					cxt.lineTo(Math.cos((54+i*72)/180*Math.PI)*0.5,
						   		-Math.sin((54+i*72)/180*Math.PI)*0.5)
				}
				cxt.closePath();
			}
			
			function fillMoon(cxt, d, x, y, R, rot, /*option*/fillColor){
				cxt.save();
				cxt.translate(x, y);
				cxt.rotate(rot*Math.PI/180);
				cxt.scale(R, R);
				pathMoon(cxt, d);
				cxt.fillStyle = fillColor || "#fb5";
				cxt.fill();
				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));
			}
			
				
		</script>
		
	</body>
</html>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值