[从头学数学] 第52节 面积

剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入练气期第六层功法的修炼,
这次要修炼的目标是[面积]。

正剧开始:

星历2016年01月20日 11:24:34, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究面积






[人叫板老师]让小伟去指出图形的轮廓,并填充上颜色,但小伟做得不是很好。

<span style="font-size:18px;">/**
* @usage   标记边界点
* @author  mw
* @date    2016年01月14日  星期四  14:57:23 
* @param
* @return
*
*/
	function signBoundPoint(gap1, gap2) {	
	
		//图片
		var image = new Image();
		image.src = "./1.jpg";
		//只处理这100*100个象素
		var width = 600;
		var height = 400;
		var gap = gap1 ? gap1 : 30;
		var gap2 = gap2 ? gap2 : 10;
		//掩码矩阵 边界
		var maskArray = new Array();
		//掩码矩阵 内部
		var maskArray2 = new Array();
		
		image.onload = function() {
			plot.drawImage(image);
			var imagedata = plot.getImageData(0, 0, width, height);			
			
		
			//背景色
			var Rback = Gback = Bback = 255;
			
			//水平方向找差异
			for (var row = 0; row < height; row++) {
				//指示位
				var first = last = 0;
				
				for (var col = 1; col < width; col++) {
					
					//pos最小为1
					pos =row * width  + col;
					if (maskArray[pos] == 1) 
						continue;
						
					R0 = imagedata.data[4 * (pos-1)];				
					R1 = imagedata.data[4 * pos];
					G0 = imagedata.data[4 * (pos-1)+1];
					G1 = imagedata.data[4 * pos+1];
					B0 = imagedata.data[4 * (pos-1)+2]
					B1 = imagedata.data[4 * pos + 2]
					
					
					//简单容差判断
					if (Math.abs(R1-R0) > gap || 
							Math.abs(G1-G0)>gap || 
							Math.abs(B1-B0)>gap) {
						maskArray[pos] = 1;
					
						if ((first == 0 && last == 0) || first <= last-10) {
							first = col;
						} else if (first > last + 10) {
							last = col;

						}

					} else {						
						maskArray[pos] = 0;
						
					}
					
					//非边界
					if (maskArray[pos] != 1) {
						
						if (first < last) {
							maskArray2[pos] = 1;
						}
					
					}
				}
			}
			
			
			//垂直方向找差异
			for (var col = 0; col < width; col++) {
				var first = last = 0;
				var index = 0;
				
				for (var row = 1; row < height; row++) {
					//pos最小为第二行
					pos =row * width  + col;
					
					if (maskArray[pos] == 1) 
						continue;
						
					R0 = imagedata.data[4 * (pos-width)];				
					R1 = imagedata.data[4 * pos];
					G0 = imagedata.data[4 * (pos-width)+1];
					G1 = imagedata.data[4 * pos+1];
					B0 = imagedata.data[4 * (pos-width)+2];
					B1 = imagedata.data[4 * pos + 2];						

					
					//简单容差判断
					if (Math.abs(R1-R0) > gap || 
							Math.abs(G1-G0)>gap || 
							Math.abs(B1-B0)>gap) {
							
						maskArray[pos] = 1;
						

						if ((first == 0 && last == 0) || first <= last-10) {
							first = row;
						} else if (first > last + 10) {
							last = row;

						}

					} else {
						maskArray[pos] = 0;
					}
					
					//非边界
					if (maskArray[pos] != 1) {
						if (first < last) {
							maskArray2[pos] = 1;
						}
					}
				}
			}	
			
			plot.translate(600, 0);
			
			for (var col = 0; col < width; col++) {
				for (var row = 0; row < height; row++) {
					pos = row * width  + col;
					//颜值突变点,一般为边界
					if (maskArray[pos] == 1) {
						 imagedata.data[4 * pos] = 255;
						 imagedata.data[4 * pos+1] = 0;
						 imagedata.data[4 * pos+2] = 255;
						
					} else if (maskArray2[pos] == 1) {
						 //颜值相近点,一般为内部
						 imagedata.data[4 * pos] = 0;
						 imagedata.data[4 * pos+1] = 255;
						 imagedata.data[4 * pos+2] = 0;						
					
					}
					else {
						 //作为背景处理
						 imagedata.data[4 * pos] = 255;
						 imagedata.data[4 * pos+1] = 255;
						 imagedata.data[4 * pos+2] = 255;
					}
				}
			}
			
			plot.putImageData(imagedata, 0, 0);
			plot.drawImage(image);
			
						
			
	}	
}</span>

