在Fortran中绘制图形,需要算法辅助

时间:2012-04-08 03:08:16

标签: algorithm graph plot fortran fortran90

我正在尝试创建一个将X,Y坐标绘制到屏幕上的fortran程序。我让程序从输入文件接收图。在输入文件中,第一个条目是点数。之后的每一行都有一个x值,然后是一个空格,然后是相应的y值。然后我让程序冒泡将x值从最小到最大排序。接下来我想绘制这些值。我想绘制它们的图形,使x轴的比例为xmax-xmin /#个点,y轴相同。我将如何打印点'*'作为脏图?我不是在寻找完整的答案只是如何形成写入算法的一些方向。下面列出的是我到目前为止的代码和一个示例输入文件

输入文件

 10
 -4 16
 -3 9
 -2 4
 -1 1
 0 0
 1 1
 2 4
 3 9
 4 16
 5 25

代码

 *START OF CODE
  PROGRAM MAIN

 *DECLARATIONS
  INTEGER EXISTS, DONE, POINTS, USED, I, E
  REAL XSTEP, YSTEP, XMIN, XMAX, YMIN, YMAX
  REAL    X(100), Y(100), A, B
  CHARACTER INNAME*30, OUTNAME*30
  LOGICAL MORE
  CHARACTER (70) LINE

 *INITIALIZATIONS
  INNAME='NULL.DOC'
  EXISTS=0
  DONE=0
  POINTS=0
  USED=0
  I=0
  E=0
  MORE = .TRUE.
  A=0
  B=0
  XSTEP = 0
  YSTEP = 0
  XMIN=0
  XMAX=0
  YMIN=0
  YMAX=0


 *CLEAR THE ARRAYS     
  DO I=1,100
  X(I)=0
  Y(I)=0
  END DO
  I=0

 *FORMATS
 5     FORMAT(' ','POINT #', I3, ' X=', F5.2,' Y=', F5.2)
 10    FORMAT(' ','XMIN=',F5.2, ' XMAX=', F5.2)
 15    FORMAT(' ','YMIN=',F5.2, ' YMAX=', F5.2)
 20    FORMAT(' ','X STEP=',F5.2, ' Y STEP=', F5.2)



 *MAIN CODE
 ****************************************************************


 *PROMPT FOR NAME OF FILE AND INPUT
PRINT *,'PLEASE INPUT A FILE NAME INCLUDING AN EXTENSION'
PRINT *,'ENTER QUIT OR Q TO EXIT'
READ (*,*) INNAME

 *OPEN IF(0)                    
IF(INNAME.EQ.'Q'.OR.INNAME.EQ.'QUIT')THEN
PRINT *,'GOODBYE'
ELSE     

 *TEST FOR FILE
INQUIRE(FILE=INNAME, EXIST=EXISTS)

 *IF EXIST=FALSE, DISPLAY MESSAGE 
IF(.NOT.EXISTS) THEN
PRINT *,'FILE DOES NOT EXIST, PLEASE TRY AGAIN'    

 *ELSE EXIST=TRUE, OPEN (UNIT=1)
ELSE 
OPEN(UNIT=1, FILE=INNAME, STATUS='OLD')
END IF

 *************************************************************

 *ASK CHOICES FOR OUTPUT
PRINT *,'PLEASE ENTER A NAME FOR AN OUTPUT FILE W/ EXTENSION'
PRINT *,'ENTER QUIT OR Q TO EXIT'
READ(*,*)OUTNAME

IF(OUTNAME.EQ.'Q'.OR.OUTNAME.EQ.'QUIT')THEN
PRINT *,'GOODBYE'
ELSE

 *************************************************************
 *CHECK IF DONE (IF 1)
IF(DONE.EQ.0)THEN

 *OPEN THE OUTPUT FILE DO(2)
