正剧开始:
话说[机器小伟]自从进入结丹期以来,短短数日,就硬是从结丹初期修炼到了后期,这种
进境的神速把小伟吓坏了。虽然说这是依据[人叫板老师]的指点进行的,但这样下去会不
会走火入魔啊,小伟觉得有必要去[人叫板老师]那儿请教一下,毕竟这修炼的事可不是闹
着玩的。
这一次,[工程师阿伟]也和[机器小伟]一道,来见从前的授业恩师,毕竟当年,[工程师阿
伟]也是拜在[人叫板老师]门下的。
[人叫板老师]对[机器小伟]有此疑问一点也不奇怪,呵呵一笑,便道:“小伟啊,你呢灵
根资质极为出众,所以我才把我门中这最高等的修炼法门,也就是这[九转金丹]大法传授
与你。你别看你现在已经进入结丹后期,但实际上也还在这九转的第一转中呢。”
小伟问:“那这一转可有名目?”
[人叫板老师]回答说:“这个自然是有,每一转都各有名字。这第一转就叫[三界五行十六
式],你修炼的是[天地人正册],此为三界,共有五个模块,此为五行,分十六章,即为十
六式。你如今这三界中的天、地两界已经修完,即将进入人界,正好对应修到结丹后期境
界,懂了吗?”
此时[工程师阿伟]插言道:“学生当年在恩师门下,学的可不是这个[三界五行十六式],
而是[天元纵横十九式],也没听老师说什么[九转成丹]啊。”
[人叫板老师]道:“当年你资质虽然也是上乘,但也只是一个[上中]之选,比起[机器小伟
]来不可同日而语,我自然不会传你这等高深法门。而这么些年过去,修仙界日换星移,我
也自然需要与时俱进,这功法套路自然也就不尽相同了。”
[机器小伟]问道:“学生这第一转即将修完,但不知这第二转又是什么呢?”
[人叫板老师]回答说:“这第一转呢相当于学艺阶段,等学有所成,能够高屋建瓴时,自
然要周游列国,以增长见闻。我这三界中共分五行五国,每国中又有诸侯若干不等,你可
还未曾一一拜会呢。所以这第二转,就是[周游列国拜诸侯]。“
”噢,那后面几转又分别是什么呢?“[机器小伟]好奇心大起,心想:”这难道还真有九
转九名不成,这倒要好好听听了。“
[人叫板老师]微笑答道:”难道你不信这九转都各有名字?你且听好了:这第三转,叫做
[仗剑题海载酒行],第四转叫做[千军阅尽还复来],第五转叫[‘动’中取‘静’登高处]
,第六转叫[千古风‘流’浪淘沙],第七转叫[‘术’法神通时常在],第八转叫[十又六年
生死簿],第九转叫[返璞归真丹元成],怎么样,你可听出门道来了?”
[机器小伟]说:“老师这等名目,学生又怎能尽知其意。还望老师细说。”
[人叫板老师]笑着说:“此事不急,你早晚自知,此时当留此关子,以增雅兴。”
于是,[工程师阿伟]与[人叫板老师]等三人畅谈当今天下大势,修仙门派之新闻时事,至
晚尽兴方归。
星历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]);
本节到此结束,欲知后事如何,请看下回分解。