﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-魔のkyo的工作室-随笔分类-Math</title><link>http://www.cnitblog.com/luckydmz/category/8871.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 09 Jul 2014 15:32:41 GMT</lastBuildDate><pubDate>Wed, 09 Jul 2014 15:32:41 GMT</pubDate><ttl>60</ttl><item><title>从Hermite插值公式推导Smoothstep插值公式</title><link>http://www.cnitblog.com/luckydmz/archive/2014/06/23/89615.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Mon, 23 Jun 2014 04:12:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2014/06/23/89615.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/89615.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2014/06/23/89615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/89615.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/89615.html</trackback:ping><description><![CDATA[shader里面有个函数叫smoothstep，是用来做平滑插值的，dx的文档对其介绍如下<br />
<br />
<div>
<h1>smoothstep (DirectX HLSL)</h1>
<p>Returns a smooth Hermite interpolation between 0 and 1, if <em>x</em> is in the range [<em>min</em>, <em>max</em>].</p>
<table>
     <tbody>
         <tr>
             <th><em>ret</em> smoothstep(<em>min</em>, <em>max</em>, <em>x</em>)</th>
         </tr>
     </tbody>
</table>
<h2><a name="Parameters"></a>Parameters</h2>
<dl><dt><em>min</em> </dt><dd>
<p>[in] The minimum range of the <em>x</em> parameter.</p>
</dd><dt><em>max</em> </dt><dd>
<p>[in] The maximum range of the <em>x</em> parameter.</p>
</dd><dt><em>x</em> </dt><dd>
<p>[in] The specified value to be interpolated.</p>
</dd></dl>
<h2><a name="Return_Value"></a>Return Value</h2>
<p>Returns 0 if <em>x</em> is less than <em>min</em>; 1 if <em>x</em> is greater than <em>max</em>; otherwise, a value between 0 and 1 if <em>x</em> is in the range [<em>min</em>, <em>max</em>].</p>
<h2><a name="Remarks"></a>Remarks</h2>
<p>Use the <strong>smoothstep</strong> HLSL intrinsic function to create a smooth transition between two values. For example, you can use this function to blend two colors smoothly.</p>
</div>
可以看介绍里说了，Smoothstep就是使用的Hermite插值，<br />三次Hermite插值公式是 P(t) = (2*t^3 - 3*t^2 + 1)P0 + (t^3 - 2*t^2 + t)M0 + (t^3 - t^2)M1 + (-2*t^3 + 3*t^2)P1<br />其中P0是起始点，P1是终结点，M0是起始点处的方向，M1是终结点处的方向。参数t从0变化到1的过程中P(t)形成的轨迹构成了从P0到P1的平滑曲线，而且这个曲线两端顶点处的切向量就是M0，M1，还要说明的就是M0，M1的大小会影响到曲线的形状，可以把这个过程想象成一个机车从P0开到P1，M0，M1更像是速度的表示，当M0比较大时，在P0附近的曲线会沿M0方向冲出去更多一些才会弯曲。<br />Smoothstep插值的公式是Smoothstep(t) = -2*t^3 + 3*t^2，对于dx文档中的参数，我们可以使用t = (x-min) / (max-min)先计算得到t再使用前面的公式。<br />为什么Smoothstep的公式比Hermite简化的这么多，我尝试推导了一下，<br />把(0,0)代入P0，(1,1)代入P1，(1,0)代入M0，(1,0)代入M1，<br />用Px(t)表示Hermite插值的x分量,Py(t)表示Hermite插值的y分量，则有<br />Px(t) = (2*t^3 - 3*t^2 + 1)0 + (t^3 - 2*t^2 + t)1 + (t^3 - t^2)1 + (-2*t^3 + 3*t^2)1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = t<br />Py(t) = (2*t^3 - 3*t^2 + 1)0 + (t^3 - 2*t^2 + t)0 + (t^3 - t^2)0 + (-2*t^3 + 3*t^2)1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = -2*t^3 + 3*t^2<br />再把参数t消掉就可以得到Py = -2*Px^3 + 3*Px^2，和Smoothstep插值公式是一致的。:P<img src ="http://www.cnitblog.com/luckydmz/aggbug/89615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2014-06-23 12:12 <a href="http://www.cnitblog.com/luckydmz/archive/2014/06/23/89615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何成为一名优秀的程序员</title><link>http://www.cnitblog.com/luckydmz/archive/2014/03/28/89364.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Fri, 28 Mar 2014 03:51:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2014/03/28/89364.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/89364.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2014/03/28/89364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/89364.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/89364.html</trackback:ping><description><![CDATA[<div>转载请保留原帖地址：<a id="Editor_Edit_hlEntryLink" title="view: 如何成为一名优秀的程序员" href="http://www.cnitblog.com/luckydmz/archive/2014/03/28/89364.html" target="_blank">http://www.cnitblog.com/luckydmz/archive/2014/03/28/89364.html</a><br /><br />我曾经是一名黑客，我购买黑客杂志期刊，关注最新的漏洞利用，那时候电脑安装的操作系统主要是WinXP和Win2000，很多人使用弱口令甚至空口令，随便选一个网段用扫描软件一扫就一堆肉鸡（黑客对可以被远程控制的机器的称呼），再加上各种服务的缓冲区溢出漏洞，SQL注入漏洞，网络环境安全当时可谓一塌糊涂，我入侵过很多个人电脑，也入侵过一些服务器，甚至通过键盘记录器得到过一些人的账户和密码甚至是ADSL密码，当时是可以通过ADSL进行某些购买的，不过我从未利用这些获取过任何利益，也没有进行过任何破坏行动，我只是觉得很有成就感，当时的我就沉浸在这所谓的黑客技术中。逐渐不再满足于使用别人提供的工具，我想搞清楚他们的原理以便可以利用最新的漏洞，我接触到一些漏洞的溢出源代码，它们一般是用C语言描述的，而我不知道如何使用它，还有一些论坛上会讨论如何使用反汇编对软件进行破解或者找到其中的漏洞，而我对这些一窍不通，我发现我根本不懂什么真正的技术，如果没有别人的工具我什么都不会，制作工具的那些人才是真正的黑客，他们掌握的才是真正的技术。从那时起我就认识到要学习编程，编程才是真正的技术，然后我便从书店买了一本《C++捷径教程》并开始了我的编程生涯，那一年我在读高二。<br /><br />&#8230;&#8230;<br /><br />之后我一直在学习编程，不过却再没踏上黑客之路，如今我已从计算机专业毕业，并在游戏开发行业从业近5年了，算起来我学习和使用C/C++已经10年有余了。<br /><br />好吧，这个引子有点可能长了，我只想说明相比刚刚学会写图形界面的妄自尊大的初学者就在论坛上侃侃而谈指点他人或许我的意见更具说服力。<br />现在我经常看到一些初学者在编程论坛和QQ群里询问该如何学习编程，有人问已经已经学了C还要不要学C++，已经学了C++还要不要学JAVA，要不要学C#，诸如此类要学习哪些语言的问题，有人会回答他们&#8220;是的，你需要学习Java，C语言已经过时了。&#8221;，&#8220;现在学习C语言已经找不到工作了，你还是学习C#吧&#8221;，可能还有更多人有类似疑问我根本没有遇到，这些初学者可能将花费大量时间在肤浅的层面徘徊，有时我会去指导他们，但是遇到得多了我也疲于指导了。<br />我并不是说多学习一些不同的语言不好，相反，学习不同的语言确实可以开拓思路，但我不提倡初学者接连甚至同时学习不同的语言，因为编程的精髓不在语言，语言只是对思想的一种描述形式，事实上除了上面提到的C++我也接触和使用过很多其他语言，C, VB, FORTRAN, JAVA, C#, PHP, Javascript, SQL, ASP.NET, LUA, RUBY, 而我学习这些语言的时间越晚我就学习得越快，只要花几天学习一下基础语法，然后写一些DEMO，一边写一边查文档学习使用标准库，用不了一个月就可以基本掌握这门语言。因为我已经掌握了一些编程本质的东西。<br /><br />如果说语言是肤浅的，那编程的内在究竟是什么呢？我们应该如何修炼编程&#8220;内功&#8221;呢？<br />我将这些知识划分为3个方面<br />1. 数学、算法和数据结构<br />2. 编码规范和设计模式<br />3. 开发实践和团队领导<br />其中2个方面有关个人能力的培养，1个方面有关团队建设和开发管理。<br /><br />接下来我将通过3篇BLOG将分别就这三方面的能力培养和相关书籍分别阐述 (超链接和BLOG以后将慢慢补全)<br /><br /><strong><a href="http://www.cnitblog.com/luckydmz/archive/2014/03/28/89365.html">如何成为一名优秀的程序员&#8212;&#8212;数学&amp;算法篇</a><br /><a href="http://www.cnitblog.com/luckydmz/archive/2014/07/09/89655.html">如何成为一名优秀的程序员&#8212;&#8212;编码&amp;设计篇</a> <br />如何成为一名优秀的程序员&#8212;&#8212;开发实践&amp;团队领导篇</strong></div><img src ="http://www.cnitblog.com/luckydmz/aggbug/89364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2014-03-28 11:51 <a href="http://www.cnitblog.com/luckydmz/archive/2014/03/28/89364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超定方程组</title><link>http://www.cnitblog.com/luckydmz/archive/2011/08/03/74960.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Wed, 03 Aug 2011 15:08:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2011/08/03/74960.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/74960.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2011/08/03/74960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/74960.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/74960.html</trackback:ping><description><![CDATA[定义<br />方程个数大于未知量个数的方程组<br />
对于方程组Ax=b，A为n&#215;m矩阵，如果A列满秩，且n&gt;m。则方程组没有精确解， 此时称方程组为超定方程组。 <br />
<br />
定理<br />
当transpose(A)*A可逆时，以上超定方程组存在最小二乘解，<br />
且即方程组 transpose(A)*A*x = transpose(A)*b 的解<br />
为：x = inverse(transpose(A)*A)*transpose(A)*b<img src ="http://www.cnitblog.com/luckydmz/aggbug/74960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2011-08-03 23:08 <a href="http://www.cnitblog.com/luckydmz/archive/2011/08/03/74960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>协方差矩阵</title><link>http://www.cnitblog.com/luckydmz/archive/2011/07/05/74562.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Tue, 05 Jul 2011 10:17:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2011/07/05/74562.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/74562.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2011/07/05/74562.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/74562.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/74562.html</trackback:ping><description><![CDATA[首先一个维随机变量的均值记为E[X]<br />
两个随机变量的协方差定义为cov(X,Y) = E[(X-E[X])(Y-E[Y])]<br />
两个随机向量的协方差矩阵由随机向量分量间的协方差定义而成。<br />
协方差矩阵元素Aij = cov(Xi,Yj)<br />
协方差矩阵的阶=随机向量的维数，而与随机向量的个数无关。<br />
协方差矩阵是对称矩阵。<br />
其主对角线元素为点的各个分量的方差，可以反映点集在各个轴向的离散程度。<br />
其他元素反映了不同分量的相关性，当两个分量距各自均值发生同向偏离时，协方差（即相应的协方差矩阵元素）趋向正值，当两个分量距各自均值发生异向偏离时，协方差趋向负值。<br />
通过计算协方差矩阵的特征值和特征向量，可以反映出点集离散的主要方向。若特征向量为最大特征向量，则特征值即为沿着该轴的顶点数据具有的最大方差值；若特征向量为最小特征向量，则特征值即为沿着该轴的顶点数据具有的最小方差值。<br />
特征值和特征向量的计算可以使用Jacobi方法，可以参考《实时碰撞检测算法技术》Page63~65，《Real-Time Collision Dectection》Page95~97<br />
<br />
实用意义：<br />
估计一个模型（一个点集）的最小包围球。<br />
估计一个模型（一个点集）的最小OBB。<br />
估计一个2D图形（二维点集）的最小面积包围矩形。<br />
求2D点集的拟合直线。<br />
求3D点集的拟合平面。<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">//</span><span style="color: #008000; ">3维向量协方差矩阵</span><span style="color: #008000; "><br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CovarianceMatrix(__out&nbsp;Matrix3f&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">covarianceMatrix,&nbsp;__in&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Vector3f&nbsp;pt[],&nbsp;__in&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;numPts)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;invNum&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1.0f</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)numPts;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Vector3f&nbsp;sum(</span><span style="color: #000000; ">0.0f</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">numPts;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;pt[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;Vector3f&nbsp;u&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sum&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;invNum;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">i;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;covarianceMatrix[i][j]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0.0f</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;k</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;k</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">numPts;k</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;covarianceMatrix[i][j]&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;(pt[k][i]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;u[i])&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(pt[k][j]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;u[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;covarianceMatrix[i][j]&nbsp;</span><span style="color: #000000; ">*=</span><span style="color: #000000; ">&nbsp;invNum;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">i;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;covarianceMatrix[i][j]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;covarianceMatrix[j][i];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;2-by-2&nbsp;Symmetric&nbsp;Schur&nbsp;decomposition.&nbsp;Given&nbsp;an&nbsp;n-by-n&nbsp;symmetric&nbsp;matrix<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;and&nbsp;indices&nbsp;p,&nbsp;q&nbsp;such&nbsp;that&nbsp;1&nbsp;&lt;=&nbsp;p&nbsp;&lt;&nbsp;q&nbsp;&lt;=&nbsp;n,&nbsp;computes&nbsp;a&nbsp;sine-cosine&nbsp;pair<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;(s,&nbsp;c)&nbsp;that&nbsp;will&nbsp;serve&nbsp;to&nbsp;form&nbsp;a&nbsp;Jacobi&nbsp;rotation&nbsp;matrix.<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;See&nbsp;Golub,&nbsp;Van&nbsp;Loan,&nbsp;Matrix&nbsp;Computations,&nbsp;3rd&nbsp;ed,&nbsp;p428</span><span style="color: #008000; "><br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;SymSchur2(__in&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Matrix3f&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a,&nbsp;__in&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;p,&nbsp;__in&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;q,&nbsp;__out&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;c,&nbsp;__out&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;s)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(abs(a[p][q])&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0.0001f</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;r&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(a[q][q]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;a[p][p])&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">2.0f</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;a[p][q]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;t;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(r&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0.0f</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1.0f</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(r&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;sqrt(</span><span style="color: #000000; ">1.0f</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;r</span><span style="color: #000000; ">*</span><span style="color: #000000; ">r));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1.0f</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">r&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;sqrt(</span><span style="color: #000000; ">1.0f</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;r</span><span style="color: #000000; ">*</span><span style="color: #000000; ">r));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1.0f</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;sqrt(</span><span style="color: #000000; ">1.0f</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;t</span><span style="color: #000000; ">*</span><span style="color: #000000; ">t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;t&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">c;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1.0f</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0.0f</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Computes&nbsp;the&nbsp;eigenvectors&nbsp;and&nbsp;eigenvalues&nbsp;of&nbsp;the&nbsp;symmetric&nbsp;matrix&nbsp;A&nbsp;using<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;the&nbsp;classic&nbsp;Jacobi&nbsp;method&nbsp;of&nbsp;iteratively&nbsp;updating&nbsp;A&nbsp;as&nbsp;A&nbsp;=&nbsp;J&#8743;T&nbsp;*&nbsp;A&nbsp;*&nbsp;J,<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;where&nbsp;J&nbsp;=&nbsp;J(p,&nbsp;q,&nbsp;theta)&nbsp;is&nbsp;the&nbsp;Jacobi&nbsp;rotation&nbsp;matrix.<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;On&nbsp;exit,&nbsp;v&nbsp;will&nbsp;contain&nbsp;the&nbsp;eigenvectors,&nbsp;and&nbsp;the&nbsp;diagonal&nbsp;elements<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;of&nbsp;a&nbsp;are&nbsp;the&nbsp;corresponding&nbsp;eigenvalues.<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;See&nbsp;Golub,&nbsp;Van&nbsp;Loan,&nbsp;Matrix&nbsp;Computations,&nbsp;3rd&nbsp;ed,&nbsp;p428</span><span style="color: #008000; "><br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Jacobi(__inout&nbsp;Matrix3f&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a,&nbsp;__out&nbsp;Matrix3f&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">v)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;v.SetIdentity();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;prevoff;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Repeat&nbsp;for&nbsp;some&nbsp;maximum&nbsp;number&nbsp;of&nbsp;iterations</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;MAX_ITERATIONS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">50</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;k&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;MAX_ITERATIONS;&nbsp;k</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Find&nbsp;largest&nbsp;off-diagonal&nbsp;absolute&nbsp;element&nbsp;a[p][q]</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;q&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;j&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;j&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;abs(a[i][j])&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;abs(a[p][q]))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Compute&nbsp;the&nbsp;Jacobi&nbsp;rotation&nbsp;matrix&nbsp;J(p,&nbsp;q,&nbsp;theta)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;(This&nbsp;code&nbsp;can&nbsp;be&nbsp;optimized&nbsp;for&nbsp;the&nbsp;three&nbsp;different&nbsp;cases&nbsp;of&nbsp;rotation)</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;c,s;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SymSchur2(a,&nbsp;p,&nbsp;q,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">c,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matrix3f&nbsp;J;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J.SetIdentity();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J[p][p]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;c;&nbsp;J[p][q]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J[q][p]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">s;&nbsp;J[q][q]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;c;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Cumulate&nbsp;rotations&nbsp;into&nbsp;what&nbsp;will&nbsp;contain&nbsp;the&nbsp;eigenvectors</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;J;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Make&nbsp;&#8217;a&#8217;&nbsp;more&nbsp;diagonal,&nbsp;until&nbsp;just&nbsp;eigenvalues&nbsp;remain&nbsp;on&nbsp;diagonal</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(J.Transpose()&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;a)&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;J;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Compute&nbsp;"norm"&nbsp;of&nbsp;off-diagonal&nbsp;elements</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;off&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0.0f</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;j&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;j)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;off&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;a[i][j]&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;a[i][j];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;off&nbsp;=&nbsp;sqrt(off);&nbsp;not&nbsp;needed&nbsp;for&nbsp;norm&nbsp;comparison&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Stop&nbsp;when&nbsp;norm&nbsp;no&nbsp;longer&nbsp;decreasing</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(k&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;off&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;prevoff)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prevoff&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000;">&nbsp;off;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
需要注意的是，<br />
Jacobi(__inout&nbsp;Matrix3f&nbsp;<span style="color: #000000;">&amp;a,&nbsp;__out&nbsp;Matrix3f&nbsp;&amp;v);<br />参数a要求是对称矩阵。<br />函数返回时a是一个与传入矩阵相似的对角矩阵，v中的特征向量是按列存储的。<br />三个特征向量分别是<br />Vector3f(v[0][0],v[1][0],v[2][0])<br />Vector3f(v[0][1],v[1][1],v[2][1])<br />Vector3f(v[0][2],v[1][2],v[2][2])<br /></span><img src ="http://www.cnitblog.com/luckydmz/aggbug/74562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2011-07-05 18:17 <a href="http://www.cnitblog.com/luckydmz/archive/2011/07/05/74562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>根据模型的顶点位置坐标和纹理坐标计算顶点的法线、切线和副法线</title><link>http://www.cnitblog.com/luckydmz/archive/2011/04/21/73393.html</link><dc:creator>魔のkyo</dc:creator><author>魔のkyo</author><pubDate>Thu, 21 Apr 2011 13:25:00 GMT</pubDate><guid>http://www.cnitblog.com/luckydmz/archive/2011/04/21/73393.html</guid><wfw:comment>http://www.cnitblog.com/luckydmz/comments/73393.html</wfw:comment><comments>http://www.cnitblog.com/luckydmz/archive/2011/04/21/73393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/luckydmz/comments/commentRss/73393.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/luckydmz/services/trackbacks/73393.html</trackback:ping><description><![CDATA[如何根据模型的顶点位置坐标和纹理坐标计算顶点的法线、切线和副法线？<br />我们把顶点数据记作P(x,y,z,u,v)，(x,y,z)是位置坐标，(u,v)纹理坐标<br />三角形的3个顶点就可以表示成<br />P0(x0,y0,z0,u0,v0)<br />P1(x1,y1,z1,u1,v2)<br />P2(x2,y2,z2,u2,v1)<br />因为u,v的变化对x的影响是线性的，则有<br />x = C1 u + C2 v + C3<br />不妨整理一下，写成<br />A0 x + B0 u + C0 v + D0 = 0 (1)<br />同理u,v的变化对y,z的影响是线性的，有<br />A1 y + B1 u + C1 v + D1 = 0 (2)<br />A2 z + B2 u + C2 v + D2 = 0 (3)<br /><br />可以看到 x,u,v 是成平面的，而A0,B0,C0就是平面的法线，可以通过三角形的3个顶点求得<br />(A0,B0,C0) = ((x0,u0,v0)-(x1,u1,v1))&#215;((x0,u0,v0)-(x2,u2,v2))<br />D0 = -(A0,B0,C0)&#183;(x0,s0,t0)<br /><br />同理也可以求得(A1,B1,C1,D1),(A2,B2,C2,D2)<br /><br />通过(1),(2),(3)式联立可以求得<br />d(x,y,z)/du = (-B0/A0,-B1/A1,-B2/A2)<br />d(x,y,z)/dv = (-C0/A0,-C1/A1,-C2/A2)<br /><br />我们就可以取d(x,y,z)/du为切线T，d(x,y,z)/dv为副法线B，法线N = T&#215;B<br /><br />参考：The.Cg.Tutorial.The.Definitive.Guide.to.Programmable.Real-Time.Graphics
8.4.1 Examining a Single Triangle
<br /><a href="http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter08.html">http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter08.html</a><br /><img src ="http://www.cnitblog.com/luckydmz/aggbug/73393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/luckydmz/" target="_blank">魔のkyo</a> 2011-04-21 21:25 <a href="http://www.cnitblog.com/luckydmz/archive/2011/04/21/73393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>