⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 functiongraphic.htm

📁 电脑图学(Computer Graphics)是资料结构、演算法与数学的应用
💻 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:&nbsp;函式图形绘制</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 &gt;= -200; z-=10) { <br>            for(int x = -200; x &lt;= 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 + -