前幾課介紹了CChart的第一個例程,畫了一條簡單的折線圖。有的同學不免就要嘀咕了,原來CChart也就不過爾爾了呗,沒什麼特別之處,我用MoveTo、LineTo在屏幕上自己畫也能完成。
這些同學低估了CChart的功能。
雖然CChart是笨笨自己搗鼓出來的,但笨笨十年磨一劍,目前CChart功能已經相當不錯。笨笨自我感覺CChart在功能上不比MsChart、TeeChart、ChartDirector等大公司的產品差多少。當然在調用接口方面、一些圖像細節處理方面,和大公司產品的確還有差距。
這也是沒有辦法的。笨笨作為一個非專業的業余編程愛好者,獨自開發這幾十萬行的代碼,確實沒法和公司的專業人員相比。
不閒扯了,今天給大家帶來CChart的第一個高級功能——等高線圖。等高線功能可是笨笨當初開發CChart庫的緣由喲。
既然要畫等高線圖,首先得想好等高線圖的函數。實際應用中,等高線圖的函數可能是多種型式的,例如測量數據、程序模擬計算結果等。最終都將可以表示成z=f(x,y)的形式,其中x、y就是平面坐標,z就是等高線的高度。
作為例子,這裡我們對一個比較簡單的函數繪制等高線。其中f(x,y)=1.0/((x-1.0)*(x-1.0)+y*y+1.0)。可以想象,這個函數在坐標點(1.0,0.0)位置有極大值。讓我們把等高線畫出來,看結果對不對。
首先仍然按照第一課的方法,建立一個VC6項目,名稱為Lesson04。
按照第一課的流程,完成第一步到第九步,其中第七步WM_CREATE消息的響應例程暫時不填,如下。
case WM_CREATE: break;
然後按照第三課的方法,讓我們的程序能響應鼠標雙擊。
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
建立等高線函數。在WndProc函數的前面某個位置,輸入如下代碼。
double f(double x, double y) { return 1.0/((x-1.0)*(x-1.0)+y*y+1.0); }
修改WM_CREATE消息的響應例程
case WM_CREATE: chartWnd.Attach(hWnd, kTypeContourLine); chartWnd.GetChart()->SetFieldFcn(f); { double xRange[2], yRange[2]; xRange[0] = -2.0; xRange[1] = 2.0; yRange[0] = -2.0; yRange[1] = 2.0; chartWnd.GetChart()->SetPlotRange(xRange, yRange); } break;
注意等高線圖的類型標識為kTypeContourLine。
現在編譯並運行程序,得到的效果如圖。
哈哈,等高線圖這麼容易就出來了。從圖可以看出,(1,0)位置的確是一個極值點。
上面的代碼中,利用SetFieldFcn設置等高線函數,利用SetPlotRange設置繪圖的X坐標和Y坐標的范圍。
有的同學仔細瞧了瞧上面的圖,發現圖中的線不甚光滑,這個問題能解決嗎?
請在WM_CREATE消息的響應例程中break;前面添加一句代碼。
chartWnd.GetChart()->SetContourPrecision(8);
再運行試試看,曲線是不是光滑多了?
這裡用SetContourPrecision設置等高線的精度,一般設置為5或者6就可以了。設置得越高,第一次繪制的時候延遲就越長。
還有的同學會覺得等高線是不是有點稀疏,那好,請在WM_CREATE消息的響應例程中break;前面再添加一句代碼。
chartWnd.GetChart()->SetContourLineNum(50);
運行效果如圖。
這下等高線夠多了的吧,呵呵。
這裡SetContourLineNum用來設置等高線高度的個數。
到現在為止,同學們已經會用CChart畫等高線了,簡單得出奇吧!
當然等高線圖的色彩有點單調,後續課程中將介紹另一種類似的視圖——雲圖,那就五顏六色、五彩缤紛了,嘿嘿。
下課了!