热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

编程画出千姿百态的树叶

编程画出千姿百态的树叶作者:安徽省亳州三中教科处王宇邮编:236800
编程画出千姿百态的树叶
作者:安徽省亳州三中教科处王宇    邮编:236800      E-Mail: Wydz511@sohu.com   
 
走到户外,欣赏大自然的美景,映入眼帘的是千姿百态,各种各样美丽的树。这不禁使人在心旷神怡之余开始赞叹大自然的伟大。于是就有了用电脑把这美景画出来的冲动。
 
经过一番探索,程序编出来了,画出的效果还真不少,如图 1 所示,笔者根据其形状命名的有蕨叶、芦苇、叶脉、文竹、大树、嫩藤、小草、葡萄、迎客松、玫瑰花、五星花、蒲公英、塔、羽毛、凤凰、孔雀、浪花、稻草人等。
 
           
  
 仔细观察它们的形状有何规律,那就是自相似性,一棵树分的一个叉又是一棵小树。
 
 为了说明原理,笔者以二维情况下非常典型的一棵小树为例来介绍画图的算法。
 
  设这棵树发了两个叉,如图 2 深色部分所示。沿着箭头的方向,画这棵树需要如下步骤。
 
首先从起点开始向前走到第一个分叉点,设距离是L1
 
②向左转θ 1
 
③画子树;
 
④向右转回θ 1 ,然后再向左转 θ,这个θ角相当于树的曲度;
 
⑤继续向前走 到第二个分叉点,又走了L2
 
⑥向右转θ 2
 
⑦画子树;
 
⑧向左转θ 2 ,考虑到如果树枝下面还有枝节,应该再向左多转 θ表示树的曲度;
 
⑨向右转回θ,后退L2,回到 第二个分叉点
 
⑩向右转回θ,后退L1,回到起点。
 
至此一棵完整的树就诞生了。
 
算法分析:在算法中,③、⑦用到了递归方法,对自身进行调用,正是这一步骤模拟了自然界树木生长的实质。⑨、 ⑩两个步骤为回溯算法,保证画完子树之后能退回到 转弯时的出发点。
 
对于一般的情况程序核心代码如下:
 
Sub leaf(ByVal n As Integer, ByVal l As Single)
' 蕨叶(n为递归深度,大小为L )蕨叶和树结构类似
Dim i As Integer 'i 是循环变量
If n = 0 Then Exit Sub ' 递归的结束条件
  For i = branch To 1 Step -1 'branch 指枝条数
    FD L1 * i / branch * l 
    LT Seta1
    leaf n - 1, i / branch * l / K1 ' 左子树大小的比例系数为 K1
    RT Seta1 – Seta ' 树的曲度为 Seta
    FD L2 * i / branch * l
    RT Seta2
    leaf n - 1, i / branch * l / K2 ' 右子树大小的比例系数为 K2
    LT Seta2 + Seta
  Next i
  For i = 1 To branch    ' 回溯主叶干
    RT Seta
    BK L2 * i / branch * l
    RT Seta
    BK L1 * i / branch * l
  Next i
End Sub
 
程序说明:
 
本程序为多枝条树的画法,主要是用递归和循环来描述的。对于程序究竟是怎么执行的,聪明的你还需要动脑去想一想,这可是使你更加深刻的理解递归和循环的好机会啊。
 
在程序中调用了一些称为海龟作图的函数,假设有一只听话的小海龟在受你的控制,它能听懂如下命令: FD n,在当前位置上前进n步;BK n,在当前位置上后退n步;RT n,在当前位置上向右转n度;LT n,在当前位置上向左转n度。这些函数用VB的Line 语句很好实现,这里就不再详细介绍了。
 
代码可能比较枯燥,但看着这些美丽的效果你就会感受到编程的无穷乐趣了。
 
程序界面如图 3 所示:
 
在程序运行时可以方便的调节各个参数,通过调整比例系数可以改变子树的大小,从而决定画出的形状更像是树之还是树叶;调整子树的倾斜角度可以形成不同的树种;在各个参数中曲度对树的形状影响最大,调整它可以生成不同类别的图案。使用动画按钮还可观察到一个树叶从小到大的生长过程。
 
通过编程画出了这些千姿百态的树形图案,这些图案也许从几何层面上揭示了自然界的生物生长、海浪等现象的原理,那就是整体是由自身的部分不断复制而形成的。
 
对程序的拓广:
 
如果增加三维功能,则可描绘出更加逼真的树图。
 
只要稍微变换一下规则,还可画出各种类似具有分形规律的图形。
 
赶快动手吧,大自然蕴含的无穷规律正等待我们去不断探索,不断发现。
 

程序下载页面蕨叶生成器

本文已发表在《电脑报》2005年12期(2005.4.16),并收入2005《电脑报》合订本。
 
作品名称:编程画出千姿百态的树叶
程序名称:蕨叶生成器
制作日期: 2005.2.16
邮编: 236800
作者 E-Mail: Wydz511@sohu.com  
QQ 84115144

推荐阅读
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 本文介绍了读写锁(RWMutex)的基本概念、实现原理及其在Go语言中的应用。读写锁允许多个读操作并发执行,但在写操作时确保互斥,从而提高并发性能。 ... [详细]
  • 本文将深入探讨C语言代码的可重用性,解释其重要性和实现方法。通过具体示例,我们将展示如何通过封装和模块化设计提高代码的可重用性。 ... [详细]
  • 自动驾驶中的9种传感器融合算法
    来源丨AI修炼之路在自动驾驶汽车中,传感器融合是融合来自多个传感器数据的过程。该步骤在机器人技术中是强制性的,因为它提供了更高的可靠性、冗余性以及最终的 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 结城浩(1963年7月出生),日本资深程序员和技术作家,居住在东京武藏野市。他开发了著名的YukiWiki软件,并在杂志上发表了大量程序入门文章和技术翻译作品。结城浩著有30多本关于编程和数学的书籍,其中许多被翻译成英文和韩文。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 《我的世界》Java版种子合集:探索多样世界生成
    本文介绍了《我的世界》Java版中用于生成多样化游戏世界的种子代码。这些种子是由一个或多个字符(包括正整数和负整数)组成的值,能够为玩家带来截然不同的地形和环境体验。通过使用不同的种子,玩家可以探索各种独特的地貌、生物群系和结构,从而丰富游戏的乐趣和挑战性。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
author-avatar
迈迈最love
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有