📄 forestcurves.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>
这是要介绍的最后一个递回绘图,看起来很复杂,但其实只是程式码长了一点,实际上并不会比雪花来得复杂,只要弄清楚绘图顺序就可以了。<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 > 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;"> 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;"> 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;"> 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;"> </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;"> for(int i = 0; i < 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;"> 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;"> 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;"> } </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;"> </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;"> 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;"> } </span><br>
</div>
<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 + -