From Gossip@caterpillar

Computer Graphics: 函式圖形繪製

 

 


工程相關領域的行業,通常少不了面對函式繪圖,現在有許多的軟體都可以使用更方便的功能來繪製複雜的函式圖形,如著名的Matlab。

在這邊介紹三維立體空間的函式繪製,將函式分為兩類:「顯函式」與「隱函式」。

顯函式

如果可以將函式表示為y = f(x, z) 的形式,這種函式稱之為顯函式,由於顯函式的(x,z)只會產生一個結果,所以顯函式所表示的圖形若使用一條與y軸平行的直線來與圖形相交,最多只有一個交點。

繪製顯函式的方法就是分別對x與z進行迴圈計數,並帶入原方程式求出y值,然後在螢幕上繪出(x, y)的對應圖(z = f(x, y)或x = f(y, z)只是換個角度繪圖,方法一樣)。

隱函式

如果函式是f(x, y, z) = 0的形式,稱之為隱函式,雖然y - f(x, z) = 0也可以算是屬於此種形式,不過這邊所說的隱函式是指那些無法化為y = f(x, z)形式的函式;當畫上一條與y軸平行的直線時,可能會發生幾個情況,例如以球面函式x^2 + y^2 + z^2 - 1 = 0來說,可能沒有交點、一個交點或是兩個交點,如下圖所示:


由於一對(x, z)值可能會有兩個交點,所以我們必須將隱函式設法改變為以下的形式才能進行繪圖:
x = x(s, t)
y = y(s, t)
z = z(s, t)

以上的形式稱之為參數式,之後我們就可以利用(s, t)進行迴圈計數並計算出(x, y, z)的值並進行繪圖,當然(x, y, z)的參數式代回原來的函式必須滿足原來的函式,以球面函式x2 + y2 + z2 - 1 = 0為例,較好的參數表示式當然就是極座標表示法。

大部份的隱函式都可以使用參數式來進行繪圖,不過不同的函式會需要不同的參數式,以下示範顯函式的繪圖:

  • FunctionGraphicDemo.java
package onlyfun.caterpillar;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JApplet;

public class FunctionGraphicDemo extends JApplet {
private int orgX;
private int orgY;

public void init() {
super.init();
setBackground(Color.black);
orgX = (int)getSize().width /2;
orgY = (int) (getSize().height / 2);
}

public void paint(Graphics g) {
g.setColor(Color.yellow);

// 從斜角繪製
// 繞 x 軸轉 30 度,繞 y 軸轉 -30 度
double angleX = Math.toRadians(30);
double angleY = Math.toRadians(-30);

for(int z = 200; z >= -200; z-=10) {
for(int x = -200; x <= 200; x++) {
double y = 30*(Math.cos(
Math.toRadians(
Math.sqrt(x*x+z*z)))
+ Math.cos(
Math.toRadians(3 *
Math.sqrt(x*x+z*z)));

// 立體旋轉,從斜角繪製,調整繪圖中心至視窗中心
int pointX = (int) (orgX + x*Math.cos(angleY) +
z*Math.sin(angleY));
int pointY = (int) (orgY - (y*Math.cos(angleX) -
(-x*Math.sin(angleY) +
z*Math.cos(angleY)) *
Math.sin(angleX)));
g.drawLine(pointX, pointY, pointX, pointY);
}
}
}
}