1、,单击此处编辑母版标题样式,*,Fortran95,程序设计,第,11,章,绘 图,fortran绘图,11-2,绘图函数,Visual Fortran,的绘图函数大部分是函数,调用后的,返回值大多是用来说明函数是否正常执行,。几何绘图函数通常有两个版本,函数名称最后为,_W,的使用虚拟坐标,不然就使用窗口坐标。使用虚拟坐标时,都使用双精度浮点数来传递坐标值。,在,dflib.f90,定义了自定义数据类型,xycoord,来保存窗口中的一个,坐标,。,TYPE xycoord,INTEGER(2)xcoord,INTEGER(2)ycoord,END TYPE xycoord,2,intege
2、r(2)function SetWindow(invert,x1,y1,x2,y2),用来设定虚拟坐标,,invert,的值是用来指定,Y,轴向上为正或为负。,invert=.true.,时向上为正,,invert=.false.,时向下为负。,(x1,y1),、,(x2,y2),则使用双精度浮点数来定义绘图范围两端的虚拟坐标值。,integer(2)function SetColor(index),使用索引值的方法来设定所要使用的颜色。,subroutine OutGText(text),调用这个子程序可以在目前画笔的位置上写出,text,字符串。,3,integer(4)function
3、RGBToInteger(R,G,B),全彩模式中,,RGB,三种色光可以各自有,256,种色阶变化,所以一个颜色需要使用,3 bytes,的空间来做记录。但是,FORTRAN,中通常一个整数使用,4 bytes,的空间来做记录,如果分别使用,3,个变量来记录一个颜色值会很浪费空间,因为这,3,个变量都只会使用到最低的,8,个位,其它地方都不会使用。,这个函数可以重新组合,R G B,这三个传入的整数,取出这三个整数中最低,8,个位的数值,把它重新安排到返回值,color,中。,color,中的第,07 bits,用存放原本的,R,,,815 bits,会存放原本的,G,,,1623 bits
4、,会存放原本的,B,,剩下第,2431 bits,的空间则不会使用。,4,integer(2)function SetColorRGB(color),用,RGB,方法来设定颜色,参数,color,中的第,07,个,bits,用来设定红光,第,815 bits,用来设定绿光,第,1623 bits,用来设定蓝光,其它位不使用。,Visual Fortran,中以,#,符号开头的数字,代表一个,16,进制的数字,例如,使用,SetColorRGB(#FF0000),来设定颜色。,16,进制数值在,09,时和,10,进制数字相同,但是接在,9,下面的数字为,A,、,B,、,C,、,D,、,E,、,F
5、,。其中,A,等于,10,进制的,10,,,B=11,,,C=12.,,同理可推得,1016=16,,,FF16=255,。使用,16,进制的系统可以比较容易来操作这种需要控制到位内容的数值。,5,subroutine CLEARSCREEN(area),功能:清除屏幕,参数:,integer(4)area,设定所要清除的范围,有下列的定义值可以使用:,$GCLEARSCREEN,清除整个屏幕,$GVIEWPORT,清除目前所设定的可用范围,$GWINDOW,清除所设定的文字窗口范围,integer(2)function ELLIPSE_W(control,x1,y1,x2,y2),功能:在指
6、定的矩形范围内画椭圆,参数:,integer(2)control,设定要填满内部或是只画外框,有下列的定义值可以使用:,$GFILLINTERIOR,涂满整个内部,,$GBORDER,只画外框,,integer(2)x1,y1,矩形端点,1,,,integer(2)x2,y2,矩形端点,2,6,integer(2)function GETCURRENTPOSITION_W(t),功能:查询目前的画笔位置,type(xycoord)t,功能:返回目前画笔的所在位置,使用虚拟坐标时,t,的类型为,type(wxycoord),integer(2)function GETPIXEL_W(x,y),功
7、能:取得,(x,y),点的颜色,返回值为,INDEX,模式的颜色值。,integer(4)function GETPIXELRGB_W(x,y),功能:取得,(x,y),点的颜色,返回值为,RGB,模式的颜色值。,integer(2)function LINETO_W(x,y),功能:从目前画笔位置到,(x,y),间画一条直线。,参数:,integer(2)x,y,指定画线的终点,返回值如果不为,0,,代表函数运行不正常。,7,subroutine MOVETO_W(x,y,t),功能:把这只画笔移动到画纸上的,(x,y),坐标处,参数:,integer(2)x,y,设定画笔坐标位置,,typ
8、e(xycoord)t,返回上次的画笔位置,注意:,原点,(0,0),是位在窗口的左上角,,x,坐标轴向右为正,,y,坐标轴向下为正,。,integer(2)function RECTANGLE_W(control,x1,y1,x2,y2),功能:画矩形,参数:,integer(2)control,设定只画外框或画实心的矩形,,integer(2)x1,y1,x2,y2,设定矩形的范围,8,integer(2)function SETPIXEL_W(x,y),功能:用目前设定的颜色在指定坐标处画点(,Index Color,模式),参数:,integer(2)x,y,画点的坐标,integer
9、(2)function SETPIXELRGB_W(x,y),功能:用目前设定的颜色在指定坐标处画点(,RGB Color,模式),参数:,integer(2)x,y,画点的坐标,subroutine OUTTEXT(text),功能:在目前的文字输出位置写出字符串,text,的内容,参数:,character*(*)text,所要输出的字符串内容,9,subroutine SETBKCOLOR(color),功能:设定背景颜色(,Index Color,模式),参数:,integer(4)color,所要设定的颜色,subroutine SETBKCOLORRGB(color),功能:设定背
10、景颜色(,RGB Color,模式),参数:,integer(4)color,所要设定的颜色,subroutine SETTEXTPOSITION(row,column,t),功能:设定文字输出的位置,参数:,integer(2)row,column,设定文字输出的位置,subroutine SETTEXTWINDOW(r1,c1,r2,c2),功能:设定文字窗口的范围,参数:,integer(2)r1,c1,r2,c2,设定文字窗口的左上角及右下角范围,10,subroutine OUTGTEXT(text),功能:在目前画笔位置输出字符串,参数:,character*(*)text,所要输
11、出的字符串,integer(2)function SETFONT(options),功能:设定所要使用的字型,参数:,character*(*)options,使用文字叙述来设定要使用的字型,要描述的内容有字型、长宽、样式等等。,11,在屏幕上画出一条斜线、一个方形及一个椭圆的示例程序,program Plot_Demo,!,使用,Visual Fortran,的绘图功能时需要,module dflib,use DFLIB,implicit none,type(xycoord):t,integer:result,call MoveTo(10,10,t)!,把目前绘图的位置移动到坐标,(10,1
12、0),result=LineTo(100,50)!,从,(10,10),到,(100,50),间绘一条直线,!,画一个左上角为,(110,10),右下角为,(150,50),的实心方形,result=Rectangle($GFILLINTERIOR,110,10,150,50),!,画一个可以放入在,(10,60)-(150,100),方形当中的空心椭圆,result=Ellipse($GBORDER,10,60,150,100),end program Plot_Demo,plot.f90,12,program Plot_Sine,use DFLIB,implicit none,intege
13、r,parameter:lines=500 !,用多少线段来画函数曲线,real(kind=8),parameter:X_Start=-5.0 !x,轴最小范围,real(kind=8),parameter:X_End=5.0 !x,轴最大范围,real(kind=8),parameter:Y_Top=2.0 !y,轴最大范围,real(kind=8),parameter:Y_Bottom=-2.0 !y,轴最小范围,sin.f90,在屏幕上画出,sin,函数的图形,13,integer:result !,取回绘图函数运行状态,integer(kind=2):color !,设定颜色用,rea
14、l(kind=8):step !,循环的增量,real(kind=8):x,y !,绘图时使用,每条小线段都连接,real(kind=8):NewX,NewY!(x,y),及,(NewX,NewY),real(kind=8),external:f!,待绘图的函数,type(wxycoord):wt !,返回上一次的虚拟坐标位置,type(xycoord):t !,返回上一次的实际坐标位置,14,!,设定虚拟坐标范围大小,result=SetWindow(.true.,X_Start,Y_Top,X_End,Y_Bottom),!,用索引值的方法来设定颜色,result=SetColor(2)!
15、,内定的,2,号是应该是绿色,call MoveTo(10,20,t)!,移动画笔到窗口的,(10,20),call OutGText(f(x)=sin(x)!,写出内容,!,使用全彩,RGB 0-255,的,256,种色阶来设定颜色,color=RGBToInteger(255,0,0)!,把控制,RGB,的三个值转换到,color,中,result=SetColorRGB(color)!,利用,color,来设定颜色,call MoveTo_W(X_Start,0.0_8,wt)!,画,X,轴,result=LineTo_W(X_End,0.0_8)!,call MoveTo_W(0.0_
16、8,Y_Top,wt)!,画,Y,轴,result=LineTo_W(0.0_8,Y_Bottom)!,step=(X_End-X_Start)/lines !,计算小线段间的,X,间距,15,!,参数,#FF0000,是使用,16,进制的方法来表示一个整数,result=SetColorRGB(#FF0000),!,开始绘制小线段们,do x=X_Start,X_End-step,step,y=f(x)!,线段的左端点,NewX=x+step,NewY=f(NewX)!,线段的右端点,call MoveTo_W(x,y,wt),result=LineTo_W(NewX,NewY),end do,!,设定程序结束后,窗口会继续保留,result=SetExitQQ(QWIN$EXITPERSIST),end,16,!,所要绘图的函数,real(kind=8)function f(x),implicit none,real(kind=8):x,f=sin(x),return,end function f,17,此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢,