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

📄 forestcurves.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>







这是要介绍的最后一个递回绘图,看起来很复杂,但其实只是程式码长了一点,实际上并不会比雪花来得复杂,只要弄清楚绘图顺序就可以了。<br>
<br>
在这边只解释单一树木的基本绘图方式,主要分为主干与支干的绘制,如下图所示,其中标号表示顶点的前进顺序: <br>







<img style="width: 117px; height: 176px;" alt="" src="images/forestCurves-1.jpg"><br>







<br>









接下来只要在主干与支干上不断的绘制一定比例的相同图形,就可以完成一颗树,将这些树排列起来就成为树林,详细的原始码请看以下的程式,其中注解部份先不
用理会: <br>

<ul>
  <li> Forest.java
  </li>
</ul>

<pre>package onlyfun.caterpillar.graphics.recursive; <br> <br>import onlyfun.caterpillar.graphics.Turtle;<br>import java.awt.*;<br>import javax.swing.JApplet;<br> <br>public class Forest extends JApplet {<br>    private Turtle t;<br>    private double ang = 86.0, k1 = 1.5, k2 = 1.0, <br>                   Leng = 2.0, k; <br>    <br>    public void init() {    <br>        t = new Turtle(); <br>        k = 1.0/(k1+2*k2+2*(k1+k2)*Math.cos(<br>                                    Math.toRadians(ang)));<br>         <br>        setBackground(Color.black); <br>    }<br>     <br>    public void woods(double leng) { <br>        if(leng &gt; Leng) { <br> //            Point p[] = new Point[3]; <br>            t.move(leng); <br>            t.warp(-leng); <br><br> <br> /* 画实心倒影 <br> <br>            // 画主干 <br>            t.warp(k*k1*leng); <br>            p[0] =  new Point((int)t.LPX, (int)t.LPY); <br>            t.turn(ang); <br>            t.warp(k*k1*leng); <br>            p[1] = new Point((int)t.LPX, (int)t.LPY); <br>            t.turn(-2*ang); <br>            t.warp(k*k1*leng); <br>            p[2] = new Point((int)t.LPX, (int)t.LPY); <br>            t.polygonF(p,3); <br> <br>            // 画右支干 <br>            t.turn(ang); <br>            t.warp(k*leng); <br>            p[0] = new Point((int)t.LPX, (int)t.LPY); <br>            t.turn(ang); <br>            t.warp(k*k2*leng); <br>            p[1] = new Point((int)t.LPX, (int)t.LPY); <br>            t.turn(-2*ang); <br>            t.warp(k*k2*leng); <br>            p[2] = new Point((int)t.LPX, (int)t.LPY); <br>            t.polygonF(p,3); <br> <br>            // 支干退回 <br>            t.warp(-k*k2*leng); <br>            t.turn(2*ang); <br>            t.warp(-k*k2*leng); <br>            t.turn(-ang); <br>            t.warp(-k*leng); <br>            t.turn(-ang); <br> <br>            // 主干退回 <br>            t.warp(-k*k1*leng); <br>            t.turn(2*ang); <br>            t.warp(-k*k1*leng); <br>            t.turn(-ang); <br>            t.warp(-k*k1*leng); <br> */ <br> <br>            woods(k*k1*leng); <br>            t.turn(ang); <br>            woods(k*k1*leng); <br>            t.turn(-2*ang); <br>            woods(k*k1*leng); <br>            t.turn(ang); <br>            woods(k*leng); <br>            t.turn(ang); <br>            woods(k*k2*leng); <br>            t.turn(-2*ang); <br>            woods(k*k2*leng); <br>            t.turn(ang); <br>            woods(k*k2*leng); <br>        } <br>        else <br>            t.warp(leng); <br>    } <br> <br>    public void paint(Graphics g) { <br>        g.setColor(Color.yellow);<br>        <br>        t.setGraphics(g);<br>        <br>        t.window(0, 0, getSize().width, getSize().height); <br>        t.view(0, 0, getSize().width, getSize().height); <br>        t.setpoint(10, getSize().height/2); <br>        t.setangle(0); <br> <br>        woods(400); <br>    }     <br>}</pre>
<br>
<img style="width: 420px; height: 183px;" alt="" src="images/forestCurves-2.jpg"><br>
<br>
如果将上例程式的注解符号去除,可以绘制树林的倒影,绘制方法是大同小异,这边是使用实心图形来表示倒影,为了绘制实心图形,在海龟绘图法中加入绘制实心多边形的方法polygonF,如下所示:<br>
<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void polygonF(Point tri[], int n) { </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] xPoints = new int[n], </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yPoints = new int[n]; </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0; i &lt; n; i++) { </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xPoints[i] = tri[i].x; </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yPoints[i] = tri[i].y; </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.fillPolygon(xPoints, yPoints, n); </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><br>
</div>
&nbsp;<br>
<br>
下图为加上倒影后的绘图成果:<br>
<img style="width: 412px; height: 323px;" alt="" src="images/forestCurves-3.jpg"><br>
<br>
到目前为止所介绍的递回绘图都是在2D平面上,实际上递回绘图在3D空间中也有相当的应用,不过复杂性也因维度的增加而复杂许多,如果有兴趣,建议您研究一下 <a href="http://www.drmaster.com.tw/info.asp?no=PG20135">JAVA 2D/3D绘图程式设计实例应用</a> 书中的3D递回绘图原始码。<br>
<br>
<br>







</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -