Canvas画布学习

一、创建Canvas&绘制图像

<canvas id="mycanvas"></canvas>
//html中创建一个canvas
var canvas=document.getElementVyId("mycanvas");
var ctx=canvas.getContext("2D");
//获取canvas对象,获取2d的绘制环境

1)绘制一条直线:lineTo(x,y)

moveTo(x,y)  //起始位置 ,移动的起始位置;
lineTo(x,y)     //终止位置
lineWidth      //线条的宽度
strokeStyle   //线条样式,一般用于改变颜色
(以上四种操作是基于状态的绘制图形,必须使用stroke来进行实际的绘制)
stroke()         //绘制线条

2)绘制一新的图形(开始全新的路径):beginPath()

对于不同的路径使用不同的样式,修改的属性值会被修改,不变的数据会被沿用;

3)绘制封闭的图形:closePath()(与beginPath成对出现)

4)颜色填充:fillStyle 填充的颜色的状态,fill() 进行颜色的实际填充;

5)rect(x,y,width,height);在x,y位置绘制指定大小的矩形;

save和restore可以保存和恢复canvas的图形绘制环境;(保存上下文和恢复上下文)

绘制五角星函数推导如下图所示:(绘制图像只需要将10个顶点进行连接就行)

 通过transform进行简单的图形变换,transform有六个参数(每个参数的作用如下图所示

transform具有级联的作用最后一个应用的图形将应用之前所有transform的图形变化样式,settransform可以解决此种问题; 

//星星的绘制路径图
	function PathStar(ctx){
		ctx.beginPath();//封闭路径
		//初始位置就为第一个lineto的位置
		for(var i=0;i<5;i++){
			ctx.lineTo(Math.cos((18+72*i)*Math.PI/180),
				-Math.sin((18+72*i)*Math.PI/180));
			ctx.lineTo(Math.cos((54+72*i)*Math.PI/180)/2,
				-Math.sin((54+72*i)*Math.PI/180)/2);
		}
		//标准的五角星路径,外圆半径为1,内圆半径为1/2;
		ctx.closePath();//结束绘制路径
	}

二、Canvas的常用API

1) fillStyle用于设置图形样式:(之后将newstyle赋值给fillStyle即可,strokeStyle用法与之类似)

	var newstyle=ctx.createLinearGradient(x0, y0, x1, y1);//起始和结束位置点
	newstyle.addColorStop(offset, color);//样式颜色,offset为起始和结束位置,范围【0,1】

2)ctx.arc(x, y, r, startAngle, endAngle, anticlockwise)

x,y是指的圆心坐标,r为圆的半径,startAngle和endAngle指的是起始和结束弧度,最后一个参数是代表旋转方向;

3)贝塞尔曲线(二次):ctx.quadraticCurveTo(cpx, cpy, x, y);

二次贝塞尔曲线绘制(通过此网站可以快速生成曲线代码以及形状)
http://blogs.sitepointstatic.com/examples/tech/canvas-curves/quadratic-curve.html

4)贝塞尔曲线(三次):ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);

三次贝塞尔曲线的绘制样式测试:(通过此网站可以快速生成曲线代码以及形状)
http://blogs.sitepointstatic.com/examples/tech/canvas-curves/bezier-curve.html

(注:三次贝塞尔曲线可以实现出花瓣的样式)

5)清除矩形(画布):一般用在canvas的动画制作中,clearRect()

ctx.clearRect(x, y, w, h);
x,y矩形的起始位置,w和h指矩形的宽度

三、Finally 实战

最后用canvas做一个贪吃蛇的小游戏来检验自己的学习成果:(运行截图如下)

游戏代码 (html贪吃蛇代码,如果有什么问题还请大家谅解)

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js "></script>
</head>
<body>
<div style="width:80%;margin:auto;background-color:#FFDEAD;">
<canvas id ="mycanvas" style="margin:auto; width:100%;" >
	/*canvas画布*/
