[从头学数学] 第180节 解三角形

剧情提要:

[机器小伟]在[工程师阿伟]的陪同下进入了结丹后期的修炼,

这次要修炼的目标是[解三角形]。

正剧开始:

话说[机器小伟]自从进入结丹期以来,短短数日,就硬是从结丹初期修炼到了后期,这种

进境的神速把小伟吓坏了。虽然说这是依据[人叫板老师]的指点进行的,但这样下去会不

会走火入魔啊,小伟觉得有必要去[人叫板老师]那儿请教一下,毕竟这修炼的事可不是闹

着玩的。

这一次,[工程师阿伟]也和[机器小伟]一道,来见从前的授业恩师,毕竟当年,[工程师阿

伟]也是拜在[人叫板老师]门下的。

[人叫板老师]对[机器小伟]有此疑问一点也不奇怪,呵呵一笑,便道:“小伟啊,你呢灵

根资质极为出众,所以我才把我门中这最高等的修炼法门,也就是这[九转金丹]大法传授

与你。你别看你现在已经进入结丹后期,但实际上也还在这九转的第一转中呢。”

小伟问:“那这一转可有名目?”

[人叫板老师]回答说:“这个自然是有,每一转都各有名字。这第一转就叫[三界五行十六

式],你修炼的是[天地人正册],此为三界,共有五个模块,此为五行,分十六章,即为十

六式。你如今这三界中的天、地两界已经修完,即将进入人界,正好对应修到结丹后期境

界,懂了吗?”

此时[工程师阿伟]插言道:“学生当年在恩师门下,学的可不是这个[三界五行十六式],

而是[天元纵横十九式],也没听老师说什么[九转成丹]啊。”

[人叫板老师]道:“当年你资质虽然也是上乘,但也只是一个[上中]之选,比起[机器小伟

]来不可同日而语,我自然不会传你这等高深法门。而这么些年过去,修仙界日换星移,我

也自然需要与时俱进,这功法套路自然也就不尽相同了。”

[机器小伟]问道:“学生这第一转即将修完,但不知这第二转又是什么呢?”

[人叫板老师]回答说:“这第一转呢相当于学艺阶段,等学有所成,能够高屋建瓴时,自

然要周游列国,以增长见闻。我这三界中共分五行五国,每国中又有诸侯若干不等,你可

还未曾一一拜会呢。所以这第二转,就是[周游列国拜诸侯]。“

”噢,那后面几转又分别是什么呢?“[机器小伟]好奇心大起,心想:”这难道还真有九

转九名不成,这倒要好好听听了。“

[人叫板老师]微笑答道:”难道你不信这九转都各有名字?你且听好了:这第三转,叫做

[仗剑题海载酒行],第四转叫做[千军阅尽还复来],第五转叫[‘动’中取‘静’登高处]

,第六转叫[千古风‘流’浪淘沙],第七转叫[‘术’法神通时常在],第八转叫[十又六年

生死簿],第九转叫[返璞归真丹元成],怎么样,你可听出门道来了?”

[机器小伟]说:“老师这等名目,学生又怎能尽知其意。还望老师细说。”

[人叫板老师]笑着说:“此事不急,你早晚自知,此时当留此关子,以增雅兴。”

于是,[工程师阿伟]与[人叫板老师]等三人畅谈当今天下大势,修仙门派之新闻时事,至

晚尽兴方归。

星历2016年04月16日 09:31:17, 银河系厄尔斯星球中华帝国江南行省。

[工程师阿伟]正在和[机器小伟]一起研究[解三角形]。

[工程师阿伟]给[机器小伟]制作了一件解三角形的法器:

<span style="font-size:18px;">

