1.问题
1.1 跳一跳
技术训练只有通过实践中才能完成,仅仅看书做习题是不够的。学生训练技术,有真实的项目当然最好。不过研究生一年级的同学一时还不能在项目中做出足够贡献,加中培训和管理上的开销,提后腿也极有可能。所以,我们找个小项目“跳一跳”模仿一下,提高代码量。
跳一跳中涉及一个可以从代码中抽离出来的问题,剥离出来交给了GYB同学完成,锻炼数学模型应用、工程管理中的项目进度跟踪和控制,以及技术文档写作。
跳一跳是个伪3D游戏,观察者固定在斜上45度,视角不能旋转。涉及到的具体问题是,三维空间中的抛物线如何在二维屏幕中绘制出来。
1.2 绕过问题
在解决跳一跳中的这个问题过程中,我再次发现同学们的一个不良习惯,就是绕过问题。
很多年来,我发现同学们在没有确定否定论证的情况下,习惯于”绕过问题”。你如果问,能”确定解决么”,他说“不能”。你如果问,“确定不能解决么”,他也说“不能”。就是打算换条路,在这条路还没有走到死胡同的情况下。“也许另一条路行吧”,这样的心理,伴随着“也许这条路不行吧”做出绕路的决定。在大一点的颗粒度中如此,在以几分钟为单位的任务中,也是这样。这些小任务中的犹豫、模棱两可,导致不敢怼人,被怼时也只有情绪没有反击的逻辑。
在一起工作时,我经常希望同学们能有”断然的决心”去做实验,或者去否定。”不知道”的状态不可取,在”不知道”的情况下冒然决定退出,就和冒然决定进攻,一样地不负责任。
什么情况下能确定可以退出这条技术路线呢?花了足够的时间,或者所剩时间不多,有时是可接受的理由。这是出于项目的时间成本和截止期限考虑。
还有时同学们对导师、专家、上级工程师的否定非常恼火,”你怎么就知道不行”。这个问题的答案和决定退出某条技术践线的答案是相同的。就是 技术可行性。当确认技术没有可行性时,就是放弃的时机。如果在开始之前就论证了技术不可行,那么就没有必要开始,也就避免了浪费时间。
所谓技术不可行,不是具体的“你”做不出来,而是要说明沿着这条技术路线,任何人也做不出来。这就是要证明导师、上级工程师部署的技术路线是错的。至于任务本身,永远是正确的。
在本次作业中,我感到有必要用一个实例展示,什么样的才是技术不可行,以及在失败的任务中,我们能留下些什么。
2.涉及的概念
2.1 投影
有同学认为,抛物线,画出来不就完了么。水平初速度不变,垂直方向上有重力加速度。那是现实世界,在软件实现中还需要计算机图形学。
如下图,现实世界三维空间中一只真实的手把一张纸按在一本真实的书上。从书的近大远小中我们可以看出,整张照片存在透视失真,所以纸张也是近大远小的,抛物线当然也是。
但是人类可以借由脑补想像出这张纸上画了一条抛物线,不是近大远小的,而是如下图这样。
这是三维空间中抛物线做俯视投影的结果。
投影是三维空间到二维间空的运算,需要借由机器来完成,而不由人脑负责。投影在计算机图形学和程序设计实现中,使用矩阵乘法来完成。下文有对于矩阵乘法稍微详细一点的解释。
2.2 正等测
正等测,是把如上的抛物线投影成下面这张照片的样子。同时,图中把右手系XYZ三个轴也做了正等测投影。
你可能仍然觉得这是三维空间的图形。下图是我从上图描出的,去除了无关细节。图中三个坐标轴,把360度均分为3等份,用量角器容易测出,每份120度。也就是说,原来垂直90度的三个坐标轴,在变换后是平面内的120度。以这样的思路观察,下图中的“抛物线”则更明显是二维平面(你的显示器)中的一条曲线,它的顶点并不在起点和终点的正中间,与原来的抛物线不同。甚至不能一眼就看出来是不是抛物线。
根据正等测的定义[https://en.wikipedia.org/wiki/Isometric_projection],对抛物线的每个点做如下操作: (1)先绕y轴旋转 45度,(2)然后绕x轴35.264度,(3)最后向xy平面投影。35.264度这个有零有整的数字,是因为arcsin(tan 30°)大约是这个角度,目的是原来的坐标轴完成两次旋转后,刚好与原本的正方体不在同一表面上的两个顶点(下图中的红线连接的两个顶点)重合。也就是说,正等测是从这两个顶点的连线的角度,即这两个顶点看起来刚好是重合的。
上图的立方体正等测以后看起来如下图(来自wikipedia)。立方体共8个顶点,图中可以看到7个,其中一个在正中间(也是标注120度角的顶点),另外6个投影后是六边形的6个顶点。有一个顶点看不到,在正中间顶点的后面,在视线中与正中间的顶点重合。
2.3 变换矩阵
《计算机图形学》教材上提到,二维/三维图形的平移、旋转、扭转、错切等变换,都可以通过对空间中的点的齐次坐标做矩阵乘法完成。
我手头的教材是下图这本,在豆瓣和京东上都查不到,我怀疑我买了本假书。
2.3.1 点的变换
设置点的齐次坐标为
(x y z 1),以下矩阵乘法能完成关于 Z 轴进行对称变换。
使用矩阵的好处是所有变换运算都是矩阵乘法,不必每个单独考虑,需要哪个变换就用对应的矩阵。
2.3.2 隐函数形式曲线的变换
曲线的变换,方法1,可以先采样,即把模拟、连续的曲线离散化,然后对每个采样点做变换。曲线的采样的变换,等价于曲线的变换的采样(什么原理?)。
曲线的变换的另一种方法,方法2,先对曲线变换后再采样。在孙家广老师的教材中,是“7.3.3 参数图形的几何变换”。这里的参数图形,当指由参数控制形状的图形,而不是参数方程。
例如,隐函数形式的特定抛物线方程,如下。
这一方程可以表示为矩阵乘法的形式,下面3个矩阵相乘的结果就是上式的等号左侧,x^2-y。
参见[https://en.wikipedia.org/wiki/Matrix_representation_of_conic_sections]
因为z值是任意的,所以方程形成一个抛物面,如下图中橙色曲面所示。蓝色平面是z==0,即XOY平面,用于帮助我们读图。
抛物面沿X轴向左平移1,得到下图。橙色是抛物面,蓝色是没有参与旋转的XOY平面,用于帮助读图定位。
式中第2个矩阵与采样点沿x轴平移的变换矩阵是相同的,第4个矩阵是这一变换矩阵的转置,第1、3、5个矩阵是方程x^2-y的矩阵表示形式。
以下这段是矩阵及矩阵转置连乘的几何意义,不熟悉mathematica语法的读者请跳过。熟悉这些知识的同学,以下我的猜测,没有找到依据,如果您发现有错,恳请能告诉我。
(1) 三维齐次坐标 矩阵和方程间的转换
In[19]:= A = {{a, b/2, d/2, h/2}, {b/2, c, e/2, j/2}, {d/2, e/2, g, k/2}, {h/2, j/2, k/2, f}} Out[19]= {{a, b/2, d/2, h/2}, {b/2, c, e/2, j/2}, {d/2, e/2, g, k/2}, {h/2, j/2, k/2, f}} In[21]:= Expand[L.A.R] Out[21]= {{f + h x + a x^2 + j y + b x y + c y^2 + k z + d x z + e y z + g z^2}}
(2)矩阵及矩阵转置连乘的几何意义
第一
L.RZ.A.Transpose[RZ].Transpose[L]
L是{x,y,z,1},几何意义是任意一个点。
L.RZ 得到 {x',y',z',1},是这个点的变换。
以上是几何变换中常用的。
Transpose[RZ].Transpose[L],Transpose[L]左乘RZ的转置,几何上等价于于Transpose[L]右乘RZ,得到{x',y',z',1}的转置。
L.RZ.A.Transpose[RZ].R
变成
{x',y',z',1}.A.Transpose[{x',y',z',1}]
第二
{x',y',z',1}.A.Transpose[{x',y',z',1}]与L.A.R的形式相同,
其中{x',y',z',1}是{x,y,z,1}的变换。
L.A.R,根据矩阵乘法得到 f(x,y,z)。
In[19]:= A = {{a, b/2, d/2, h/2}, {b/2, c, e/2, j/2}, {d/2, e/2, g, k/2}, {h/2, j/2, k/2, f}} Out[19]= {{a, b/2, d/2, h/2}, {b/2, c, e/2, j/2}, {d/2, e/2, g, k/2}, {h/2, j/2, k/2, f}} In[21]:= Expand[L.A.R] Out[21]= {{f + h x + a x^2 + j y + b x y + c y^2 + k z + d x z + e y z + g z^2}}
2.3.3 参数方程形式曲线的变换
抛物线x^2-y==0的参数方程为
在Mathematica中,参数方程表示为
tf = {t, t^2, 0, 1}
变换矩阵表示为
T = {{0.7071, 0, -0.4082, 0}, {-0.7071, 0, -0.4082, 0}, {0, 0, 0.8165,0}, {0, 0, 0, 1}}
对参数方程做正等测变换
tf.T
得到
{0.7071 t - 0.7071 t^2, 0, 0. - 0.4082 t - 0.4082 t^2, 1}
即参数方程
注:参数方程的方法是由典同学提供的。在请教他以前,我把“参数图表”误读为参数方程,已尝试了9个小时以上。典同学花了20分钟不到,给出了上述方案,这20分钟还包括学习正等测是什么,以及复杂mathematica语法的时间。没有他的指导,我还在隐函数的沼泽挣扎。事实上,我又花了10小时以上,想找到隐函数的可行之路,直到认定这条技术路线不可能。所以,才有了这篇博客,目的是给出失败的过程,以及说明在什么情况下才能认定可以放弃。
2.3.3 Mathemathica
本文中的运算和推导使用了数学工具Mathematica做符号计算和矩阵运算,这一工具由典同学再三推荐多次。的确非常有力而精美。
3. 技术路线
求三维空间中的正等测投影,计划分成以下几个步骤。
(1)三维空间中的抛物线ab0是抛物面a0与平面b0的交线。特别的,在跳一跳中,是z值任意的抛物面a1与z==0平面即XOY平面b1的交线。
(2)对抛物面a1做正等测(前两步,绕轴旋转不投影)变换得到a2; 对XOY平面b1做正等测(前两步,绕轴旋转不投影)变换得到b2。
(3)把a2与b2的交线投影到XOY平面,所得曲线ab3为a0与b0的交线的正等测投影。
涉及到的技术包括: 抛物面的隐函数和矩阵表示、平面的隐函数和矩阵表示、正等测投影的矩阵乘法、隐函数的旋转、复合变换、代表交线的方程组、投影。
4.技术路线实施过程
实施过程记录的原则包括利(1) 原理及对原理的实验验证,(2)为方便实验重现而应公开的技术手段,包括依赖的原理(模式)、预期的实验结果、实验条件、实验中每一步的方法、每一步的结果,结合原理对实验结果的解释,(3)实验成功还是失败,或者说,不使用成功或失败这样的表达方法,而是描述为实验符合预期、实验结果与预期不符。
实验的目是的旁证或证伪猜测,而不是为了探索。所以实验的结果一定是有预期的,实验结果要么符合预期,说明猜测不是错的(也不见得是对的),要么不符合预期,则证伪了猜测。
4.1 抛物面
L={{x,y,z,1}} R={{x},{y},{z},{1}} A={{a,b/2,0,d/2},{b/2,c,0,e/2},{0,0,0,0},{d/2,e/2,0,f}} a=1;b=0;c=0;d=0;e=-1;f=0 ContourPlot3D[{L.A.R==0},{x,-2,2},{y,-2,2},{z,-2,2},AxesLabel->{X,Y,Z}]
其中L.A.R是抛物线隐函数形式的矩阵表示。
4.2 XOY平面
Z={{0,0,0,0},{0,0,0,0},{0,0,0,1/2},{0,0,1/2,0}} ContourPlot3D[{L.Z.R==0},{x,-2,2},{y,-2,2},{z,-2,2},AxesLabel->{X,Y,Z}]
其中L.A.R是XOY平面的隐函数形式的矩阵表示。
4.3 抛物面与平面相交的几何直观
ContourPlot3D[{L.Z.R==0,L.A.R==0},{x,-2,2},{y,-2,2},{z,-2,2},AxesLabel->{X,Y,Z}]
如下图所示,方程组{L.Z.R==0,L.A.R==0}即{x^2-y==0,z==0}的几何含义是平面与抛物面的交线。
4.4 验证矩阵乘法实现平移变换
以上验证了隐函数的矩阵表示。如果画出的图形与期待的不一致,那么隐函数的矩阵表示就是错的。如果画出的图形与期待的完全一致,并不增加任何信息,只是旁证。Mathematica以及设计实验动手的价值,在于尽力证伪某个观点。在这个案例中,被检验的观点是 隐函数的矩阵表示是正确的。
接下来验证用矩阵乘法点的平移变换,作为矩阵乘法实现变换的特例。如果矩阵乘法变换的结果并非平移,那么矩阵乘法与变换间就不是等价的。
点(x,y,z)的齐次坐标形式,沿Y轴平移0.5。
在Mathematica中,输入如下代码,等价于上面的矩阵相乘。
所得结果{{x, 0.5 + y, z, 1}}表明,纵坐标数值增加0.5,即偏移0.5。实验结果旁证用矩阵乘法与平移是等价的。
4.5 隐函数的变换
具有隐函数形式的图形的变换,先变换后采样,相比先采样后变换,性能更高。因为先变换后采样矩阵乘法只做1次,时间复杂度是O(1); 先采样后变换涉及矩阵乘法的次数随采样点增加而增加,时间复杂度是O(n)。
设隐函数的矩阵表示形式为 L.A.R, 要做变换的矩阵为T,那么隐函数变换为 L.T.A.T的转置.R。
In[90]:= MX = {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {2, 0, 0, 1}} Out[90]= {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {2, 0, 0, 1}} In[70]:= L.A.Transpose[L] Out[70]= {{x^2 - y}} In[102]:= Expand[L.MX.A.Transpose[MX].Transpose[L]] Out[102]= {{4 + 4 x + x^2 - y}}
变换前的原图(用[https://www.wolframalpha.com/]绘制)为
变换后即(用[https://www.wolframalpha.com/]绘制)
4.6 隐函数的变换的复合
假设知道什么“基本”运算,我们发现对于隐函数表示的图形A,当可以表示为下述形式时
L.A.R
对A所做的“基本”运算可以以如下形式表示。
L.T.A.Traspose[T].R
其中Traspose[T]是T的转置。
在教材中查到的基本运算包括平移、旋转、放大缩小等。绕X轴或Y轴或Z轴旋转,不是基本运算,需要分解为(1)平移至轴M1,(2)绕轴旋转RX,(3)平移回原位M2。这三步运算的复合表示为如下形式。
L.M1.RX.M2.A.Traspose[M2]. Traspose[RX].Traspose[M1].R
(我不知道什么是“基本”运算,求助。)
4.7 正等测变换矩阵分解
正等测变换矩阵为
代码形式MatrixForm[{{0.7071, 0, -0.4082, 0}, {-0.7071, 0, -0.4082, 0}, {0, 0, 0.8165, 0}, {0, 0, 0, 1}}]。
分解为绕Z轴旋转、绕X轴旋转、向XOY投影。观察角度不同,所以与本文中此前引用的wikipedia中的不同。
RZ = {{1/Sqrt[2], 1/Sqrt[2], 0, 0}, {-(1/Sqrt[2]), 1/Sqrt[2], 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}
RX = {{1, 0, 0, 0}, {0, Sqrt[2/3], -(1/Sqrt[3]), 0}, {0, 1/Sqrt[3], Sqrt[2/3], 0}, {0, 0, 0, 1}}
PXY = {{1, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}
N[MatrixForm[RZ.RX.PXY]]
顺便一提,正等测变换矩阵的精确解为
4.8 正等测变换矩阵实例
(1)原始图形为抛物面与XOY平面。
ContourPlot3D[{L.A.Transpose[L]==0, L.Z.Transpose[L]==0},{x,-2,2},{y,-2,2},{z,-2,2},AxesLabel->{X,Y,Z}]
ContourPlot3D[{L.RZ.A.Transpose[RZ].Transpose[L]==0, L.RZ.Z.Transpose[RZ].Transpose[L]==0},{x,-2,2},{y,-2,2},{z,-2,2},AxesLabel->{X,Y,Z}]
我们注意到XOY平面相对Z旋转时,变换结果与原图相同。XOY平面与抛物面交线所得抛物线的轴由原图中的平行于Y轴旋转为穿过图中(2,2,0),转过45度。
(2)绕X轴(图中为横轴) 旋转arcsin(tan 30°)约合264度。
ContourPlot3D[{L.RZ.RX.A.Transpose[RX].Transpose[RZ].Transpose[L]==0, L.RZ.RX.Z.Transpose[RX].Transpose[RZ].Transpose[L]==0},{x,-2,2},{y,-2,2},{z,-2,2},AxesLabel->{X,Y,Z}]
我们注意到原图中蓝色的XOY平面穿过右上角顶点(2,2,2)和(-2,-2,-2)。从对角线(2,2,2)到(-2,-2,-2)看去,蓝色平面是一条直线。下图为上图手动旋转变换视角,可以看到蓝色平面看起来是右上到左下的直线。
下图中的绿线是手动标注的,从这个视角看,得到抛物面和蓝色原XOY平面的的交线在XOZ平面的投影。这一投影即原图中抛物线 y=x^2 在正等测结果。
4.9 交线方程组的矩阵表示
Z平面做正等测前两步(两次旋转,不含投影到XOY)得到矩阵可以表达为方程(我们称为a)。
抛物面做正等测前两步(两次旋转,不含投影到XOY)得到矩阵可以表达为方程(我们称为b)。
方程a与方程b联立的方程组如果可以表达为矩阵形式,就可以再利用隐函数(矩阵形式)变换的方法向XOY平面投影,从而完成正等测运算。这时我们遇到了解决不了的困难,是找不到方法把方程组表达为矩阵形式。形如L.A.R的形式似乎是方程所特有的,方程组并不能用。
这是本文最主要的写作目的: 在什么情况下我们可以停下来——当我们走投无路,理论(或者我们再无办法)。判定可以停下来的出口条件包括,能够清楚描述遇到的障碍,并且能够说明面对这一障碍时我们作了哪些尝试(以及这些尝试的理论来源)、结果。
这样,一旦幸运地遇到位高手,他就会知道这些这些这些我们都已了解到了,因为资料的开放,他容易判断出在某某处我们推导错了,或者某某情况我们没有考虑到,因此得到了错误的结果。或者他根据我们开放的资料也做出相同的结论,即这个方法是不可行的。不会出现那样的情况,高手说,其实你那么试一下估计就行了,你说“我试过了,只是报告里没有提到”,浪费了高手的时间。或者更糟糕的,你所说的“我试过了”由于表达粗糙,加之对高手给出的方案理解错误,所以错失了可行的手段。你以为不行,是因为你没有理解高手的路线。详尽地披露实验过程,有利于接受质询和指导。在我们的文化中,习惯于隐藏以获得信息不对称带来的利益,比如避免丢脸。但是技术问题是科学问题,不会因我们的隐藏而放过我们,当别人能实现我们声称做不到的工作时,才是更丢脸的时候。
对于方程组的矩阵表示我作了如下尝试。
(1)方程两侧分别相减、相乘
这种方法也是教材和网上一些资料中提到的。如果方程左右两边分别相减,按右侧为0的表达方法,右侧仍然是0。这一方法的理论来源应该是高斯消元。不过在左右相减的过程中,把方程a和方程b的左边都为0退化为方程a或方程b的左边任何一个为0,条件弱化了。所以,得到的结果不是抛物面与平面的交线,而是抛物面以及平面的组合。
(2)解出每个方程的根,然后令这些根之间相等
这种方法是典同学给出的。比如,每个方程都假设y是已知量,用y表示x。解出x以后,两个方程的x相等。这在几何上的意义就是两个方程的x和x、y和y一一对应的分别相等。
这一方法的实施,即下文提到的“引入参数方程”。
(3)换个维度
如果从线性代数的角度看,所有的方程组都是更高维度的方程。这是数据与统计学院LBH老师在去北京的夜车上听完我的问题,第二天肯德基早餐时给出的方案。这一方案不适合于我的原因是,这样的高维方程不能写成三维齐次坐标系的矩阵形式。
(4)引入参数方程
教材和网上不少贴子都提到,把其中一个面写成参数方程形式,然后把x,y,z代入另一个方程。参数形式与隐函数形式联立的含义,相当于两个方程联立,解出一个方程。在方程1中的(x1,y1,z1)与方程2中的(x2,y2,z2),具有关系 x1==x2 && y1==y2 && y1==y2。
这一方案的问题是,在这时我已经得到了典同学给出的对“抛物线的正等测投影解析解”的答案,是用参数方程。他的方法从最开始就用参数方程表示抛物线,然后把抛物线乘以正等测变换矩阵。如果从一开始我就用了参数方程,就不会绕路走这么复杂的隐函数路线。走隐函数路线的一个原因,正是希望不用参数方程得到解析式——或者证明这条路线是不可行的。如果再回到参数方程,就相当于此路不通,不过从头就用参数方程。
(5)各种交线投影
网上不少资料,如[https://www.wesiedu.com/zuoye/6686898241.html],把投影视为一种特殊的运算。这时,不必给出方程组的矩阵形式,接下来也不用矩阵表示变换。这些投影的特殊之处在于,只需要把某个坐标的值改为0。比如向XOY投影,就是Z值变为0。这一方案的问题在于,违背了我们最初的一个动机,希望得到更一般的形式。GYB同学的方法,用四点表达圆锥曲线,我希望作为单独的路线,原因也在于此。因为GYB同学的方法只特别的对圆椎曲线有效,就像投影的方法只对投影有效,不具有更一般的意义。从工程的角度,对于跳一跳,数值解查表法足够了,并不需要解析解。
(6)只画线,不求解方程组
网上不少资料给出了画线的方法,但是并不解方程组。接下来原本的计划是想用矩阵形式表达方程,然后用矩阵做变换。只画线而不得到方程,不满足要求。
这样的资料如[https://mathematica.stackexchange.com/questions/5968/plotting-implicitly-defined-space-curves],
以及[https://www.zhihu.com/question/27820638]。
4.10 投影
这一小节,是从计划时就给了的,就像小学老师要求写作文时列大纲。只是因为上一步无法完成,这一步就无法抵达。
仍然保留这一小节的意义,是希望展示 技术路线的实施是以计划为前提的,而不是走一步看一步,走到哪算到哪。
5. 障碍小结
RH同学提到过某个项目非常快的失败了,挺遗憾的感觉。在我看来,项目能快点失败是件好事,避免消耗更多的资源,如果最终仍然会失败的话。工程是以逐利为目的,这是工程上纯功利的看法。如果会失败,请尽快。除此以外,失败的项目才是主流,大多数项目都或多或少失败了,而完成成功的非常少。这些失败带给我们的教益,远比成功要大。即使你按成功的项目的方法再来一次,也不见得成功。但是你按失败的方法再来一次,一定失败。所以对于失败的认识非常可靠,可靠地指导我们未来的实践。
因此,知道卡在哪里,因何而失败,需要解除哪些障碍才能继续。这些总结非常重要。
5.1 隐函数变换的结果是0==0
这是典同学否定隐函数的第二个原因。第一个原因是他不喜欢。
如果变换是不可逆的,在变换中会出现变换结果为方程左右两边都是0,从而方程不再是对未知量的约束。这种情况下,变换的结果不再是方程,所以就做不下去了。我通过改变旋转方程绕过这个问题。即为变换做了特定的参数约束,保证可以继续推算。
5.2 变换所得2个曲面的交线是方程组,不能得到隐函数据的矩阵表示
这个障碍我没有绕过。除非使用参数方程,我无法得到隐函数的矩阵表示。因为我打算只使用隐函数解决这一问题,如果使用参数方程就证明我的路线不行,所以这一路线就此搁浅。
6. 致谢
刘典先生
没有他的帮助,我们极大可能无法解决这一问题。后来,我们沿着他指导的路线继续,放弃了本文尝试的方法。
GYB同学
他具体尝试了我的错误路线和刘典的参数方程路线。他告诉我需要更多了解卡住的细节、进度,以及在沟通方面我仍需努力。
DQT同学
她描述需求,给出需求对问题的约束,还提供了棋子小人翻着跟头在正等测空间中划出的抛物线。
LDT同学
他尝试给出垂直平面的直角坐标系上的二维分解,使我明白三维视角、正等测视角的解释是个艰难的问题。
7. 参考资料
[1]孙家广: 计算机图形学(第三版),清华大学出版社
本文中所有“教材”二字,均指此书。
[2]GYB同学分别给出的数值解和解析解求法
[https://www.cnblogs.com/gaoyb348/p/9032907.html]
[https://www.cnblogs.com/gaoyb348/p/9042867.html]
[https://www.cnblogs.com/gaoyb348/p/9074304.html]
[3]当你说不行时,你应该说些什么:以Android播放midi为例
[https://blog.csdn.net/younggift/article/details/6922905]
[4]郭绍仲.轴测投影变换矩阵的研究[J].工程图学学报,1989,(2):17-24.
[5 ]计算机图形学 学习笔记(八):三维图形变换:三维几何变换,投影变换(平行/ 透视 投影)
[https://blog.csdn.net/jurbo/article/details/75041230]
------------------------------------------------------
博客会手工同步到以下地址:
[http://zhuanlan.zhihu.com/younggift]
[https://younggift.net/]
//[http://blog.csdn.net/younggift]
//[http://giftdotyoung.blogspot.com]