</canvas>
</div>
<script type="text/javascript">
	var canvas=document.getElementById("mycanvas");//获取canvas对象
	var ctx=canvas.getContext("2d");//获取绘制环境
	canvas.width=800;
	canvas.height=380;
	var down=0;
	var snack=[[20,20],[20,40],[20,60]];
	var foodx=80;
	var foody=80;
	var foodnum=1;
	var dirction=2;//0 1 2 3 默认向右
	checked=function(){
		if(snack[0][0]==foodx&&snack[0][1]==foody){
			snack.unshift([foodx,foody]);
			return 1;//获取食物
		}
		else if(Find()==1){
			return 0;
		}
	}
	var timer=setInterval("Game()", 200) ;
	window.addEventListener('keydown', keydown,true);//键盘响应
	function Game(){
		ctx.fillStyle="red";
		ctx.clearRect(0, 0, 800, 380);//清除画布
		if(checked()==1){//游戏判断
			showfood();
		}
		else if(checked()==0){
			clearInterval(timer);
			foody="";
			foodx="";
		}
		selfMove();//蛇自己移动
		ctx.fillRect(foodx,foody,20,20);//绘制食物
		showsnack();//绘制蛇
		down=0;
	}
	function selfMove(){
		if(dirction==0){
			if(snack[0][0]-20>=0)
			   snack.unshift([snack[0][0]-20,snack[0][1]]);
			else{
				snack.unshift([780,snack[0][1]]);
			}
		}
		else if(dirction==1){
			if(snack[0][1]-20>=0)
			snack.unshift([snack[0][0],snack[0][1]-20]);
		    else{
		    	snack.unshift([snack[0][0],360]);
		    }
		}
		else if(dirction==2){
			if(snack[0][0]+20<=800)
			snack.unshift([snack[0][0]+20,snack[0][1]]);
		    else{
		    	snack.unshift([0,snack[0][1]]);
		    }
		}
		else if(dirction==3){
			if(snack[0][1]+20<=360)
			snack.unshift([snack[0][0],snack[0][1]+20]);
		    else{
		    snack.unshift([snack[0][0],0]);
		    }
		}
		snack.pop();
	}
	function keydown(e){
		//left 37 up 38 right 39 down 40;
		if(e.keyCode==37&&dirction!=2){
			dirction=0;
		}
		if(e.keyCode==38&&dirction!=3){
			dirction=1;
		}
		if(e.keyCode==39&&dirction!=0){
			dirction=2;
		}
		if(e.keyCode==40&&dirction!=1){
			dirction=3;
		}//按键响应

	}
	function showsnack(){
		for(var i=0;i<snack.length;i++){
			ctx.fillStyle="green";
			ctx.fillRect(snack[i][0], snack[i][1], 20, 20);
		}
	}
	function showfood(){
			var x,y;
			x=Math.floor(Math.random()*29+1)*20;
			y=Math.floor(Math.random()*15+1)*20;
			foodx=x;
			foody=y;
	}
	function Find(){
		for(var i=1;i<snack.length;i++){
			if(snack[i][0]==snack[0][0]&&snack[i][1]==snack[0][1]){
				return 1;//游戏结束
			}
		}
		return 0;//游戏继续
	}
