基于Java的簡易函數(shù)圖像繪制程序設計

[日期:2024-04-15] 作者:信息技術 次瀏覽 [字體: ]

基于Java的簡易函數(shù)圖像繪制程序設計

2024屆5班 史哲予

     程序設計就像一扇充滿魔力的大門,只需要一把鑰匙,你就可以創(chuàng)造一個屬于自己的世界。而這扇門的鑰匙就是一門可以與電腦對話的程序設計語言。對我而言,程序設計最大的魅力在于無論是使用電腦時的個性化需求,或是日常學習中所涉及的知識點,它都可以與之完美契合!而當程序在你眼前完美運行時,你的愉悅之情也是難以替代的。于是,設計編寫各種有趣實用的程序成為了我的興趣之一。

Java當前最流行的程序設計語言之一。它的特點顯而易見:簡單、面向對象、安全、高性能以及跨平臺等。它可以在各種電腦、手機、移動設備、終端,以及各種操作系統(tǒng)上成功運行。憑借著現(xiàn)代信息技術的飛速發(fā)展,Java被大范圍地使用。大型應用程序、Web及服務器后臺處理、大數(shù)據(jù)技術、集成開發(fā)工具等都由它開發(fā)。在尖端領域,Java造就了Maestro火星探測器控制器、世界上最快的圖形分析引擎之一(PGX)以及耗資30億美元的集成基因組瀏覽器(IGB)。當然,還有最受歡迎的游戲Minecraft

有了這樣一個強大的程序開發(fā)設計平臺,我們就可以開啟今天的函數(shù)圖像可視化進程了。函數(shù)通常由兩個變量(Variable)組成,自變量(Argument)和因變量(Dependent variable)。如:y=x,表示了因變量與自變量的“相等關系”。各個自變量都有對應的因變量。函數(shù)圖像(Function image)即是以xy為坐標的點在平面直角坐標系中組成的圖像。數(shù)學課上,函數(shù)圖像的繪制只需三步:列表、描點、連接。使用同樣的方式在電腦上更能輕而易舉地實現(xiàn)。只需要確定三個因素:解析式、自變量的取值范圍以及步長。通過循環(huán)結構繪制圖像即可。接下來我們就來進行算法分析…...

首先,我們需要以窗口幾何中心為原點,向右、上方為正方向建立一個直角坐標系。接下來,通過循環(huán)繪制,需要在程序里創(chuàng)建四個變量:xo,yo,x,y。這些變量分別表示初始xy值,改變后的x,y值。它們可以組成兩組坐標,兩組坐標用線段來連接就構成了一段函數(shù)圖像。其中,xox是隨著循環(huán)直接變化的變量,xo的初值默認為-10800,而x則是xo按單位步長Δx自增后的值。即:x = xo + Δx (Δx>0)。

xxoyyo是函數(shù)圖像坐標系對應計算機窗口坐標系的偏移值。由于在Java繪圖中,窗口的坐標系是以左上角為原點,向右、下方為正方向,而數(shù)學中函數(shù)的坐標都是相對于原點即窗口中心的,而且以右、上為正方向。因此,這里我們要使用ORIGIN_XORIGIN_Y兩個常量(Const)對坐標系的偏移量進行修正,將函數(shù)圖像坐標系映射到計算機窗口坐標系中。

xo初始化為最小,即-10800,并計算出yo。然后在自變量的取值范圍內(nèi),從小到大以最小單位長度為步長列舉x,計算出y。以(xo,yo)(x,y)畫線段,完成后將xoyo的值分別用x,y替代,進入下一次迭代,思路如圖所示。

   

接下來開始代碼編寫。我所使用的是IntelliJ IDEA來進行開發(fā),配置環(huán)境為JDK 11.0.12。按照慣例配置好開發(fā)環(huán)境項目結構等。首先,要顯示出圖像,窗口是必備的。Java提供了JFrame類,創(chuàng)建自己的窗口就需要繼承自JFrame,也就是將自己的類作為一個擁有JFrame所有功能和屬性的對象。然后聲明窗口寬和高,并重寫(Override)JFrame提供的paint方法以繪制函數(shù)圖像。

現(xiàn)在我們已經(jīng)擁有了自己的窗口,我們可以在對窗口進行優(yōu)化。直角坐標系的繪制可以分為三步:找到原點并畫出坐標軸、畫出標尺、畫出格子。全部都可以通過調(diào)用drawLine方法畫直線完成。原點坐標即(W/2,H/2),而坐標軸即畫直線y = H/2 x = W/2,標尺則可以用給定長度(如40px)在對應位置畫線段來實現(xiàn)。但是這兩步要等到最后做,必須要先畫格子,這樣才不會不會把坐標軸遮住。為了不干擾坐標軸和函數(shù)圖像,格子可以更改為淺一點的顏色,同時,與標尺重合畫出坐標軸的刻度。(還可以加粗顯示特定邊)

現(xiàn)在窗口已經(jīng)完工。但是運行程序需要一個main方法,也就是主線程(Main Thread)。我們直接在下面創(chuàng)建main方法,先生成窗口對象,然后設置大小、位置、可見性等屬性值,然后運行。一個簡單的直角坐標系就這樣完成了!

接下來是實現(xiàn)任意函數(shù)圖像的繪制。在paint方法中使用一個循環(huán),循環(huán)參數(shù)i的初始值設置為-10800。在i10800時,i循環(huán)每執(zhí)行一次,i都要自增,然后按相應函數(shù)表達式進行運算、繪圖。

最大的難點在于步長。在Java繪圖中,各個點的坐標只能為整數(shù)(Integer)。步長被限制在一個像素(1px)以外,導致曲線太不精確,弧度太大就會變成一個個鋸齒狀的“臺階”。但實際上我們可以利用編程語言的不同的變量類型來巧妙解決這個問題。當你給一個int變量賦值為小數(shù)時,Java會自動將這個值取整。在這一點的幫助下,我們可以在一開始就定義一個小數(shù)變量arc來表示自變量。每一次循環(huán)開始,arc賦值為PI×i÷360。注意,這里的PI只是為了讓i的值自動轉化為更小的雙精度小數(shù)類型(Double)。理論上,“360”替換成更大的數(shù),繪圖的精度也就會越高。但由于i的取值范圍不會變,所以,把360改成更大的數(shù)反而會讓電腦不堪重負,并且只畫出小部分圖像,一味追求高精度并沒有多大實際意義。      

到現(xiàn)在,我們的函數(shù)繪制已經(jīng)完成了。但是我們可以發(fā)現(xiàn),由于我們進行了奇幻的操作,函數(shù)畫出來的圖像很小。所以需要加上一個小變量:

private static int SCALE_X = 40;  private static int SCALE_Y = 40;)由它們來控制圖像的縮放。這就像一次函數(shù)中的k值一樣,直接在arcx,y的值轉換前先將×進行適當?shù)目s放就行了。核心代碼及繪制的正弦函數(shù)圖像如下。