小伟现在只能做到这样的程度:









但小伟觉得下面这道题还是很好做的:


来画画吧:


<span style="font-size:18px;">function myDraw() {  
    var config = new PlotConfiguration();  
    config.init();  
    config.setPreference(); 
	//config.setSector(1,1,1,1);
 
    //config.axis2D(0, 0, 180);  	
	
	var row = 10, col = 20;
	var r = 28;
	var x0 = (600-col*r)/2, y0 = (400-row*r)/2;
	
	var color = ['red', 'blue', 'green', 'orange', 'cyan', 'purple', 'yellow'];
	//方格纸
	for (var i = 0; i < col; i++) {
		for (var j = 0; j < row; j++) {
			shape.strokeRect(x0+(i+0.5)*r, y0+(j+0.5)*r, r, r);
		}
	}
	
	var w = 16, h = 1;
	var index = 0;
	
	for (var i = 0; i <= col-w; i+=w) {
		for (var j = 0; j <= row-h; j+=h) {
			index++;
			plot.setStrokeStyle(color[index % 8]);
			plot.strokeRect(x0 + i*r, y0 + j*r, w*r, h*r);
			plot.fillText(index.toFixed(0), x0+(i+0.5)*r, y0+(j+0.5)*r, r);
		}
	}
	
	w = 2, h = 8;
	
	for (var i = 16; i <= col-w; i+=w) {
		for (var j = 0; j <= row-h; j+=h) {
			index++;
			plot.setStrokeStyle(color[index % 8]);
			plot.strokeRect(x0 + i*r, y0 + j*r, w*r, h*r);
			plot.fillText(index.toFixed(0), x0+(i+0.5)*r, y0+(j+0.5)*r, r);
		}
	}

}</span>

再来填点颜色:


<span style="font-size:18px;">function myDraw() {  
    var config = new PlotConfiguration();  
    config.init();  
    config.setPreference(); 
	//config.setSector(1,1,1,1);
 
    //config.axis2D(0, 0, 180);  	
	
	var row = 10, col = 20;
	var r = 28;
	var x0 = (600-col*r)/2, y0 = (400-row*r)/2;
	
	var color = ['red', 'blue', 'green', 'orange', 'cyan', 'purple', 'yellow','pink'];
	//方格纸
	for (var i = 0; i < col; i++) {
		for (var j = 0; j < row; j++) {
			shape.strokeRect(x0+(i+0.5)*r, y0+(j+0.5)*r, r, r);
		}
	}
	
	var w = 16, h = 1;
	var index = 0;
	
	for (var i = 0; i <= col-w; i+=w) {
		for (var j = 0; j <= row-h; j+=h) {
			index++;
			plot.setFillStyle(color[index % 8]);
			plot.fillRect(x0 + i*r, y0 + j*r, w*r, h*r);
			plot.strokeText(index.toFixed(0), x0+(i+0.5)*r, y0+(j+0.5)*r, r);
		}
	}
	
	w = 2, h = 8;
	
	for (var i = 16; i <= col-w; i+=w) {
		for (var j = 0; j <= row-h; j+=h) {
			index++;
			plot.setFillStyle(color[index % 8]);
			plot.fillRect(x0 + i*r, y0 + j*r, w*r, h*r);
			plot.strokeText(index.toFixed(0), x0+(i+0.5)*r, y0+(j+0.5)*r, r);
		}
	}</span>

小伟毕竟能力有限,以后还要好好地跟[人叫板老师]学习。

本节到此结束,欲知后事如何,请看下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值