DO WHILE(USED.EQ.0)
INQUIRE(FILE=OUTNAME,EXIST=EXISTS)

 *OPEN IF(2) FOR IF FILE ALREADY EXISTS
IF(EXISTS.EQ.1)THEN
OPEN(UNIT=2,FILE=OUTNAME,STATUS='OLD')

 *END IF FOR IF FILE ALREADY EXISTS AMD OPEN IF DID NOT EXIST,              
ELSE
OPEN(UNIT=2,FILE=OUTNAME,STATUS='NEW')

 *END IF (2)                   
END IF

 *READ IN 1 INTEGER (MAXIMUM VALUE OF 100) FOR # OF POINTS IN FILE
READ(1,*, END=111),POINTS

 *READ IN X AND Y VALUES WITH MAX OF 100
DO I=1, POINTS
READ(1,*,END=111) X(I),Y(I)
END DO

 *SORT POINTS
E = POINTS - 1
MORE = .TRUE.
DO WHILE (MORE .EQ. .TRUE.)
MORE = .FALSE.
DO I=1, E
IF(X(I).GT.X(I+1)) THEN
MORE = .TRUE.
A=X(I)
B=y(I)
X(I)=X(I+1)
Y(I)=Y(I+1)
X(I+1)=A
Y(I+1)=B
END IF
END DO
E=E-1
END DO

 *FIND MIN AND MAX OF X AND Y
I=1
XMIN = X(I)
XMAX = X(POINTS)
YMIN = Y(I)
YMAX = Y(I)
DO I=1, POINTS
IF(Y(I) .LT. YMIN) THEN
YMIN = Y(I)
END IF
IF(Y(I) .GT. YMAX) THEN
YMAX = Y(I)
END IF
END DO

 *fIND X AND Y STEPS    
XSTEP = (XMAX-XMIN)/POINTS
YSTEP = (YMAX-YMIN)/POINTS



 *PRINT TO THE OUTPUT FILE
DO I=1, POINTS
WRITE(2,5)I,X(I),Y(I)
END DO
WRITE(2,10)XMIN,XMAX
WRITE(2,15)YMIN,YMAX
WRITE(2,20)XSTEP,YSTEP
 *PRINT GRAPH


 *END DO (2)
END DO

 *END IF (1)
END IF

 *END IF QUIT(S)
END IF
END IF

 *CLOSE THE FILES
  CLOSE(UNIT=1)
  CLOSE(UNIT=2)

 111   PRINT * , 'The Program Has Now Ended'

 *STOP
  STOP

 *END
  END    

1 个答案:

答案 0 :(得分:1)

如果你想要快速和肮脏的东西,到目前为止最简单的方法是将图形横向绘制(如果要打印到纸上,则不会像听起来那么糟糕)。然后你可以打印每一行的长度与y(现在是x)值成比例(最后用*,或者直方图的所有*):

+-------------------------------------> y
|         *
|            *
|          *
. etc

否则,如果您不想使用库,事情会很快变得复杂。下一个最简单的方法是制作一个2d字符数组(屏幕的大小),最初填充空格,然后“绘制”到那个;完成后,您可以通过逐行读取字符并打印它们来打印它。它的优势在于它将轴与数据分开 - 如果您在打印线时尝试执行所有操作,则不同的任务会混淆。

但是很快就会出现比预期更复杂的情节。例如,选择刻度线和打印标签本身就是一项很好的主要任务。你真的更好地使用一个库(这就是为什么我建议首先采用侧面方法 - 如果这么快而且比你不想使用库那么脏,那么这通常就足够了。)

this is the kind如果你可以很快完成的事情 - 我会在几分钟内把它扔在一起)

更新:对于标记(它变得太复杂了!)你想要图形宝石算法 - it's pretty much the standard, and the paper is easy to understand。这给你你的总范围(以及刻度线间距),然后缩放很容易(一个字符是“值得”(xmax-xmin)/nchars,正如你所说 - 不确定还有什么要解释?)。