L系统(L-System)模拟植物生长(java实现)

不知不觉到了毕业季,回顾10多年前在海外的大学生活,感觉即特别又辛酸。这几天翻了一下大学期间完成的一个非常有意思的模拟植物生长的小软件,进行分享,给即将步入大学的众多IT行业的学子加油。


一. L-系统原理介绍

L-系统是匈牙利生物学家Aristid LinderMayer于1968年提出的。L-系统的本质是一个重写系统,通过对植物对象生长过程的经验式概括和抽象,初始状态与描述规则,进行有限次迭代,生成字符发展序列以表现植物的拓扑结构,并对产生的字符串进行几何解释,就能生成非常复杂的分形图形。

具体例子如下:雪花曲线

v:{F,+, - }

w:F

p:F->F-F++F-F

几何解释是:

F:向前画一条线

+:右转67.5度(++即为右转135度)

-:左转45

具体信息见下图,当迭代次数n=3时就可以得出很好的雪花形状。


二. 案例结果展示

本案例是在2005年圣诞节期间开发,采用Java开发语言,底层代码完全自己编写,未引用任何第三方包。

先展示一下系统的结果:

案例一:

规则:

如左图所示,

  • Angle: 角度,案例中为45
  • Axiom: 初始公式, 案例中为f
  • Line length: 线条单位长度
  • Speed: 生长速度, 案例中为线条的生成速度
  • Rules: F和f的单位是一样的, 在这里, F在每次迭代后替换为FF, f 替换为F[-f]+f。中括号这里表示额外的分枝.


结果展示:

一次迭代

三次迭代

十次迭代

 

 

 


案例二

规则:

结果展示:

一次迭代

三次迭代

六次迭代

 

 

 

 

 

 

 

案例三

规则:

结果展示如下:

一次迭代 三次迭代 七次迭代

案例四

规则:

结果展示如下:

一次迭代

三次迭代

四次迭代

 

 

 

 

 

 

 

 

 

 

案例五

规则:

结果展示如下:

一次迭代

三次迭代

五次迭代

 

 

 

 

 

 

 

 

 

 

 

 

 

案例6

规则:

结果展示如下:

一次迭代

三次迭代

七次迭代

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三. 系统界面

这里把系统界面再介绍一下,截屏如下:

界面左侧是绘图区域.

右侧在上一章节的规则部分有截图,除去已经截图的,其他部分说明如下:

  • Map Value  –  选择初始公式以及规则
  • Times          –  迭代次数
  • Color           –  选择绘制的图案颜色

四. 原始代码:

一共五个类文件:

  • Gui.java              –  主界面
  • DrawPanel.java  –  图案绘制
  • LRules.java         –  定义公式以及规则
  • Point.java           –  点对象
  • Start.java            –  启动类

下面贴出LRules.java, DrawPanel.java, 以及Point.java的原始代码,感兴趣的可以拿来使用,并且自己定义自己喜欢的风格的界面,进一步的扩充里面的规则案例.

LRules.java

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.geom.Line2D;

import java.util.Stack;

 

publicclass LRules {

 

    public String combineLine(intiteration, String axioms, String rule1, String rule2)

    {

         String products="";

         String product = axioms;

         for (intn = 0; n < iteration; n++) {

               products="";

               for (inti = 0; i < product.length(); i++) {

                   charcurrent = product.charAt(i);

                   charcheck1 = rule1.charAt(0);

                   charcheck2 = rule2.charAt(0);

                   if (current == check1) {

                       products = products.concat(

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值