fortran繪圖、界面功能簡介之一
對于fortran的繪圖、界面功能,我僅僅做一個簡單的羅列,這樣方便大家的討論:
1.利用fortran的擴充函數(shù)繪圖,下面是一個簡單的例子,是http://www.programfan.com上面有人貼出的;
Visual Fortran中有提供繪圖功能。Visual Fortran的繪圖功能不完全是以擴充函數(shù)的類型存在,使用它的繪圖功能必須在選擇Project類型時,選擇Standard Graphics或QuickWin模式。Visual Fortran的QuickWin 及Standard Graphics模式在簡單的繪圖使用上會比較方便,它的繪圖函數(shù)功能比較多樣,不過效率會比較差,而且不支持動畫功能。
Standard Graphics和QuickWin模式在繪圖方面的使用方法完全相同,它們都是調(diào)用相同的函數(shù)來繪圖。差別在于Standard Graphics只能打開一個窗口來繪圖、QuickWin模式則可以打開多個窗口來繪圖。QuickWin模式下可以有菜單及對話窗的功能, Standard Graphics則不行。Standard Graphics模式的程序代碼可以原封不動直接轉(zhuǎn)換到QuickWin模式下使用,但是QuickWin的程序代碼并不一定可以直接拿到 Standard Graphics模式下使用。
下面這個程序會在屏幕上畫出一條斜線、一個方形及一個橢圓。編譯程序時,請選擇Fortran Standard Graphics or QuickWin Application這個模式。這個程序可以在Standard Graphics或QuickWin模式下使用。打開好Project后,再把下面的程序加入Project中來編譯。
1.! 簡單的繪圖范例
2.! By Perng 1997/9/19
3.program Plot_Demo
4.! 使用Visual Fortran的繪圖功能時需要module dflib
5.use DFLIB
6.implicit none
7. type(xycoord) :: t
8. integer :: result
9. call MoveTo(10,10,t) ! 把目前繪圖的位置移動到坐標(10,10)
10. result=LineTo(100,50) ! 從(10,10)到(100,50)間繪一條直線
11. ! 畫一個左上角為(110,10), 右下角為(150,50)的實心方形
12. result=Rectangle( $GFILLINTERIOR, 110,10, 150, 50 )
13. ! 畫一個可以放入在(10,60)--(150,100)方形當中的空心橢圓
14. result=Ellipse($GBORDER, 10, 60, 150, 100)
15.end program Plot_Demo
使用Standard Graphics模式時,會出現(xiàn)一個繪圖窗口來畫圖。使用QuickWin模式時,除了繪圖窗口外,還有內(nèi)定的菜單可以使用。File菜單中的Print可以把圖形顯示出,Save可以把繪圖結(jié)果儲存成*.BMP圖文件。
使用Visual Fortran的繪圖功能時,打開窗口的工作是自動完成的。程序代碼只需要直接調(diào)用繪圖函數(shù)就可以進行繪圖,下面對程序中所使用的繪圖函數(shù)做一些介紹:
subroutine MoveTo(x,y,t)
使用這個子程序時,要先把屏幕想像成一張畫紙,程序會使用一只畫筆在屏幕上畫畫。MoveTo(x,y,t)可以把這只畫筆移動到畫紙上的(x,y)坐標處,參數(shù)t則會返回移動之前的畫筆所在位置(這個參數(shù)其實沒有什么用,不過既然有規(guī)定就一定要把它放入)。
請注意,原點(0,0)是位在窗口的左上角,x坐標軸向右為正,y坐標軸向下為正。
integer(2) function LineTo(x,y)
這個函數(shù)可以把畫筆從目前的位置到(x,y)處畫一條直線。返回值如果不為0,代表函數(shù)運行不正常。
integer(2) function Rectangle( control, x1, y1, x2, y2 )
這個函數(shù)可以在(x1,y1)、(x2,y2)兩個端點間畫出一個方形。control值可以用來設定是要畫出一個實心方形或是只有外框而已。在范例中把 control的值用$GFILLINTERIOR來代入,表示要畫實心。$GFILLINTERIOR定義在MODULE DFLIB里面。
integer(2) function Ellipse(control,x1,y1,x2,y2)
這個函數(shù)會在(x1,y1)、(x2,y2)兩端點間所形成的矩形中畫橢圓。control的意義同上,在范例中使用$GBORDER,代表只畫出外框。
下面這個范例畫出SIN函數(shù)的圖形:
1.! sin函數(shù)的繪圖范例
2.program Plot_Sine
3. use DFLIB
4.implicit none
5. integer, parameter :: lines=500 ! 用多少線段來畫函數(shù)曲線
6. real(kind=8), parameter :: X_Start=-5.0 ! x軸最小范圍
7. real(kind=8), parameter :: X_End=5.0 ! x軸最大范圍
8. real(kind=8), parameter :: Y_Top=2.0 ! y軸最大范圍
9. real(kind=8), parameter :: Y_Bottom=-2.0 ! y軸最小范圍
10. integer :: result ! 取回繪圖函數(shù)運行狀態(tài)
11. integer(kind=2) :: color ! 設定顏色用
12. real(kind=8) :: step ! 循環(huán)的增量
13. real(kind=8) :: x,y ! 繪圖時使用,每條小線段都連接
14. real(kind=8) :: NewX,NewY ! (x,y)及(NewX,NewY)
15. real(kind=8), external :: f ! 待繪圖的函數(shù)
16. type(wxycoord) :: wt ! 返回上一次的虛擬坐標位置
17. type(xycoord) :: t ! 返回上一次的實際坐標位置
18.
19. ! 設定虛擬坐標范圍大小
20. result=SetWindow( .true. , X_Start, Y_Top, X_End, Y_Bottom )
21. ! 用索引值的方法來設定顏色
22. result=SetColor(2) ! 內(nèi)定的2號是應該是綠色
23. call MoveTo(10,20,t) ! 移動畫筆到窗口的(10,20)
24. call OutGText("f(x)=sin(x)") ! 寫出內(nèi)容
25. ! 使用全彩RGB 0-255的256種色階來設定顏色
26. color=RGBToInteger(255,0,0) ! 把控制RGB的三個值轉(zhuǎn)換到color中
27. result=SetColorRGB(color) ! 利用color來設定顏色
28.
29. call MoveTo_W(X_Start,0.0_8,wt) ! 畫X軸
30. result=LineTo_W(X_End,0.0_8) !
31. call MoveTo_W(0.0_8,Y_Top,wt) ! 畫Y軸
32. result=LineTo_W(0.0_8,Y_Bottom) !
33.
34. step=(X_End-X_Start)/lines ! 計算小線段間的X間距
35. ! 參數(shù)#FF0000是使用16進制的方法來表示一個整數(shù)
36. result=SetColorRGB(#FF0000)
37. ! 開始繪制小線段們
38. do x=X_Start,X_End-step,step
39. y=f(x) ! 線段的左端點