📄 functiongraphic.htm
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>函式图形绘制</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="ComputerGraphics.htm">Computer Graphics: 函式图形绘制</a></h1>
工程相关领域的行业,通常少不了面对函式绘图,现在有许多的软体都可以使用更方便的功能来绘制复杂的函式图形,如著名的Matlab。<br>
<br>
在这边介绍三维立体空间的函式绘制,将函式分为两类:“显函式”与“隐函式”。<br>
<h2>显函式</h2>
如果可以将函式表示为y = f(x, z) 的形式,这种函式称之为显函式,由于显函式的(x,z)只会产生一个结果,所以显函式所表示的图形若使用一条与y轴平行的直线来与图形相交,最多只有一个交点。<br>
<br>
绘制显函式的方法就是分别对x与z进行回圈计数,并带入原方程式求出y值,然后在荧幕上绘出(x, y)的对应图(z = f(x, y)或x = f(y, z)只是换个角度绘图,方法一样)。<br>
<h2>隐函式</h2>
如果函式是f(x, y, z) = 0的形式,称之为隐函式,虽然y - f(x, z) =
0也可以算是属于此种形式,不过这边所说的隐函式是指那些无法化为y = f(x,
z)形式的函式;当画上一条与y轴平行的直线时,可能会发生几个情况,例如以球面函式x^2 + y^2 + z^2 - 1 =
0来说,可能没有交点、一个交点或是两个交点,如下图所示: <br>
<img style="width: 253px; height: 236px;" alt="" src="images/functionGraphic-1.jpg"><br>
<br>
由于一对(x, z)值可能会有两个交点,所以我们必须将隐函式设法改变为以下的形式才能进行绘图:<br>
<div style="margin-left: 40px; font-weight: bold; font-family: Courier New,Courier,monospace;">x = x(s, t)<br>
y = y(s, t)<br>
z = z(s, t)<br>
</div>
<br>
以上的形式称之为参数式,之后我们就可以利用(s, t)进行回圈计数并计算出(x, y, z)的值并进行绘图,当然(x, y, z)的参数式代回原来的函式必须满足原来的函式,以球面函式x<sup>2</sup> + y<sup>2</sup> + z<sup>2</sup> - 1 = 0为例,较好的参数表示式当然就是极座标表示法。<br>
<br>
大部份的隐函式都可以使用参数式来进行绘图,不过不同的函式会需要不同的参数式,以下示范显函式的绘图:<br>
<ul>
<li> FunctionGraphicDemo.java</li>
</ul>
<pre>package onlyfun.caterpillar;<br> <br>import java.awt.Color;<br>import java.awt.Graphics;<br>import javax.swing.JApplet;<br> <br>public class FunctionGraphicDemo extends JApplet {<br> private int orgX;<br> private int orgY;<br> <br> public void init() {<br> super.init();<br> setBackground(Color.black);<br> orgX = (int)getSize().width /2;<br> orgY = (int) (getSize().height / 2);<br> }<br> <br> public void paint(Graphics g) {<br> g.setColor(Color.yellow);<br> <br> // 从斜角绘制<br> // 绕 x 轴转 30 度,绕 y 轴转 -30 度<br> double angleX = Math.toRadians(30);<br> double angleY = Math.toRadians(-30);<br><br> for(int z = 200; z >= -200; z-=10) { <br> for(int x = -200; x <= 200; x++) {<br> double y = 30*(Math.cos(<br> Math.toRadians(<br> Math.sqrt(x*x+z*z))) <br> + Math.cos(<br> Math.toRadians(3 *<br> Math.sqrt(x*x+z*z))); <br> <br> // 立体旋转,从斜角绘制,调整绘图中心至视窗中心<br> int pointX = (int) (orgX + x*Math.cos(angleY) + <br> z*Math.sin(angleY));<br> int pointY = (int) (orgY - (y*Math.cos(angleX) - <br> (-x*Math.sin(angleY) + <br> z*Math.cos(angleY)) * <br> Math.sin(angleX))); <br> g.drawLine(pointX, pointY, pointX, pointY); <br> } <br> }<br> }<br>}</pre>
<br>
<br>
<img style="width: 606px; height: 467px;" alt="" src="images/functionGraphic-2.jpg"><br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -