[从头学数学] 第143节 平行四边形 小结与复习题

剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了筑基中期的修炼,
这次要修炼的目标是[平行四边形 小结与复习题]。

正剧开始:

星历2016年03月20日 14:04:26, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[平行四边形 小结与复习题]。




上一节功法中,由于阿伟一时没有注意,导致四边形的数据没法进行变换,

这样,带来了很多的不便。画个图还要用手工,这可怎么行呢,

这次,阿伟就先把这个变换的工具做出来了,想必后面的题就好做了。

<span style="font-size:18px;">/**
* @usage   对点阵列数组进行平移,旋转,缩放,对称等变形
* @author  mw
* @date    2016年03月20日  星期日  13:24:58 
* @param   传入点阵列矩阵
* @return  输出变形后的点阵列矩阵
*
*/
function Transform() {
	this.translate = function(array, xOffset, yOffset) {
		var len = array.length;
		
		if (len == 0) {
			return [];
		}
		else {
			var len1 = array[0].length;
			
			if (len1 != 2) {
				//如果不是点阵列[..., [x,y], [x1,y1], ...]的格式,暂时不加处理
				return array;
			}
			else {
				var retArray = new Array();
				var x = 0, y = 0;
				
				for (var i = 0; i < len; i++) {
					x = array[i][0] + xOffset;
					y = array[i][1] + yOffset;
					
					retArray.push([x, y]);
				}
			}
		}
		
		return retArray;
	}
	
	this.scale = function(array, scale) {
		var len = array.length;
		
		if (len == 0) {
			return [];
		}
		else {
			var len1 = array[0].length;
			
			if (len1 != 2) {
				//如果不是点阵列[..., [x,y], [x1,y1], ...]的格式,暂时不加处理
				return array;
			}
			else {
				var retArray = new Array();
				var x = 0, y = 0;
				
				for (var i = 0; i < len; i++) {
					x = array[i][0] * scale;
					y = array[i][1] * scale;
					
					retArray.push([x, y]);
				}
			}
		}
		
		return retArray;
	}
	
	this.rotate = function(array, angle) {
		var len = array.length;
		
		if (len == 0) {
			return [];
		}
		else {
			var len1 = array[0].length;
			
			if (len1 != 2) {
				//如果不是点阵列[..., [x,y], [x1,y1], ...]的格式,暂时不加处理
				return array;
			}
			else {
				var retArray = new Array();
				var x = 0, y = 0;
				var sinA, cosA;
								
				for (var i = 0; i < len; i++) {
					sinA = Math.sin(angle);
					cosA = Math.cos(angle);
					
					x = array[i][0] * cosA - array[i][1]*sinA;
					y = array[i][0] * sinA + array[i][1]*cosA;
					
					retArray.push([x, y]);
				}
			}
		}
		
		return retArray;
	}
				
	this.flipX = function(array) {
		return this.flipImplement(array, 'X');
	}
	
	this.flipY = function(array) {
		return this.flipImplement(array, 'Y');
	}
	
	//关于直线y=kx轴对称
	this.flip = function(array, slope) {
		//slope为斜率k
		var mode = slope.toFixed(3);
		
		return this.flipImplement(array, mode);
	}
	
	this.flipImplement = function(array, mode) {
		var len = array.length;
		
		if (len == 0) {
			return [];
		}
		else {
			var len1 = array[0].length;
			
			if (len1 != 2) {
				//如果不是点阵列[..., [x,y], [x1,y1], ...]的格式,暂时不加处理
				return array;
			}
			else {
				var retArray = new Array();
				var x = 0, y = 0;
				var sinA, cosA;
				var m = 0, n = 0;
								
				
				if (mode == 'X')  {	
					for (var i = 0; i < len; i++) {
						//关于X轴对称,
						x = array[i][0];
						y = -array[i][1];
						retArray.push([x, y]);
					}
				}
				else if (mode == 'Y') {
					for (var i = 0; i < len; i++) {
						//关于Y轴对称,
						x = -array[i][0];
						y = array[i][1];
						retArray.push([x, y]);
					}
				}
				else {
					//模式为斜率 y = kx中k的字符串
					k = parseFloat(mode);
					
					for (var i = 0; i < len; i++) {
						//可扩展
						//此处先放大100倍再缩小是因为对于小尺寸
						//计算误差太大,而如果尺寸太大,
						//标注会占用太多地方,造成文字拥挤,无法读取
						m = array[i][0]*100;
						n = array[i][1]*100;  						
						
						//x = (m-2*k+2*k*n-m*k*k)/(1+k*k);  
						
						x = (1-k*k)*m+2*k*(n-1)/(1+k*k);
						//y = (-n+2*k*m+n*k*k)/(1+k*k);
						y = (2*k*m-(1-k*k)*n)/(1+k*k);
						retArray.push([x/100, y/100]);
					}
				}
					
					
				
			}
		}
		
		return retArray;
	}

}
</span>

先试验下效果:

<span style="font-size:18px;">		var r = 20;
		config.setSector(1,1,1,1);  
		config.graphPaper2D(0, 0, r);
		config.axis2D(0, 0,180);  
	
		var triangle = new  Triangle();  
		var transform = new Transform();
		var a = [];
		var tmp = [];
		/*
		config.setSector(3,3,1,1);  
		a = triangle.know2edges([10, 8], -90);
		
		tmp = [].concat(a);
		//document.write(tmp);
		shape.angleDraw(tmp, 'red', 20);
		*/
		
		config.setSector(3,3,2,2);
		a = triangle.know2edges([1, 2]);
				var b = []; 
		b = transform.flip(a, 1);
		//document.write(a+'<br>');
		//document.write(b);
		
		tmp = [].concat(a);
		shape.angleDraw(tmp, 'green', 80);
		
		

		tmp = [].concat(b);
		//document.write(tmp);
		shape.angleDraw(tmp, 'red', 80, 'BCA');</span>


