热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

编程模拟自然(六):如何画一颗动态树

序《元纪》上记载,在伊甸园的中央有两棵树,一棵为生命树,一棵为真值树。创世神对他的子民说,园子里各样的果子都可以吃,除了真值树上的果子不可吃。但亚当夏娃受了蛇的诱惑,吃了真值果,从此他们两人人知晓

  《元纪》上记载,在伊甸园的中央有两棵树,一棵为生命树,一棵为真值树。创世神对他的子民说,园子里各样的果子都可以吃,除了真值树上的果子不可吃。但亚当夏娃受了蛇的诱惑,吃了真值果,从此他们两人人知晓了二进制,离开伊甸园后过上了幸福快乐的程序猿生活。

  “这条蛇怎么一动不动啊?”夏娃小心翼翼地躲在亚当身后

  “蛇是冷血动物,启动比较慢!”亚当做着解释。

  .....一刻钟后,蛇醒了过来。

  “你是谁?为何出现在这里?”亚当的语气有些不满,估计这蛇刚才惊吓到了夏娃。

  “哦,你好,我的名字是VisualSnake,觉得长可以简称VS。”

  “这么奇怪的名字。”

  “这是创世神起的,我可是他手底下最得意的IDE。”

  “想起来了,我在前年见过你。”夏娃想起了什么。

  “哦?那不是我,蛇每年都要蜕皮换代的!”VS回答。

  蛇微笑着继续说,

  “...我想你见到的应该是VS2013。”

图6-1 创世神的警告

第零章 如何成为一名优秀的程序猿

  “为什么警告有256条?”夏娃有些疑惑

  “多于256条就会引发SnakeOverFlow,我是不会吃饱了撑着的。”VS想摊一下双手的,意识到自己没有手只好摇一摇尾巴。

  “既然警告这么多次,那我们就不吃了“

  “别啊,一名合格的程序猿从来都是无视警告,他只关心错误!“

  “啊?“

  “开玩笑的,优秀是由好的习惯、辛勤劳动、惊人毅力...共同促成,好了,我就不穷举了。”

  “那我们要怎么做呢?”亚当问了关键的一句。

  “你们将在我的帮助下完成一个项目,只有实践才能真正出真知...”

  “同时在这过程中我将教会你们优秀程序猿进行程序开发的必备准则。”

  “所以一款优秀的IDE也是很重要的,比如我...”VS絮絮叨叨个没完。

第一章 所有的原则或者原理都有其适用范围

  “始终记住...无论它们是如何正确,都只能在特定场合发挥作用”

  “你们要做的程序是创世神留下来的静态树,现在你们要进一步完善它。”

  “首先给你们的项目起个名称,默认是MyFirstProject。”

  “不如叫HelloWorld吧。”亚当突然冒出一句。

  “小伙子,你很有天赋啊!”

图6-2 创世神的水墨静态树

  “这是一颗静态树,现在你们要设计算法让它可以生长。”

第二章 从简单开始,逐步求精

  “无论是学习过程还是程序开发,这点都适用。”

图6-3 动态树-生长

  只要给每个树干设定一个成长系数,树干的长度和宽度都和这个系数相关。

  ----

  “逐步求精方法就如同这树木成长,由简到繁,符合大自然的规律,哈哈...”VS似乎喜欢这种淳淳教诲的感觉。

第三章 尽量避免重复错误,及时承认错误并从失败中总结教训

  “夏娃小姐,你有一条错误”

  “什么?错误?没有啊”

  “是的,你有一条错误信息”

  “我不听我不听我不听。”

  “……“

图6-3 动态树-晃动

  每个枝干旋转一定角度(每个枝干的旋转角度是父节点的1.618倍)

  但是这样的摇动有些生硬,好比每一个树枝对风的受力是一样的。

图6-4 动态树-晃动优化

 

  假设风向水平,那么越垂直的树枝抖动越厉害。(旋转的角度乘以树枝方向向量与风向向量的夹角正弦值即可)

  ----

  “前进道路中的错误时不可预料的,走错了方向就要及时纠正,错误同正确一样都是宝贵的经验!” 

  “那警告呢?”夏娃对刚才VS报错有些耿耿于怀。

  “......警告也要尽量避免,毕竟事物很难完美。”VS越教越自信了。

第四章 如果某个方法奏效,则在今后的工作中善用这个方法

  “总结过去是为了更好的未来。”

图6-5 动态树-飞舞

  同前面的生长、晃动结合,并且每个树枝绕当前结点实际坐标旋转。

  ----

  “掌握了简单的方法,以后就可以应用到复杂的问题中去,这也是为什么前面要说的从简单开始。”

  “那大道至简怎么解释?”一直默默写代码的亚当终于说话了。

  “一个完美的公式、统一的定理,虽然在在形式上是简单的,但它的内涵却是复杂的,这点毋庸置疑。”VS感觉自己化身一位老学究,没有人能够质疑他的话。

第五章 不要固执己见,要全面考虑各个方案的优缺点

  “时代变迁太快,技术更迭更是如此,时刻保持灵活和开放的心态。”

  “新旧事物都有好有坏,远离偏见,没有最好只有最适合的。”

图6-6 树枝贴图/画线

图6-7 直线树枝

 

图6-8 贴图树枝

 

  树枝用贴图画效果会好看很多。

  ----

  “你为什么要告诉我们这些?”

  “创世神离开伊甸园的时候,就推出了VS的'伊甸社区版',对你们个人是免费的。”

  “这不能成为理由。”

  “理由不重要,难道你们就想一直待在这里?”VS吐了下蛇信子,反问道。

后记

  后世。

  “神父,圣母夏娃和亚当初为什么选择离开伊甸园啊?”

  “他们要去找寻创世神的足迹呀!”  

  “父亲,圣母夏娃和亚当初为什么选择离开伊甸园啊?”

  “他们不想两人的爱情结晶也被困在一个小地方呀!”

  “老师,......啊?”

  “啊什么啊,一天不好好学习,就知道胡思乱想!”

  .......

  “夏娃,......?”

  “世界那么大,我想去看看吖!”

附录

  预知后情,请看下回分解。您也可以浏览目录导航

 


推荐阅读
  • VSCode快速查看函数定义和代码追踪方法详解
    本文详细介绍了在VSCode中快速查看函数定义和代码追踪的方法,包括跳转到定义位置的三种方式和返回跳转前的位置的快捷键。同时,还介绍了代码追踪插件的使用以及对符号跳转的不足之处。文章指出,直接跳转到定义和实现的位置对于程序员来说非常重要,但需要语言本身的支持。以TypeScript为例,按下F12即可跳转到函数的定义处。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • 本文介绍了使用Rust语言编写、保存和编译程序的简单步骤。首先,打开记事本文件并编写程序代码,然后将代码保存到一个以.rs为扩展名的文件中。接下来,使用rustc命令来编译运行程序。最后,通过命令行运行编译后的程序,得到输出结果。如果遇到编译错误,可以下载Build Tools for Visual Studio 2017来解决。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 本文整理了Java中org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc.getTypeInfo()方法的一些代码示例,展 ... [详细]
  • 之前一直都知道css中的部分元素具有包裹性,今天写博客的时候正好也遇到了一个,所以想总结一下,有错误的地方欢迎指出来。什么是包裹性?包裹性就是父元素的宽度会收缩到和内部元素宽度一样 ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
author-avatar
gj08rpb
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有