Kasen
Lv 4
Kasen asked in 電腦與網際網路程式設計 · 1 decade ago

fortran可以用來做圖嗎?

如題

我們的工數老師想要我們做兩個一元二次的脈衝從結合到分開的情形

我目前會的方式中,fortran用起來最得心應手

但是問題是,老師想要看到圖(最好可以隨著時間變化)

可是我從來都沒有用fortran做圖過

想請問fortran可以用來做出方程式的圖嗎?

能做隨著時間變化的連續圖形嗎?

要怎麼做呢?

Update:

想請問一下可以把他改到我能實際跑他嗎

我很想看看是怎麼運作的^^

另外就程式有點問題(抱歉我的fortran是學校學的,卻只學一學期

所以有些東西看不太懂)

Update 2:

WINAPP --->這行的目的是?

INCLUDE <windows.ins> --->include的作用是什麼呢?

......

xscale = 2.*pi/1200.

yscale = 1./450. ------>xscale和yscale的目的是什麼呢

......

file='Demo1.jpg'

CALL put_dib_block@(file,a,1280,960,0,0,1280,960,24,ier) --->這個是要呼叫什麼

end main

麻煩了^^

Update 3:

我是跟你同一家的呢

F:\fortran\FreeFormat1.F95(25) : error 217 - INTEGER(KIND=1) constant out of range

另外26、27、37行也有一樣的問題

這是他顯示的(我是一字不漏的貼上)

Update 4:

順便問一下,3D圖形fortran也有辦法做嗎(問問的而已)

另外請問大大幾點左右休息呢

我今天有問題再問你

1 Answer

Rating
  • Jack
    Lv 5
    1 decade ago
    Favorite Answer

    你的需求能否達成,取決於你所使用的 Fortran Compiler 能支援繪圖功能到何種程度而定。如果你的 Fortran Compiler 完全不支援繪圖功能,則一切免談。

    以Silverfrost 公司的 FTN95 Fortran Compiler 為例,它支援繪圖程式庫 SIMPLEPLOT,讓使用者可以很方便的畫出 2D 和 3D 的各種函數圖形。(參考網頁:http://www.silverfrost.com/21/ftn95/buss_case_stud...

    即使你的 Fortran Compiler 沒有如此強大的繪圖功能,只要它能支援最基本的「能直接寫到螢幕視窗或圖檔的每一個像素(Pixel)」的功能,你的需求還是可以用「自己親自處理每一個像素」的方式「硬做」完成(這種情形稱為 Raster Editing)。當然,這時只能要求結果的正確性,無法要求它像商業軟體的輸出一樣美觀悅目了。

    下面這個例子說明如何以「自己親自處理每一個像素」的方式畫出 y=sin(x) 在 0 <= x <= 2*pi 間的函數圖,並將結果產生一個解析度為 1280 x 960 的圖檔 Demo1.jpg(仍以 FTN95 為例,只使用最基本的繪圖功能):

    program main

    WINAPP

    INCLUDE <windows.ins>

    integer*1 a(3,1280,960)

    integer*2 ier, ix, iy, i, j

    real*4 xscale, yscale, pi

    character*20 file

    data pi/3.1415927/

    !-------Initialize Bitmap (Set to black color)

    do i = 1, 1280

    do j = 1, 960

    a(1,i,j)=0 ! Red

    a(2,i,j)=0 ! Green

    a(3,i,j)=0 ! Blue

    enddo

    enddo

    !-------Draw X axis (white color) in Bitmap

    do i = 5, 1275

    a(1,i,480)=255

    a(2,i,480)=255

    a(3,i,480)=255

    enddo

    !-------Draw Y axis (white color) in Bitmap

    do j = 5, 955

    a(1,20,j)=255

    a(2,20,j)=255

    a(3,20,j)=255

    enddo

    !-------Decide X scale and Y scale

    xscale = 2.*pi/1200.

    yscale = 1./450.

    !-------Draw the funtion chart (blue color) in Bitmap

    do ix = 20, 1220

    iy = 480 - sin(float(ix-20)*xscale)/yscale

    a(1,ix,iy)=0

    a(2,ix,iy)=0

    a(3,ix,iy)=255

    end do

    !-------Output Bitmap to JPG file

    file='Demo1.jpg'

    CALL put_dib_block@(file,a,1280,960,0,0,1280,960,24,ier)

    end main

    (註:INCLUDE <windows.ins> 那行要用半形的「小於」和「大於」符號,但它們會被知識+「吃掉」,在這裡不得不用全形符號表示。)

    這種方式雖無法畫出「實際的曲線」,但只要將「取樣區間」縮小到等於橫軸上的一個像素寬,則所有相對的縱座標點看起來就會是一條「連續的」曲線。需注意圖檔的座標原點是在左上角,而非我們習以為常的左下角,需以適當的 Scale 自己做座標轉換。

    你說的「隨著時間變化」應該不難做到,只要把「時間」設為 X 軸就好了。

    2009-05-09 13:29:13 補充:

    Fortran 的繪圖功能都是 Vendor dependant,每一家 Fortran Compiler 廠商的作法都不太一樣。因此在 A 廠商的 Compiler 能跑的程式,是無法一字不改的直接拿到 B 廠商的 Compiler 去跑的。我上面的 Sample 程式,是根據 Silverfrost 公司的 FTN95 Fortran Compiler 來寫的,主要是要說明如何以「自己親自處理每一個像素」的方式來畫出想要的圖,不一定能讓你直接拿來跑(除非你也是用 Silverfrost 的 FTN95)。

    2009-05-09 13:29:52 補充:

    WINAPP 是表示要用到 Windows 的應用程式,INCLUDE <windows.ins> 是將Windows API 的所有相關宣告包含進來。因此它最終還是透過 Windows 的相關介面來執行基本繪圖功能,每一個 Compiler 廠商都是在此基礎上發展自己的一套繪圖程式庫(不僅限於 Fortran,其他語言也是一樣)。

    2009-05-09 13:30:27 補充:

    X scale 和 Y scale 是要讓你的圖形在圖檔中呈現出適當的大小。以上例的 y=sin(x) 來說,y 的範圍在正負 1 之間,圖檔的垂直解析度我設為 960,我讓上下各空出 30 點只用中間 900 點(較好看),因此從「函數值」到「像素數」間會有一個 2:900 的轉換比例(scale);水平方向也是類似的情形,轉換比例為 2*pi:1200。

    2009-05-09 13:30:47 補充:

    CALL put_dib_block@(file,a,1280,960,0,0,1280,960,24,ier) 就是將陣列 a 的內容寫到 file 這個圖檔內。它是 Silverfrost FTN95 自己的程式庫,你用其他家的 Compiler 當然不能跑了。在這行之前,所有的 Raster Editing 工作都只是在陣列 a(術語叫 Bitmap)內執行,一直到這行才真正寫到圖檔內。

    2009-05-11 20:20:51 補充:

    如果你只是這幾行有 Error,請把指定給陣列 a 的 255 這個數字改成 127,(相關的每行都要改),再試試看。這會使輸出圖形的顏色稍淺一些,但不影響其正確性。

    2009-05-12 00:29:36 補充:

    Fortran 當然也能處理 3D 圖形,但自己「硬做」的話就太過繁複了,還是使用例如上述 SIMPLEPLOT 之類的現成繪圖程式庫較方便。

    • Commenter avatarLogin to reply the answers
Still have questions? Get your answers by asking now.