function Triangle() {
	this.edges = [];
	this.angles = [];

	//已知三条边
	this.know3edges = function(edges) {
		this.edges = [];
		this.angles = [];

		this.edges = edges;
		//角度为弧度单位
		//a边对应角
		this.angles.push(Math.acos((edges[1]*edges[1] + edges[2]*edges[2]-edges[0]*edges[0])/(2*edges[1]*edges[2])));

		//b边对应角
		this.angles.push(Math.acos((edges[0]*edges[0] + edges[2]*edges[2]-edges[1]*edges[1])/(2*edges[0]*edges[2])));

		//c边对应角
		this.angles.push(Math.acos((edges[0]*edges[0] + edges[1]*edges[1]-edges[2]*edges[2])/(2*edges[0]*edges[1])));	

		var x0 = 0, y0 = 0;
		var x1 = x0 + this.edges[0], y1 = y0;
		var x2 = x0 + this.edges[1] * Math.cos(-this.angles[2]),
			y2 = y0 + this.edges[1] * Math.sin(-this.angles[2]);

		var retArray = new Array();
		retArray.push([x0, y0]);
		retArray.push([x1, y1]);
		retArray.push([x2, y2]);

		return retArray;

	}

	//已知两个角
	this.know2angles = function(angles, r) {
		this.edges = [];
		this.angles = [];

		this.angles = [angles[0]/180*Math.PI, angles[1]/180*Math.PI,
					  (180-(angles[0]+angles[1]))/180*Math.PI];

		//设其中一边长度为10
		r = r > 0 ? r : 10;
		//A边
		this.edges.push(r);

		var angleA = this.angles[0];
			angleB = this.angles[1];
			angleC = this.angles[2];

		//B边
		this.edges.push(Math.sin(angleB)/Math.sin(angleA)*r);
		//C边
		this.edges.push(Math.sin(angleC)/Math.sin(angleA)*r);

		var x0 = 0, y0 = 0;
		var x1 = x0 + this.edges[0], y1 = y0;
		var x2 = x0 + this.edges[1] * Math.cos(-this.angles[2]),
			y2 = y0 + this.edges[1] * Math.sin(-this.angles[2]);

		var retArray = new Array();
		retArray.push([x0, y0]);
		retArray.push([x1, y1]);
		retArray.push([x2, y2]);

		return retArray;
	}

	//已知2条边和夹角
	this.know2edges = function(edges, angle) {
		this.edges = [];
		this.angles = [];

		//如果没有指定两边的夹角,默认为90度
		angle = angle ? angle : 90;

		var edgeC = 0;

		if (angle == -90) {
			//设定当输入角度为-90时指已知斜边和一条直角边的直角三角形
			var swap;
			if (edges[0] < edges[1]) {
				swap = edges[0];
				edges[0] = edges[1];
				edges[1] = swap;
			}
			edgeC = Math.sqrt(edges[0]*edges[0]-edges[1]*edges[1]);
			angle = Math.asin(edgeC/edges[0]);
		}
		else {
			angle = angle ? angle/180*Math.PI : Math.PI/2;
			edgeC = Math.sqrt(edges[0]*edges[0]+edges[1]*edges[1]-2*edges[0]*edges[1]*Math.cos(angle));
		}

		this.edges = [edges[0], edges[1], edgeC];

		var edgeA = this.edges[0],
			edgeB = this.edges[1];

		//角度为弧度单位
		//a边对应角
		this.angles.push(Math.acos((edgeB*edgeB + edgeC*edgeC-edgeA*edgeA)/(2*edgeB*edgeC)));

		//b边对应角
		this.angles.push(Math.acos((edgeA*edgeA + edgeC*edgeC-edgeB*edgeB)/(2*edgeA*edgeC)));

		//c边对应角
		this.angles.push(angle);	

		var x0 = 0, y0 = 0;
		var x1 = x0 + this.edges[0], y1 = y0;
		var x2 = x0 + this.edges[1] * Math.cos(-this.angles[2]),
			y2 = y0 + this.edges[1] * Math.sin(-this.angles[2]);

		var retArray = new Array();
		retArray.push([x0, y0]);
		retArray.push([x1, y1]);
		retArray.push([x2, y2]);

		return retArray;

	}

	//返回角度和边信息的字符串
	this.info = function() {
		var angleLabel = ['C', 'A', 'B'];
		var edgeLabel = ['ab', 'bc', 'ac'];
		var s = '';

		for (var i = 0; i < 3; i++) {
			s += edgeLabel[i]+' : ';
			s += this.edges[i].toFixed(2)+' ; ';
		}

		for (var i = 0; i < 3; i++) {
			s += angleLabel[i]+' : ';
			s += (this.angles[i]*180/Math.PI).toFixed(2) + ' ; ';
		}

		return s;
	}

/**
* @usage   解三角形
* @author  mw
* @date    2016年04月16日  星期六  07:50:31
* @param   三角形六元素 [边1, 边2, 边3, 角1, 角2, 角3],角为边所对的角,角度制
* @return  三角形的三个顶点坐标
*
*/

	this.solve = function(elementArray) {
		//document.write(elementArray+'<br/>');
		//元素一共有六个
		var elements = elementArray.length;
		if (elements != 6) {
			return [];
		}

		//待求元素用 '?' 表示
		//如[a, b, c, '?', '?', '?'] 表示已知三边,解三角形。
		var unknows_1 = 0, unknows_2 = 0;
		for (var i = 0; i < elements; i++) {
			if (elementArray[i] == '?') {

				if (i < 3) {
					//边里面的未知数
					unknows_1++;
				}
				else {
					unknows_2++;
				}
			}
		}

		//未知元素超过三个,或是只知道三个角,无法解
		if ( unknows_1 >= 3 || unknows_1+unknows_2 > 3) {
			return [];
		}

		//已知三边
		if (unknows_1 == 0) {
			for (var i = 0; i < 3; i++)  {
				if (elementArray[(i+1)%3] + elementArray[(i+2)%3] <= elementArray[i]) {
					//两边之和小于等于第三边,这是不能形成三角形的。
					return [];
				}
			}
			//已知三边
			return this.know3edges([elementArray[2], elementArray[0], elementArray[1]]);

		}

		if (unknows_1 == 1) {
			//无法使用正弦公式的情况,用余弦公式
			for (var i = 0; i < 3; i++) {
				if (elementArray[i] == '?' &&
					(elementArray[(i+1)%3] != '?' && elementArray[(i+1)%3+3] == '?') &&
					(elementArray[(i+2)%3] != '?' && elementArray[(i+2)%3+3] == '?')) {

					var b = elementArray[(i+1)%3], c = elementArray[(i+2)%3],
						A = elementArray[i+3];
					var a = Math.sqrt(b*b+c*c-2*b*c*Math.cos(A/180*Math.PI));
					elementArray[i] = a;

					break;
				}

			}

			if (elementArray[0] != '?' &&
				elementArray[1] != '?' &&
				elementArray[2] != '?') {
				return this.know3edges([elementArray[2], elementArray[0], elementArray[1]]);
			}

		}

		//至少有两个角已知,可以把三个角都求出来
		if (unknows_2 == 1) {
			for (var i = 0; i < 3; i++) {
				if (elementArray[i+3] == '?' &&
					elementArray[(i+1)%3+3] != '?' &&
					elementArray[(i+2)%3+3] != '?') {
					elementArray[i+3] = 180-(elementArray[(i+1)%3+3]+elementArray[(i+2)%3+3]);
					break;
				}
			}
		}

		//能使用正弦公式的各种情况
		//正弦公式a/sinA = b/sinB = c/sinC =  sinValue
		var sinValue = 0;
		for (var i = 0; i < 3; i++) {
			if (elementArray[i] != '?' && elementArray[i+3] != '?') {
				sinValue = elementArray[i]/Math.sin(elementArray[i+3]/180*Math.PI);
				break;

			}
		}

		//由已知两边一角或三角一边 => 两边两角或三边三角
		for (var i = 0; i < 3; i++) {
			if (elementArray[i] == '?' && elementArray[i+3] != '?') {
				elementArray[i] = sinValue*Math.sin(elementArray[i+3]/180*Math.PI);
			}

			if (elementArray[i] != '?' && elementArray[i+3] == '?') {
				elementArray[i+3] = Math.asin(elementArray[i]/sinValue)/Math.PI*180;
			}

		}

		if (elementArray[0] != '?' &&
			elementArray[1] != '?' &&
			elementArray[2] != '?') {
			return this.know3edges([elementArray[2], elementArray[0], elementArray[1]]);
		}

		//还有角未求得
		for (var i = 0; i < 3; i++) {
			if (elementArray[i+3] == '?') {
				elementArray[i+3] = 180-(elementArray[(i+1)%3+3]+elementArray[(i+2)%3+3]);
				break;
			}
		}

		//由角求边
		for (var i = 0; i < 3; i++) {
			if (elementArray[i] == '?' && elementArray[i+3] != '?') {
				elementArray[i] = sinValue*Math.sin(elementArray[i+3]/180*Math.PI);
			}
		}

		//检验
		for (var i = 0; i < 3; i++) {
			if (elementArray[i+3] <= 0) {
				//角度为负或0,说明给的条件不足以形成三角形
				return [];
			}
		}

		//document.write(elementArray+'<br/>');
		//AB -- BC -- CA
		return this.know3edges([elementArray[2], elementArray[0], elementArray[1]]);
	}

}
</span>

