L-system方法是生成分形的其中一种方法,它可以从简简单单的图形开始,连续的拼接,可以生成美妙的图形。我的这个L-system方法的实现呢,
是很简单的一种,通过生成字符串,来遍历字符串的每一个字母,对应的字母代表一种含义,然后可以将含义告诉计算机,让计算机遍历字符串的时
候执行字符对应动作,这样就可以了。而字符的生成过程,如图所示:
如上图就是字符生成过程,我们可以在实现过程中,可以在字符串数组中先保存一个'F',然后遍历数组,然后再取得每一个字母,对应生成其所对应的字符串,
那么就可以形成数组中的下一个元素了。
然后在自己的程序中,给每一种字符赋予一种含义,像上面就有三种字符,'F','-','+',那么我们就为这三种字符赋予它的含义,'F'代表向前面走一次,'—'代
表逆时针旋转,'+'代表顺时针旋转,等等。你可以自己为他们赋予你自己所想的任何计算机可以执行的动作,然后在后面让计算机遍历数组,得到字符,那么就
可以进行我们自己想要的创作了。如下,是我实现时的简单代码:
import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; /** * L-system的实现,采用层层对的模式进行代码编写,来对实现进行层次化的进行 * @author LONG 2013-04-08 * @version 1.0 * */ public class LSystem extends JFrame{ private static final long serialVersionUID = 1L; private static double PI = Math.PI; //定义常量圆周率PI private Dimension di = null; //用来得到屏幕尺寸 private JPanel jp = null; //声明面板类型变量 private Graphics gr = null; //声明画布类型变量 private static String[] lsystem = new String[20]; //用来存储编码的字符串数组 private static int count = 0; //用来记录画了几次 private static double length = 500.0; //定义初始画的时候,应该画的长度 //以下三个参数用来调整图形形状 private static int b_1 = 2; private static int b_2 = 2; private static int b_3 = 2; /** * 程序的入口 * @param args */ public static void main(String[] args){ LSystem ls = new LSystem(); //创建窗体对象 lsystem[0] = "F"; //给字符数组的第一位赋值 ls.doInit(); //调用内部方法 } /** * 初始化生成用于绘画的面板 */ private void doInit(){ this.setTitle("L-system的实现"); Toolkit tl = Toolkit.getDefaultToolkit(); di = tl.getScreenSize(); this.setSize(di.width*7/8,di.height*7/8); this.setDefaultCloseOperation(3); this.setLocation(di.width/16, di.height/16); jp = new JPanel(); jp.setPreferredSize(new Dimension(di.width*7/8,di.height*7/8)); this.add(jp); this.setResizable(false); jp.setBackground(Color.BLACK); this.setVisible(true); gr = jp.getGraphics(); jp.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent e){ repaint(); } public void mouseReleased(MouseEvent e){ firstStep(e); } }); } /** * 第一步函数,进行初始化和给数组的下一位生成编码元素 */ private void firstStep(MouseEvent e){ String goal = lsystem[count++]; String values = ""; for(int i = 0; i < goal.length(); i++){ //循环对于读取出来的字符串进行遍历 if(goal.charAt(i) == 'F'){ values = values + "F-F++F*F"; }else if(goal.charAt(i) == '-'){ values = values + "-"; }else if(goal.charAt(i) == '+'){ values = values + "+"; }else if(goal.charAt(i) == '*'){ values = values + "*"; } } lsystem[count] = values; //将生成的下一次会用到的字符码付给了数组的下一个位置 secondStep(goal,count - 1,e); //调用下一步的函数,进行遍历读取字符,进行绘画 } /** * 接受编码,和绘画的次数,来进行绘画 * @param goa 用来绘制的字符编码 * @param mu 绘画的次数 */ private void secondStep(String goa,int mu,MouseEvent e){ double temp_length = length/(Math.pow(3.0, mu)); if(mu > 3){ temp_length = 5; } double x1 = e.getX(); double y1 = e.getY(); double angle = 0.0; for(int i = 0; i < goa.length();i++){ //循环读取字符串里面的字符 char temp = goa.charAt(i); if(temp == 'F'){ //如果为划线 double x2 = x1 + temp_length*Math.cos(angle); double y2 = y1 + temp_length*Math.sin(angle); gr.setColor(Color.green); gr.drawLine((int)x1, (int)y1, (int)x2, (int)y2); x1 = x2; y1 = y2; }else if(temp == '-'){ //如果是'-'号则逆时针旋转PI/3 angle -= PI/b_1; }else if(temp == '+'){ //如果是'+'号则顺时针旋转PI/3 angle += PI/b_2; }else if(temp == '*'){ //如果是'*'号则逆时针旋转PI/6 angle -= PI/b_3; } } } }
以上代码就是简单的实现,读者可以试着更改里面的三个参数(b_1,b_2,b_3),可以得到不同的形状。
一下是我通过更改参数所得到的的图形:
图一:
b_1 = 3
b_2 = 4
b_3 = 3
图二:
b_1 = 3
b_2 = 4
b_3 = 3
图三:
b_1 = 4
b_2 = 2
b_3 = 4
图四:
b_1 = 3
b_2 = 3
b_3 = 4
图五:
b_1 = 5
b_2 = 6
b_3 = 9
图六:
b_1 = 3
b_2 = 3
b_3 = 7
相关推荐
在你提到的"l-sys-code_L-system_"项目中,我们可以从标题和描述中推断出,它包含了一组用于实现L-系统绘图的源代码。具体来说,项目包括三个关键的类: 1. **LRules** 类:这是L-系统的规则部分,它定义了符号如何...
6. **推/弹(Push/Pop)**:为了实现分枝,L-System使用堆栈来保存绘图状态。当遇到推操作时,当前的绘图方向和位置会被存储;弹操作则会恢复之前的状态,形成分支的效果。 7. **画笔操作(Drawing Operations)**...
- `Lsystem` 类:负责根据输入的规则执行相应的绘图操作。 #### 三、代码细节分析 1. **主函数部分**: - 首先定义了一些变量,如角度、迭代次数、画笔宽度和线段长度。 - 接着读取用户输入的规则、迭代次数等...
L-System,全称为“ Lindenmayer System”,由数学家 Aristid Lindenmayer 在1968年提出,它通过简单的符号系统和迭代过程来模拟生物生长的规律。 L-System的核心概念包括轴(Axis)、规则(Rules)和角度(Angle)...
# 构建L-system分形树 ## 一、基本概念### 1、L-system Lindenmayer系统,简称L系统,是由荷兰乌特勒支大学的生物学和植物学家,匈牙利裔的林登麦伊尔(Aristid Lindenmayer)于1968年提出的有关生长发展中的...
这个"L-system2.zip"文件包含了一个C++实现的L-系统算法,我们可以从以下几个方面来深入理解这个知识点: 1. **L-系统的概念**:L-系统由奥地利数学家 Aristid Lindenmayer 于1968年提出,它基于一套规则和替换系统...
在"**L-system4.zip**"这个压缩包中,我们可以推测它包含了一个C++实现的L-系统算法。C++是一种强大而通用的编程语言,特别适合处理复杂的数据结构和算法,因此用C++编写L-系统程序可以实现高效的性能和灵活的设计。...
这个文件很可能是3D-LSystem的源代码或者实现项目,它可能包含了用于解释和绘制L-系统规则的算法,以及一些预设的规则集,供用户根据需求自定义生成各种3D模型。用户可以通过修改这些规则,比如调整角度、长度参数,...
**PyOpenGL实现的Lsystem** Lsystem(Lindenmayer系统)是一种数学模型,用于描述植物生长和其他自然现象的规则自相似性。它基于一套简单的符号规则,通过迭代过程生成复杂的几何图形。在计算机图形学中,Lsystem常...
而Godot引擎通过其强大的GDScript脚本语言,为开发者提供了一种创新的方式——L系统(L-System)来创建出令人惊叹的分形树。L系统是一种形式化的语言系统,它通过简单的规则和迭代过程,能够生成复杂且具有自相似性...
在这个项目中,我们将探讨如何使用 C++ 和 OpenGL 来实现 L-System 的简单版本。 首先,我们要理解 L-System 的基本元素。它由一个初始的字符串(轴)和一组重写规则组成。在每个迭代步骤中,初始字符串被其规则...
L-system 是一种分形图形生成的方法,其主要原理是设定基本简单的绘图规则,然后让计算机根据这些规则进行反复迭代,就可以生成各种各样的图形来。在我们的 L-system 生成树中,通过设定初始字符串,迭代数次将字符...
在Clojure中实现L-系统,我们可以定义一个函数来处理这些组件。首先,定义字母表和轴向,然后定义规则。接下来,编写一个递归函数,该函数接受当前的字符串、当前的角度、步进值和迭代次数,进行替换并按需旋转角度...
在本项目中,"l-system:有趣的模式生成实验,带有可视化工具" 是一个基于 JavaScript 的实现,允许用户交互地调整参数并实时查看生成的图案。JavaScript 是一种广泛使用的编程语言,特别适合用于网页开发和交互式...
总结一下,本篇介绍了一个使用ES6实现的L系统,包括了LSystem类的构建、迭代过程、以及Turtle类的实现来将字符串转化为图形。通过这种方式,我们可以模拟各种复杂的几何形态,展示出L系统在图形生成上的强大能力。
一个简单的L-系统示例是V={F},W={+,-,|},P={F→F[+F]F[-F]F},这个规则描述了科赫雪花的生成过程。 在图形学中,L-系统的输出通常被用作某种绘图算法的输入,比如Turtle绘图系统,其中笔头可以前进(F),转向(+...
本项目“L-Grammar-Drawer”是一个基于Java的简单应用,旨在帮助用户理解和可视化L-System语法。通过这个项目,开发者可以学习到如何用Java实现这种算法,从而更好地理解Lindenmayer系统的运作方式。 **Java编程...
推荐系统这是一个简单的引用系统,它利用Node.js来实现引用系统逻辑。 让我们在和上连接使用的技术Nodejs MongoDB 快速车把护照入门打开终端,例如Git Bash 在终端上分叉或克隆此项目打开项目并安装软件包从终端运行...
在 Lua 中的简单实现,以及 LÖVE2D 中的示例。 要求 Lua >= 5.1 (?) LÖVE2D(对于示例项目) 运行示例项目 love example 下载源码 使用如下的 git clone 或通过下载的 zipball git clone ...
在本项目"Based-on-the-parameter-Lsystem.zip"中,我们利用了L-系统(Lindenmayer System)这一概念来生成各种分形图形。L-系统是一种形式化的语法系统,由匈牙利生物学家 Aristid Lindenmayer 在1968年提出,主要...