html5 canvas 小试:绘制2次曲线

yiyu 2010-02-23

canvas是html5中新增加的元素,可以用来在html中通过javascript绘制图形,处理图像。
虽然现在html5还没有正式发布,但firefox 3+,chrome 2.0+,safari 4等都已经支持,
ie也可以通过扩展支持该功能

关于canvas的简单介绍可以参看这里,其中有很多很好的链接:
http://en.wikipedia.org/wiki/Canvas_element

html5草稿版中对canvas的定义可以参看这里:
http://www.w3.org/TR/2009/WD-html5-20090825/the-canvas-element.html

Mozilla的相关页面见这里:
https://developer.mozilla.org/en/Canvas_tutorial

其中对ie的扩展有2种,我试用了一下google的:
http://code.google.com/p/explorercanvas/

作为试手,我做了一个画2次曲线的页面,运行效果如下图:



其中可以调整a,b,c三个系数,可以指定横竖坐标轴的最大值,步数指的是横坐标的采样数,
为了保证左右一样,输入值为半边的采样数。
代码如下,我在firefox3.5.8,chrome 5.0, ie8里都跑过,其中ie8要用到google的explorercanvas,
输入值有效性检查之类的一并忽略,呵呵。
<html>

<head>
	<title>learn canvas 001</title>
	<!--[if IE]><script type="text/javascript" src="excanvas.js"></script><![endif]-->
	<script type="text/javascript">
		var MAX_WIDTH = 640;
		var MAX_HEIGHT = 480;
		
		function init() {
			var g = getCanvasContext();
			g.translate(MAX_WIDTH/2, MAX_HEIGHT/2);
			
			initGraph();
		}
		
		function initGraph() {
			var g = getCanvasContext();
			g.strokeStyle = 'black';
			if (g) {
				g.clearRect(-MAX_WIDTH/2, -240, MAX_WIDTH, MAX_HEIGHT);
				g.strokeRect(-MAX_WIDTH/2, -240, MAX_WIDTH, MAX_HEIGHT);

				g.beginPath();
				g.moveTo(-MAX_WIDTH/2, 0);
				g.lineTo(MAX_WIDTH/2, 0);
				g.moveTo(0, -MAX_HEIGHT/2);
				g.lineTo(0, MAX_HEIGHT/2);
				g.stroke();
			}
		}
		
		function draw() {
			initGraph();
			
			var maxX = Number(document.getElementById('maxX').value);
			var maxY = Number(document.getElementById('maxY').value);
			var halfStep = Number(document.getElementById('halfStep').value);
			
			var g = getCanvasContext();
			if (g) {
				var x, y;
				var sx, sy;
				var currStep;
				
				sx = -MAX_WIDTH/2
				sy = -MAX_HEIGHT/2 * calculateY(-maxX) / maxY;
				g.beginPath();
				g.moveTo(sx, sy);
				
				for (currStep=-halfStep + 1; currStep<=halfStep; currStep++) {
					x = maxX * currStep / halfStep;
					y = calculateY(x);
					sx = MAX_WIDTH/2 * x / maxX;
					sy = -MAX_HEIGHT/2 * y / maxY;
					g.lineTo(sx, sy);
				}
				g.strokeStyle = 'blue';
				g.stroke();
			}
		}
		
		function calculateY(x) {
			var a = Number(document.getElementById('a').value);
			var b = Number(document.getElementById('b').value);
			var c = Number(document.getElementById('c').value);
			
			var y = a * x * x + b * x + c;
			return y;
		}
		
		function getCanvasContext() {
			var c = document.getElementById('myCanvas');
			if(c && c.getContext) {
				var g = c.getContext('2d');
				return g;
			} else {
				return null;
			}
		}
	</script>
</head>

<body onload="init()">
	<canvas id="myCanvas" width="640" height="480">
		该浏览器不支持Canvas.
	</canvas>
	<p>
	<table>
		<tr>
			<td colspan="2">
				函数 = <input type="text" id="a" size="2" value="1"/> * x * x + <input type="text" size="2" id="b" value="2"/> * x + <input type="text" size="2" id="c" value="3"/>
			</td>
		</tr>
		<tr>
			<td>最大横坐标:</td>
			<td><input type="text" id="maxX" value="10"/></td>
		</tr>
		<tr>
			<td>最大纵坐标:</td>
			<td><input type="text" id="maxY" value="200"/></td>
		</tr>
		<tr>
			<td>二分之一总步数:</td>
			<td><input type="text" id="halfStep" value="20"/></td>
		</tr>
		<tr>
			<td colspan="2"><button name="btnDraw" type="button" onClick="draw()">Draw</button></td>
		</tr>
	</table>
	
</body>

</html>

此文章带有附件,请前往http://www.iteye.com/topic/600918下载
Global site tag (gtag.js) - Google Analytics