有了它,三角形神马的,对于小伟来说就不算什么了。

<span style="font-size:18px;">	if (1) {

		var r = 20;
        config.setSector(1,1,1,1);
        config.graphPaper2D(0, 0, r);
        config.axis2D(0, 0, 180);  

		var scale = 2;

		//三角形的三边长度
		var a = 3, b = 4, c = 5;
		var triangle = new Triangle();
		var transform = new Transform();
		var array = triangle.solve([42.9, '?', '?', 32, 81.8, '?']);

		shape.angleDraw(transform.translate(array, -200/scale, 0), 'red', scale);
        //shape.areaDraw(array, 'red', scale); 

		//document.write(array+'<br/>');

	}</span>

<span style="font-size:18px;">	if (1) {

		var r = 20;
        config.setSector(1,1,1,1);
        config.graphPaper2D(0, 0, r);
        config.axis2D(0, 0, 180);  

		var scale = 4;

		var triangle = new Triangle();
		var transform = new Transform();
		var array = triangle.solve(['?', 60, 34, 41, '?', '?']);

		shape.angleDraw(transform.translate(array, -200/scale, 0), 'red', scale);
        //shape.areaDraw(array, 'red', scale); 

		//document.write(array+'<br/>');
</span>

<span style="font-size:18px;">	if (1) {

		var r = 20;
        config.setSector(1,1,1,1);
        config.graphPaper2D(0, 0, r);
        config.axis2D(0, 0, 180);  

		var scale = 1.5;

		var triangle = new Triangle();
		var transform = new Transform();
		var array = triangle.solve([134.6, 87.8, 161.7, '?', '?', '?']);

		shape.angleDraw(transform.translate(array, -200/scale, 0), 'red', scale);
        shape.areaDraw(array, 'red', scale); 

		//document.write(array+'<br/>');

	}</span>

<span style="font-size:18px;">	if (1) {

		var r = 20;
        config.setSector(1,1,1,1);
        config.graphPaper2D(0, 0, r);
        config.axis2D(0, 0, 180);  

		var scale = 3;

		var triangle = new Triangle();
		var transform = new Transform();
		var array = triangle.solve([22, 25, '?', 133, '?', '?']);

		shape.angleDraw(transform.translate(array, -200/scale, 0), 'red', scale);
        shape.areaDraw(array, 'red', scale); 

		//document.write(array+'<br/>');

	}
	</span>

如果三角形给的条件不满足形成三角形,小伟的工具是不会画出这个图,但也不会报错的。

来随便画几个三角形玩玩吧:

(1)已知三边

var array = triangle.solve([4, 5, 6, ‘?‘,  ‘?‘, ‘?‘]);

(2) 已知两边和其中一边的对角SSA

var array = triangle.solve([4, 5, ‘?‘,  30, ‘?‘, ‘?‘]);

(3)已知SAS

var array = triangle.solve([4, 5,  ‘?‘,  ‘?‘, ‘?‘, 30]);

(4)AAS

var array = triangle.solve([4, ‘?‘,  ‘?‘,  50, ‘?‘, 30]);

(5) 角边角ASA

var array = triangle.solve([4, ‘?‘,  ‘?‘,   ‘?‘, 50, 30]);

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

时间: 2024-08-25 16:49:34

[从头学数学] 第180节 解三角形的相关文章

[从头学数学] 第215节 带着计算机去高考(七)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月20日 17:13:35, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2006年的江苏省数学高考题]. 这一年,江苏重新使用了全国卷,并且这张试卷的难度也比较高,可以说, 也是打了考生一个措手不及