</script>	
</body>
</html>

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python Tkinter的Canvas画布)是一个可以用来绘制图形的小部件。它允许你在窗口上创建各种形状的图形,包括线条、矩形、圆形、椭圆、多边形等。你可以在画布上设置颜色、大小、位置等属性,并通过代码来操纵这些属性。 创建一个画布的基本步骤如下: 1. 导入Tkinter模块 2. 创建主窗口 3. 创建Canvas对象并指定宽度和高度 4. 使用各种形状的绘图方法来创建图形 5. 使用pack()或grid()方法将Canvas添加到主窗口中 例如,下面的代码创建一个大小为400x400像素的画布,并在其中绘制一个矩形和一个椭圆: ``` python from tkinter import * root = Tk() canvas = Canvas(root, width=400, height=400) canvas.pack() # 绘制矩形 canvas.create_rectangle(50, 50, 150, 150, fill="blue") # 绘制椭圆 canvas.create_oval(200, 200, 300, 300, fill="red") root.mainloop() ``` 这里使用了Canvas对象的`create_rectangle()`和`create_oval()`方法来创建矩形和椭圆,分别指定它们的左上角和右下角坐标,并设置了填充颜色。这些形状将被添加到画布中,并通过`pack()`方法将画布添加到主窗口中。 Canvas还有许多其他的方法和属性可以用来控制画布中的图形,可以根据需要进行学习和使用。 ### 回答2: Python Tkinter是一个用于图形用户界面(GUI)编程的Python工具包。Tkinter包括许多控件,例如按钮、标签和画布画布是Tkinter中最灵活的控件之一,它是一个以像素为单位的矩形区域,可以在上面绘制图像、文本和形状。_canvas_ 组件是 Tkinter 的画布组件,它被用来实现2D图形。 使用_canvas_组件,我们可以轻松创建自定义图形应用程序。canvas提供了许多方法来绘制不同类型的图像,例如线、矩形、椭圆、弧、多边形等。在 Tkinter 中,_canvas_ 是一个单独的组件,常与其他 Tkinter 组件一起使用,例如按钮、列表框和文本框。 在Python中,使用Tkinter Canvas控件绘制图形可以分为以下三个步骤: 1. 创建_canvas_:在 Tkinter 窗口中创建_canvas_对象。 2. 绘制图形:使用_canvas_提供的各种方法在_canvas_中绘制具体图形。 3. 添加_canvas_到窗口:使用_grid()或_pack()等 Tkinter 布局方法将_canvas_添加到应用程序窗口中。 下面是一些_canvas_控件的示例代码: ``` python from tkinter import * root= Tk() canvas = Canvas(root, width = 300, height = 300) canvas.pack() canvas.create_rectangle(10, 10, 200, 200, fill="red") canvas.create_line(0, 0, 300, 300, fill="blue") root.mainloop() ``` 此代码创建一个大小为300*300像素的_canvas_,并在其上绘制了红色矩形和蓝色直线。 总之,画布是 Tkinter 极为有用的组件之一,它可以用于绘制各种图形并轻松地创建自定义图像应用。花费一些时间学习_canvas_ 的各种方法和特性,以使您的 Python 图形编程技能更加丰富和多样化。 ### 回答3: Python tkinter框架是Python语言中常用的GUI工具包,其中的canvas画布模块提供了强大的绘图能力,可以用于创建各种复杂的图形界面。 canvas画布模块提供了一个可供绘制的空间,可以使用它来绘制图形、显示文本和图片等。在canvas中,我们可以利用一些基本的绘图元素,如矩形、椭圆、折线、曲线等,以及对它们的填充和边框进行操作,创建出我们需要的各种图形。 canvas画布模块主要用到以下几种类: 1. Canvas类:它是我们在程序中创建画布的类,它提供了各种绘图方法和工具。 2. Item类:它是画布上的所有绘图元素的基类,包括矩形、椭圆、折线、曲线、文本等。 3. 绘制方法:包括create_line()、create_rectangle()、create_oval()、create_polygon()、create_text()等,可以根据需要选择合适的方法进行绘制。 在绘制图形时,canvas也提供了许多常用的属性设置,如颜色、线条粗细、填充等等。通过这些属性的设置,我们可以最终创建出自己想要的图形。 此外,canvas画布模块还支持一些常见的事件响应机制,例如鼠标事件、键盘事件、聚焦事件等,我们可以通过绑定这些事件的响应函数,实现与用户的交互。 总之,Python tkinter canvas画布是一个非常强大的绘图工具,它可以帮助我们实现各种复杂的界面和图形,如果你需要开发GUI应用程序,canvas模块是一个不错的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值