正剧开始:
星历2016年03月06日 10:21:24, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[二元一次方程组]。
正当小伟要进入修炼之中时,[工程师阿伟]的脑海中不知怎么地响起了《摘下满天星》的旋律,总是挥之不去,阿伟掐指一算,知道还是
应该先解决掉一个长期以来的观星疑惑,才能心无旁鹜地陪小伟修炼。
是什么疑惑呢?
先来看下这张图:
这其实是一个球面上的一些点,其实它们很有规律。
这里的每一个点是这样绘制的:
<span style="font-size:18px;">//绘制球体 this.sphere = function(pos/*[x, y, z]*/, r, style) { plot.save(); var p = [].concat(pos); if (p.length == 2) { plot.translate(p[0], -p[1]); } else if (p.length == 3) { var p1 = shape.point3D(p[0], p[1], p[2]); plot.translate(p1[0], -p1[1]); } var r0 = 0.1*r; var grd = plot.createRadialGradient(0, 0, r, 0.3*r, -0.3*r, r0); grd.addColorStop(0, style); grd.addColorStop(1, 'white'); plot.setFillStyle(grd); shape.fillCircle(0, 0, r); plot.restore(); }</span>
当然,这是从上帝视角来看的,完全是一种旁观的情况。
<span style="font-size:18px;">function myDraw() { var config = new PlotConfiguration(); config.init(); config.setPreference(); var r = 10; config.setSector(1,1,1,1); config.graphPaper2D(0, 0, r); config.axis3D(0, 0, 0, 180); var r1 = 80, r2 = 120, r3 = 160; var x, y, z, angle1, angle2; var pArray1 = []; var pArray2 = []; var pArray3 = []; for (var thita = 0; thita < 360; thita+=30) { for (var rho = 0; rho < 360; rho +=30) { angle1 = thita*Math.PI/180; angle2 = rho*Math.PI/180; x = r1*Math.cos(angle1)*Math.cos(angle2); y = r1*Math.sin(angle1); z = r1*Math.cos(angle1)*Math.sin(angle2); pArray1.push([x,y,z]); } } shape.xyzSort(pArray1); var len = pArray1.length; for (var i = 0; i < len; i++) { shape.sphere(pArray1[i], r/2, 'red'); } for (var thita = 0; thita < 360; thita+=30) { for (var rho = 0; rho < 360; rho +=30) { angle1 = thita*Math.PI/180; angle2 = rho*Math.PI/180; x = r2*Math.cos(angle1)*Math.cos(angle2); y = r2*Math.sin(angle1); z = r2*Math.cos(angle1)*Math.sin(angle2); pArray2.push([x,y,z]); } } shape.xyzSort(pArray2); len = pArray2.length; for (var i = 0; i < len; i++) { shape.sphere(pArray2[i], r/2, 'blue'); } for (var thita = 0; thita < 360; thita+=30) { for (var rho = 0; rho < 360; rho +=30) { angle1 = thita*Math.PI/180; angle2 = rho*Math.PI/180; x = r3*Math.cos(angle1)*Math.cos(angle2); y = r3*Math.sin(angle1); z = r3*Math.cos(angle1)*Math.sin(angle2); pArray3.push([x,y,z]); } } shape.xyzSort(pArray3); len = pArray3.length; for (var i = 0; i < len; i++) { shape.sphere(pArray3[i], r/2, 'green'); } }</span>
如果以这个点为中心,上帝视角就变成了:
可以看到,几乎绝大部分的其它单位都跑到左边去了。
<span style="font-size:18px;">function myDraw() { var config = new PlotConfiguration(); config.init(); config.setPreference(); var r = 10; config.setSector(1,1,1,1); config.graphPaper2D(0, 0, r); config.axis3D(0, 0, 0, 180); var r1 = 80, r2 = 120, r3 = 160; var x, y, z, angle1, angle2; var pArray1 = []; var pArray2 = []; var pArray3 = []; //现在假设我们处于r2半径带上的某个位置[r2, 0, 0] //观看到的是什么样的情况? for (var thita = 0; thita < 360; thita+=30) { for (var rho = 0; rho < 360; rho +=30) { angle1 = thita*Math.PI/180; angle2 = rho*Math.PI/180; x = r1*Math.cos(angle1)*Math.cos(angle2); y = r1*Math.sin(angle1); z = r1*Math.cos(angle1)*Math.sin(angle2); pArray1.push([x,y,z]); } } var len = pArray1.length; //目标点是我们的位置 var objectPos = [r2, 0, 0]; //源点是其它物体的位置,它们会产生变化 var sourcePos = []; for (var i = 0; i < len; i++) { sourcePos = pArray1.shift(); pArray1.push([sourcePos[0]-objectPos[0], sourcePos[1]-objectPos[1], sourcePos[2]-objectPos[2]]); } shape.xyzSort(pArray1); for (var i = 0; i < len; i++) { shape.sphere(pArray1[i], r/2, 'red'); } for (var thita = 0; thita < 360; thita+=30) { for (var rho = 0; rho < 360; rho +=30) { angle1 = thita*Math.PI/180; angle2 = rho*Math.PI/180; x = r2*Math.cos(angle1)*Math.cos(angle2); y = r2*Math.sin(angle1); z = r2*Math.cos(angle1)*Math.sin(angle2); pArray2.push([x,y,z]); } } len = pArray2.length; for (var i = 0; i < len; i++) { sourcePos = pArray2.shift(); pArray2.push([sourcePos[0]-objectPos[0], sourcePos[1]-objectPos[1], sourcePos[2]-objectPos[2]]); } shape.xyzSort(pArray2); for (var i = 0; i < len; i++) { shape.sphere(pArray2[i], r/2, 'blue'); } for (var thita = 0; thita < 360; thita+=30) { for (var rho = 0; rho < 360; rho +=30) { angle1 = thita*Math.PI/180; angle2 = rho*Math.PI/180; x = r3*Math.cos(angle1)*Math.cos(angle2); y = r3*Math.sin(angle1); z = r3*Math.cos(angle1)*Math.sin(angle2); pArray3.push([x,y,z]); } } len = pArray3.length; for (var i = 0; i < len; i++) { sourcePos = pArray3.shift(); pArray3.push([sourcePos[0]-objectPos[0], sourcePos[1]-objectPos[1], sourcePos[2]-objectPos[2]]); } shape.xyzSort(pArray3); for (var i = 0; i < len; i++) { shape.sphere(pArray3[i], r/2, 'green'); } shape.sphere([0, 0, 0], r, 'purple'); } </span>
但是我们不是上帝,我们正在这个紫色的单元上,假如我们向左看,会是什么样的景象呢?
这样我们可以认为,越是平行于我们的视线,一般来说离我们越近的可能性越大。但是,你是不可能确定的。
<span style="font-size:18px;">function myDraw() { var config = new PlotConfiguration(); config.init(); config.setPreference(); var r = 10; config.setSector(1,1,1,1); config.graphPaper2D(0, 0, r); config.axis3D(0, 0, 0, 180); var r1 = 80, r2 = 120, r3 = 160; var x, y, z, angle1, angle2; var pArray1 = []; var pArray2 = []; var pArray3 = []; //现在假设我们处于r2半径带上的某个位置[r2, 0, 0] //观看到的是什么样的情况? for (var thita = 0; thita < 360; thita+=30) { for (var rho = 0; rho < 360; rho +=30) { angle1 = thita*Math.PI/180; angle2 = rho*Math.PI/180; x = r1*Math.cos(angle1)*Math.cos(angle2); y = r1*Math.sin(angle1); z = r1*Math.cos(angle1)*Math.sin(angle2); pArray1.push([x,y,z]); } } var len = pArray1.length; //目标点是我们的位置 var objectPos = [r2, 0, 0]; //源点是其它物体的位置,它们会产生变化 var sourcePos = []; for (var i = 0; i < len; i++) { sourcePos = pArray1.shift(); pArray1.push([sourcePos[0]-objectPos[0], sourcePos[1]-objectPos[1], sourcePos[2]-objectPos[2]]); } var tmp = []; for (var i = 0; i < len; i++) { tmp = pArray1.shift(); if (tmp[0]<0) { //从右边往左边看到的点阵列中的投影 pArray1.push(pointRight(tmp[0], tmp[1], tmp[2])); } } //如果点位于目标右侧,就会看不到,因为现在是向左边看 len = pArray1.length; for (var i = 0; i < len; i++) { shape.sphere(pArray1[i], r/2, 'red'); } for (var thita = 0; thita < 360; thita+=30) { for (var rho = 0; rho < 360; rho +=30) { angle1 = thita*Math.PI/180; angle2 = rho*Math.PI/180; x = r2*Math.cos(angle1)*Math.cos(angle2); y = r2*Math.sin(angle1); z = r2*Math.cos(angle1)*Math.sin(angle2); pArray2.push([x,y,z]); } } len = pArray2.length; for (var i = 0; i < len; i++) { sourcePos = pArray2.shift(); pArray2.push([sourcePos[0]-objectPos[0], sourcePos[1]-objectPos[1], sourcePos[2]-objectPos[2]]); } for (var i = 0; i < len; i++) { tmp = pArray2.shift(); if (tmp[0]<0) { //从右边往左边看到的点阵列中的投影 pArray2.push(pointRight(tmp[0], tmp[1], tmp[2])); } } //如果点位于目标右侧,就会看不到,因为现在是向左边看 len = pArray2.length; for (var i = 0; i < len; i++) { shape.sphere(pArray2[i], r/2, 'blue'); } for (var thita = 0; thita < 360; thita+=30) { for (var rho = 0; rho < 360; rho +=30) { angle1 = thita*Math.PI/180; angle2 = rho*Math.PI/180; x = r3*Math.cos(angle1)*Math.cos(angle2); y = r3*Math.sin(angle1); z = r3*Math.cos(angle1)*Math.sin(angle2); pArray3.push([x,y,z]); } } len = pArray3.length; for (var i = 0; i < len; i++) { sourcePos = pArray3.shift(); pArray3.push([sourcePos[0]-objectPos[0], sourcePos[1]-objectPos[1], sourcePos[2]-objectPos[2]]); } for (var i = 0; i < len; i++) { tmp = pArray3.shift(); if (tmp[0]<0) { //从右边往左边看到的点阵列中的投影 pArray3.push(pointRight(tmp[0], tmp[1], tmp[2])); } } //如果点位于目标右侧,就会看不到,因为现在是向左边看 len = pArray3.length; for (var i = 0; i < len; i++) { shape.sphere(pArray3[i], r/2, 'green'); } shape.sphere([0, 0, 0], r, 'purple'); }</span>
<span style="font-size:18px;">this.point3D = function(x0, y0, z0) { //canvas中y轴坐标向下为正,与笛卡尔坐标系相反 //所以此处先取反 // z0 = z0 /2; x0 = x0 - z0*0.707; y0 = y0 + z0*0.707; return [x0, y0]; } //左视投影,此时x坐标是无所谓的 this.pointLeft = function(x0, y0, z0) { return [z0, y0]; } //右视投影 this.pointRight = function(x0, y0, z0) { return [-z0, y0]; } //俯视投影 this.pointTop = function(x0, y0, z0) { return [x0, -z0]; } //仰视投影 this.pointBottom = function(x0, y0, z0) { return [x0, z0]; } //主视投影 this.pointFront = function(x0, y0, z0) { return [x0, y0]; } //后视投影 this.pointBack = function(x0, y0, z0) { return [-x0, y0]; }</span>
对于简单的二元一次方程组,当然可以用两条直线的交点来表示它的解。
<span style="font-size:18px;">function myDraw() { var config = new PlotConfiguration(); config.init(); config.setPreference(); var r = 20; config.setSector(1,1,1,1); config.graphPaper2D(0, 0, r); config.axis2D(0, 0, 180); var xArray = [-300/r, 300/r]; var yArray = [-150/r, 150/r]; var array = []; var array2 = []; //x+y=10 ==> y = 10-x for (var i = 0; i < xArray.length; i++) { array.push(xArray[i], 10-xArray[i]); } //2*x+y=16 ==> y = 16-2*x for (var i = 0; i < xArray.length; i++) { array2.push(xArray[i], 16-2*xArray[i]); } shape.multiLineDraw(array, 'red', r); shape.multiLineDraw(array2, 'blue', r); shape.sphere([6*r,4*r], r/2, 'purple'); }</span>
<span style="font-size:18px;">//例1 function myDraw() { var config = new PlotConfiguration(); config.init(); config.setPreference(); var r = 20; config.setSector(1,1,1,1); config.graphPaper2D(0, 0, r); config.axis2D(0, 0, 180); var xArray = [-300/r, 300/r]; var yArray = [-150/r, 150/r]; var array = []; var array2 = []; // for (var i = 0; i < xArray.length; i++) { array.push(xArray[i], xArray[i]-3); } // for (var i = 0; i < xArray.length; i++) { array2.push(xArray[i], (3*xArray[i]-14)/8); } shape.multiLineDraw(array, 'red', r); shape.multiLineDraw(array2, 'blue', r); shape.sphere([2*r,-1*r], r/2, 'purple'); }</span>
<span style="font-size:18px;">def tmp(): #未知数系数 a = np.matrix([[1, -1], [3, -8]]); #值 b = np.array([3, 14]); #方程的解 c = np.linalg.solve(a, b); print(c); >>> [ 2. -1.]</span>
<span style="font-size:18px;">#例3 >>> [ 6. -0.5] def tmp(): #未知数系数 a = np.matrix([[3, 4], [5, -6]]); #值 b = np.array([16, 33]); #方程的解 c = np.linalg.solve(a, b); print(c);</span>
<span style="font-size:18px;">#探究3 120*1.2*x+110*1.2*y=97200 10*1.5*x+20*1.5*y=15000 =>x= y= >>> [ 400. 300.] >>> 300*8000-400*1000-97200-15000 1887800</span>
<span style="font-size:18px;">def tmp(): #未知数系数 a = np.matrix([[120, 110], [10, 20]]); #值 b = np.array([97200/1.2, 15000/1.5]); #方程的解 c = np.linalg.solve(a, b); print(c);</span>
<span style="font-size:18px;">def tmp(): #未知数系数 a = np.matrix([[1,1,1], [1,2,5], [1, -4, 0]]); #值 b = np.array([12, 22, 0]); #方程的解 c = np.linalg.solve(a, b); print(c);</span>
<span style="font-size:18px;">def tmp(): import numpy as np; #未知数系数 a = np.matrix([[3,0,4], [2,3,1], [5,-9,7]]); #值 b = np.array([7,9,8]); #方程的解 c = np.linalg.solve(a, b); print(c);</span>
<span style="font-size:18px;">function myDraw() { var config = new PlotConfiguration(); config.init(); config.setPreference(); var r = 30; config.setSector(1,1,1,1); config.graphPaper2D(0, 0, r); config.axis3D(0, 0, 0, 180); var xArray = [-300/r, 300/r]; var yArray = [-150/r, 150/r]; var array = []; var array2 = []; var array3 = []; // for (var i = 0; i < xArray.length; i++) { array.push(shape.point3D(xArray[i], 0, (7-3*xArray[i])/4)); } // for (var i = 0; i < xArray.length; i++) { array2.push(shape.point3D(xArray[i], yArray[i], 9-2*xArray[i]-3*yArray[i])); } // for (var i = 0; i < xArray.length; i++) { array3.push(shape.point3D(xArray[i], yArray[i], (8-5*xArray[i]+9*yArray[i])/7)); } shape.multiLineDraw(array, 'red', r); shape.multiLineDraw(array2, 'blue', r); shape.multiLineDraw(array3, 'green', r); //shape.sphere([2*r,-1*r], r/2, 'purple'); }</span>
即使能求得交点,也很难看出具体的坐标值。毕竟是三个平面相交的交点。
所以还是老老实实地直接求解吧:
本节到此结束,欲知后事如何,请看下回分解。