这是关于y=x对称的两个三角形,看得出来是正确的。这下就好办了。





<span style="font-size:18px;">//1(2)
		var r = 20;
		config.setSector(1,1,1,1);  
		config.graphPaper2D(0, 0, r);
		config.axis2D(0, 0,180);  
	
		var triangle = new  Triangle();  
		var transform = new Transform();
		var a = [];
		var b = []; 
		var tmp = [];

		config.setSector(3,3,2,2);
		a = triangle.know2edges([2, 1], -90);
		
		tmp = [].concat(transform.translate(transform.flipY(a), 0, 1.5));
		shape.angleDraw(tmp, 'green', 80);
		
		a = transform.flipY(a);
		tmp = [].concat(a);
		shape.strokeDraw(tmp, 'green', 80);
		
		b = shape.paraquad(0, 0, 0, -2, 2, Math.PI/6);

		tmp = [].concat(b);
		//document.write(tmp);
		shape.angleDraw(tmp, 'red', 80);
		

//1(3)

		var r = 20;
		config.setSector(1,1,1,1);  
		config.graphPaper2D(0, 0, r);
		config.axis2D(0, 0,180);  
	
		var triangle = new  Triangle();  
		var transform = new Transform();
		var a = [];
		var b = []; 
		var tmp = [];

		config.setSector(3,3,2,2);
		a = triangle.know2edges([1, 1], 150);
		
		tmp = [].concat(transform.translate(transform.flipY(a), 0, 1.5));
		shape.angleDraw(tmp, 'green', 80);
		
		a = transform.flipY(a);
		tmp = [].concat(a);
		shape.strokeDraw(tmp, 'green', 80);
		
		b = shape.paraquad(0, 0, 0, -1, 1, Math.PI/2);

		tmp = [].concat(b);
		shape.angleDraw(tmp, 'red', 80);
		
		var c = [];
		c = triangle.know3edges([1, 1, 1]);
		tmp = [].concat(transform.rotate(c,-Math.PI/6));
		shape.strokeDraw(tmp, 'red', 80);</span>








<span style="font-size:18px;">//9(2), 9(3)
		var r = 20;
		config.setSector(1,1,1,1);  
		config.graphPaper2D(0, 0, r);
		config.axis2D(0, 0,180);  
	
		var triangle = new  Triangle();  
		var transform = new Transform();
		var a = [];
		var b = []; 
		var tmp = [];

		config.setSector(3,3,2,2);

		
		b = shape.paraquad(0, 0, 0, -1, 1, Math.PI/3);

		tmp = [].concat(b);
		shape.angleDraw(tmp, 'red', 100);
		
		for (var i = 0; i < 4; i++) {
			if (i == 3) {
				a.push([(b[i][0]+b[0][0])/2, (b[i][1]+b[0][1])/2]);
			}
			else {
				a.push([(b[i][0]+b[i+1][0])/2, (b[i][1]+b[i+1][1])/2]);
			}
		}
		shape.strokeDraw([].concat(a), 'green', 100);
		shape.angleDraw(transform.translate(a, 0, 1.5), 'green', 100);
		</span>






<span style="font-size:18px;">		var r = 20;
		config.setSector(1,1,1,1);  
		config.graphPaper2D(0, 0, r);
		config.axis2D(0, 0,180);  
	
		var triangle = new  Triangle();  
		var transform = new Transform();
		var a = [];
		var b = []; 
		var tmp = [];

		config.setSector(3,3,1,1);

		var angle = 45;
		var w = 2, h = 2;
		b = triangle.know2edges([w, h], angle);
		
		
		tmp = [].concat(b);
		shape.angleDraw(tmp, 'red', 100);
		
		a = triangle.know2edges([-w, -h], angle);
		a = transform.translate(a, w+h*Math.cos(angle/180*Math.PI), -h*Math.sin(angle/180*Math.PI));
		tmp = [].concat(a);
		shape.angleDraw(tmp, 'green', 100);</span>





<span style="font-size:18px;">		var r = 20;
		config.setSector(1,1,1,1);  
		config.graphPaper2D(0, 0, r);
		config.axis2D(0, 0,180);  
	
		var triangle = new  Triangle();  
		var transform = new Transform();
		var a = [];
		var b = []; 
		var tmp = [];

		config.setSector(3,3,1,1);

		var angle = 90;
		var w = 2, h = 2;
		b = shape.paraquad(0, 0, 0, w, h, angle/180*Math.PI);
		
		
		tmp = [].concat(b);
		shape.strokeDraw(tmp, 'red', 100);
		
		
		a = triangle.know2edges([w/2, h], angle);
		a = transform.translate(transform.flipX(a), 0, -h);
		tmp = [].concat(a);
		shape.angleDraw(tmp, 'green', 100);
		
		var c = triangle.know2edges([-w, -h/2], angle);
		c = transform.translate(c, w*1.5, -h);
		tmp = [].concat(c);
		shape.angleDraw(tmp, 'orange', 100);
		
		var d =  triangle.know2edges([-1, -2.24], 26.57);
		d = transform.translate(transform.flipY(d), w/2, -h);
		tmp = [].concat(d);
		shape.strokeDraw(tmp, 'cyan', 100);
		
				tmp = [].concat(transform.translate(d, 0, 1.5));
		shape.angleDraw(tmp, 'cyan', 100);</span>


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大生群体。无论你是计算机相关专业的生,还是对其他领域编程感兴趣的生,这些资源都能为你提供宝贵的习和实践机会。通过习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值