做了一个画f(x,y)=0函数图像的算法,果断codeplex之
??? 代碼上傳到了http://vlpp.codeplex.com/的Candidate\Games\FunctionVisualizer文件夾下面,VS2010,.NET 4.0。做這個的目的只要是前幾天看到了batman equaltion,然后渾身不舒服,因此就想起了這片新聞(http://news.cnblogs.com/n/106212/)里面的東西。就花了一個晚上和一個早上的時間做了出來。當然這里面有點瑕疵,不過大概還是好的。
?
??? 在Candidate\Games\FunctionVisualizer\FvCalculation\RawExpression.cs里面可以看到用來表達函數的語法樹。旁邊的ExpressionParser.cs有一個用unsafe+char**寫的語法分析器。當我得到了語法樹之后,就求f(x,y)的偏微分(RawExpression.Different函數),然后按照下面的步驟進行:
?
??? 1:從屏幕的所有點(a,b)開始
??? 2:用牛頓迭代發求f(x,b)=0的解x'
??? 3:用牛墩迭代法求f(a,y)=0的解y'
??? 4:每個點(a,b)就變換成了(a,y')和(x',b)
??? 5:如果Bitmap的大小是100*100的話,那么現在我就獲得了兩萬個(double, double)點,將他們Math.Round之后畫到Bitmap里面就成為函數圖像了。
?
??? 為了加速,我做了下面的幾件事情
??? 1:用unsafe把string轉成char*,然后做語法分析器(方法基本上就是我寫的這篇文章http://www.cppblog.com/vczh/archive/2008/06/15/53373.html)。
??? 2:繪圖的時候Bitmap.Lock得到指向Bitmap的顏色的緩沖區,unsafe強制轉換成byte*,然后填顏色。
??? 3:在得到f(x,b)和f(a,y)之后,對他們求微分f'x(x,b)和f'y(a,y),然后把這些函數從RawExpression編譯到System.Linq.Expression再Compile成Func<double, double>。
?
??? 下面就放幾個截圖。由于|x|我還沒想到好方法去支持,所以我只畫了上面提到的那片新聞的一半的圖。
???
總結
以上是生活随笔為你收集整理的做了一个画f(x,y)=0函数图像的算法,果断codeplex之的全部內容,希望文章能夠幫你解決所遇到的問題。