`
felixour
  • 浏览: 32902 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

L-system

    博客分类:
  • JAVA
阅读更多

也许是不小心又翻到了去年暑假的那个分形PPT,让我想起来还有一个没有完成的任务,就是L-system。

 

当时刚接触java,还是属于很年轻的,但是经过了那么久的积淀,我觉得我可以解决这个问题。

 

于是,我开始了探求L-system之旅。

 

首先我们还是来回顾一下Koch雪花,当时我们是直接用递归来解决的问题:

/**
 * 画雪花的方法
 * 
 * @param g图形对象
 * @param x1左边点的横坐标
 * @param y1左边点的纵坐标
 * @param x2右边点的横坐标
 * @param y2右边点的纵坐标
 * @param count画线的次数
 */
public void drawkoch(Graphics g, double x1, double y1, double x2,
		double y2, int count) {
	if (count <= 1) {
		g.drawLine((int) x1, (int) y1, (int) x2, (int) y2);// 画线
	} else {
		double x3 = (2 * x1 + x2) / 3;// 第一个三等份点的x坐标
		double y3 = (2 * y1 + y2) / 3;// 第一个三等份点的y坐标
		double x4 = (x1 + 2 * x2) / 3;// 第二个三等份点的x坐标
		double y4 = (y1 + 2 * y2) / 3;// 第二个三等份点的y坐标
		double k = (x1 - x2) * (y1 - y2);// 线的斜率
		double x5 = x1, y5 = y1;// 第一个三等份点的x坐标
		if (y3 == y4)// 直线
		{
			x5 = (x3 + x4) / 2;
			y5 = y3 - (x4 - x3) * Math.sqrt(3) / 2;
		} else if (k < 0)// 左斜线
		{
			x5 = x1;
			y5 = y4;
		} else if (k > 0)// 右斜线
		{
			x5 = x2;
			y5 = y3;
		}
		if (x3 == x4) // 如果斜线为竖线
		{
			x5 = x3;
			y5 = y3;
		}
		// 画尖端的左面那条线
		drawkoch(g, x3, y3, x5, y5, count - 1);
		// 画尖端的右面那条线
		drawkoch(g, x5, y5, x4, y4, count - 1);
		// 画左边那条直线
		drawkoch(g, x1, y1, x3, y3, count - 1);
		// 画右边那条直线
		drawkoch(g, x4, y4, x2, y2, count - 1);
	}
}

 

但是这一次,我们使用的并不仅仅是递归,而是用字母表和符号串来表达生成的对象的初始形式,称之为公理(axiom)。

 

现在我们可以定义如下字符规则:

F:在当前方向前进一个单位,并画线

+:逆时针旋转α角度

-:顺时针旋转α角度

 

我们再定义一个字符转换规则:F -> F-F++F-F

那么下一步将会转成:F-F++F-F-F-F++F-F++F-F++F-F-F-F++F-F

以此类推,我们取α=60度,便得到我们以前画的Koch雪花。

 

那么如果我们在每画完一条直线时,稍微附带着偏转一个角度,结果会更加的令人惊讶的!

 

public static final String strF = "F-F++F-F";// 基础字符串
private double theta = Math.PI * 60 / 180;// 偏转固定的角度
String axiom = "F-F++F-F";// "公理"字符串
double d = 50;// 单位长度
double garma = 3;// 微调时的偏转角度
double x1, y1;// 画线的初始点

/**
 * 根据字符串axiom,画出图形
 * 
 * @param axiom
 * @param g
 */
public void drawLS(String axiom, Graphics g) {
	// 把中点坐标定到屏幕正中心
	x1 = getWidth() / 2;
	y1 = getHeight() / 2;
	double x2 = x1, y2 = y1;// 用于存取下一步的位置
	double alpha = 0;// 当前所指向的角度
	// 循环遍历字符串,根据字符串所给出的提示,F表示前进一个单位,+表示逆时针旋转α,-表示顺时针旋转α
	for (int i = 0; i < axiom.length(); i++) {
		switch (axiom.charAt(i)) {
		case 'F':// 如果是F就走一部
			// 计算下一步的坐标
			x2 = x1 + d * Math.cos(alpha);
			y2 = y1 + d * Math.sin(alpha);
			// 根据坐标画线
			g.drawLine((int) x1, (int) y1, (int) x2, (int) y2);
			// x1,y1变到新的坐标点
			x1 = x2;
			y1 = y2;
			break;
		case '-':// -表示顺时针旋转α
			alpha -= theta;
			// 在两个strF中间,要进行一个小角度的偏转,使得图形偏转角度趋于混乱
			if (i < axiom.length() - 2) {
				if (axiom.charAt(i + 1) == 'F'
						&& axiom.charAt(i + 2) == '+') {
					double a = Math.PI * garma / 180;// 根据γ计算出偏转角度a
					alpha -= a;// α再逆时针旋转a
				}
			}
			break;
		case '+':// +表示逆时针旋转α
			alpha += theta;
			break;
		}
	}
}

/**
 * 字符串递归的方法
 * 
 * @param str如果是small就是变小
 *            ,如果是large就是变大
 */
public void dealAxiom(String str) {
	if (str.equals("small")) {
		if (!axiom.equals("F")) {
			axiom = axiom.replace(strF, "F");// 用"F"代替strF
		}
	}
	if (str.equals("large")) {
		axiom = axiom.replace("F", strF);// 用strF代替"F"
	}
}

 



 

 

 

 

 

学习永远没有尽头,to be continue...

  • 大小: 30.2 KB
  • 大小: 42.3 KB
  • 大小: 46.9 KB
  • 大小: 18.2 KB
  • 大小: 19.7 KB
3
3
分享到:
评论

相关推荐

    L-System源码

    **L-System源码**是基于Microsoft Foundation Classes (MFC)框架实现的一种计算机图形学算法。L-System,全称为Lindenmayer System,是由生物学家 Aristid Lindenmayer 在1968年提出的一种形式化系统,主要用于描述...

    l-sys-code_L-system_

    L-系统(L-system或 Lindenmayer system)是一种形式语法,由生物学家 Aristid Lindenmayer 在1968年提出,主要用于描述植物生长和分形几何的数学模型。这个模型通过一套简单的规则来生成复杂图形,常用于计算机图形...

    计算机图形学平面L-System

    在这个特定的场景中,我们关注的是平面内的L-System,这是一种用数学规则来描述和生成复杂几何形状的算法,尤其常用于模拟自然界的植物生长。 L-System,全称为“Lindenmayer System”,由生物学家 Aristid ...

    L-system-31.rar_L-Studio_L-system_L-system-31_L_system_Studio

    在L-System 3.1的光盘镜像文件中,我们看到的“L-system-31.ISO”很可能是该软件的安装镜像文件,用户可以通过虚拟光驱或者刻录软件加载该ISO文件进行安装。而“www.pudn.com.txt”可能是一份文本文件,通常包含下载...

    PyPI 官网下载 | L-System-Visualizer-1.0.6.tar.gz

    《PyPI官网下载的L-System-Visualizer-1.0.6.tar.gz解析与应用》 在Python的世界中,PyPI(Python Package Index)是官方的第三方软件包仓库,它为开发者提供了一个集中地发布和获取Python库的平台。本次我们将深入...

    JAVA实现L-System树形绘制

    - `Lsystem` 类:负责根据输入的规则执行相应的绘图操作。 #### 三、代码细节分析 1. **主函数部分**: - 首先定义了一些变量,如角度、迭代次数、画笔宽度和线段长度。 - 接着读取用户输入的规则、迭代次数等...

    计算机图形学L-System实验(三维)

    L-System,全称为“ Lindenmayer System”,由数学家 Aristid Lindenmayer 在1968年提出,它通过简单的符号系统和迭代过程来模拟生物生长的规律。 L-System的核心概念包括轴(Axis)、规则(Rules)和角度(Angle)...

    L-System算法的美英文版

    L-System算法是一种用于模拟生物体生长过程的数学模型,尤其在创建植物形态的分形图形中有着广泛的应用。这个算法是由匈牙利生物学家阿林登迈耶(Aristid Lindenmayer)在1968年发明的,用于模拟植物细胞的发展过程...

    java 实现L-system系统

    void draw(LSystem lSystem, int iterations) { String currentString = lSystem.getAxiom(); for (int i = 0; i ; i++) { currentString = lSystem.applyRules(currentString); } for (char c : current...

    计算机图形学期末大作业-构建L-system分形树.zip

    # 构建L-system分形树 ## 一、基本概念### 1、L-system&emsp;Lindenmayer系统,简称L系统,是由荷兰乌特勒支大学的生物学和植物学家,匈牙利裔的林登麦伊尔(Aristid Lindenmayer)于1968年提出的有关生长发展中的...

    java版 L-system 源代码

    介绍L系统源代码, 它实际上是字符串重写系统,如果把字符串解释成曲线,只要能生成字符串,也就等于生成了图形。它可以模拟多细胞体生长发育。随着计算机科学的发展,L系统的功能也得到了不断的扩展,现已经广泛的...

    L-system2.zip_C++_zip

    这个"L-system2.zip"文件包含了一个C++实现的L-系统算法,我们可以从以下几个方面来深入理解这个知识点: 1. **L-系统的概念**:L-系统由奥地利数学家 Aristid Lindenmayer 于1968年提出,它基于一套规则和替换系统...

    L-System之学习总结

    NULL 博文链接:https://wybwzl.iteye.com/blog/1275520

    L-system4.zip_C++_zip

    在"**L-system4.zip**"这个压缩包中,我们可以推测它包含了一个C++实现的L-系统算法。C++是一种强大而通用的编程语言,特别适合处理复杂的数据结构和算法,因此用C++编写L-系统程序可以实现高效的性能和灵活的设计。...

    L-System-Visualizer-导入器:导入由L-System-Visualizer导出的文件

    导入由L-System-Visualizer导出的文件。 概述 L-System-Visualizer( )能够导出包含渲染中使用的模型的渲染以及这些模型的实例。 为了在其他项目中使用该信息,必须从导出的文件中提取该信息。 该进口商可以做到这...

    单张图片树木L-system的智能提取算法

    介绍了一种新颖的从单张树木图片中提取树木的L-system规则的算法,并将其应用于三维树木建模。用户首先在图片上勾画出树木的主要可见枝干和树冠轮廓,通过图像处理的方法识别出树木的可见枝干的二维骨架;然后依据树木...

    L系统(Lindenmayer-System)算法代码

    L系统算法代码,C++,可生成多种pattern的SVG格式图像。基于https://github.com/SHA-T/lindenmayer。在Win11 Visual Studio 2022下调试成功。需要配置GLM库...

    Godot-L-System-Fractal-Trees:Godot L系统分形树

    在Godot-L-System-Fractal-Trees项目中,除了L系统外,还引入了“乌龟绘图”(Turtle Graphics)的概念。乌龟绘图是一种基于位置和方向的概念,它模拟了一个虚拟的“乌龟”,在平面上移动并根据指令改变方向和绘制...

    L-System-Visualizer:python中的Lindenmayer系统可视化工具

    L系统项目 软件工程| 索尔兹伯里大学数学与计算机科学系 项目介绍 该应用程序是用Python...python -m lsystem 替代方法 您也可以在本地克隆存储库并运行。 python ./__main__.py 使用应用程序 请按照内置教程按钮中的

    L-System:Lindemayer 系统(植物)

    系统Lindemayer 的 L 系统(植物) 控制: F1-F6:在不同的 L 系统中加载。 W、S、A、D:移动相机左右方向键:减小和增大分支旋转角度上下方向键:增加和减少迭代次数X,Z:放大和缩小Q,E:增加和减少组成树的线的...

Global site tag (gtag.js) - Google Analytics