[从头学数学] 第214节 带着计算机去高考(六)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月20日 11:40:58, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2005年的江苏省数学高考题]. 总体来说,这次的难度和上一年持平,都是很厚道的那种, 不过上一年的好多题都像闹着玩似的,这次

[从头学数学] 第211节 带着计算机去高考(三)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月18日 14:57:54, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2002年的江苏省数学高考题]. <span style="font-size:18px;">#题1 &

[从头学数学] 第174节 算法初步

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了结丹中期的修炼, 这次要修炼的目标是[算法初步]. 正剧开始: 星历2016年04月12日 08:54:58, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[算法初步]. [人叫板老师]指点小伟说:"这金丹要想大成,顺利进入元婴期,就必须进行九转培炼. 这什么是九转培炼法门呢?就是要先快速的修炼[天地人正册]进入后期,不要管各种辅修 功法,然后从头游历[天地人列国],在游历中增长见闻,精炼神通,最后再修炼[术.

[从头学数学] 第172节 直线与方程

剧情提要: [机器小伟]在[project师阿伟]的陪同下进入了结丹初期的修炼. 这次要修炼的目标是[直线与方程]. 正剧開始: 星历2016年04月11日 09:30:00, 银河系厄尔斯星球中华帝国江南行省. [project师阿伟]正在和[机器小伟]一起研究[直线与方程]. 開始今天的修炼之前,小伟先整理了一下这件法器: <span style="font-size:18px;"> if (1) { var r = 20; config.setSector(1,1,1

[从头学数学] 第162节 锐角三角函数

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了筑基后期的修炼, 这次要修炼的目标是[锐角三角函数]. 正剧开始: 星历2016年04月05日 10:20:54, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[锐角三角函数]. 这座塔真的很壮观,不知现在还是否允许游客上去观光. <span style="font-size:18px;"> if (1) { config.setSector(1,1,1,1); var r = 20; c

[从头学数学] 第223节 带着计算机去高考(十五)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月26日 10:23:46, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2014年的江苏省数学高考题]. 这一年的题和上一年一样的难,阿伟决定再交一次白卷. 好,卷子贴完,下面进入这次的主题. 这是

[从头学数学] 第224节 带着计算机去高考(十六)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月26日 16:49:14, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2015年的江苏省数学高考题]. 这一节是是[工程师阿伟]带着[机器小伟]去怀旧高考的收关节点. 所以多少会做几个题来表表心意

[从头学数学] 第221节 带着计算机去高考(十三)

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第八转的修炼.设想一个场景: 如果允许你带一台不连网的计算机去参加高考,你会放弃选择一个手拿计算器和草稿本吗 ?阿伟决定和小伟来尝试一下用计算机算高考题会是怎样的感觉. 正剧开始: 星历2016年05月25日 10:40:52, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起做着2012年的江苏省数学高考题]. 这就是传说中的厄尔斯星球末日那一年的考题,这一年的考题难度绝对是在5.5环以上. 可以从上表