Project 4.c 分形

分形 (Fractal) 是一类几何形状. 它们的特点是在任意小的尺度上都有精细的结构. 分形通常可以由一些简单结构通过不断组合, 分裂形成, 即所谓的自相似性 (self-similar): 任意的局部都有和整体相似的形状. 它们与传统的几何(点, 线, 多边形, 多面体等)有很大的不同, 有许多令人吃惊的性质. 例如可以通过分形构造出封闭的几何图形, 它们的面积是有限的, 但周长无限. 又如, 可以通过分形构造出连续但几乎处处不可微的曲线. 分形是自然界中常见的现象: 岛屿的海岸线, 破碎的玻璃边缘等都体现出分形结构. 同时, 分形在艺术创作, 工艺品设计, 建筑中也有用武之地.

在这个 Project 中我们首先以 Koch 曲线 为例, 介绍分形的特征. 随后简单介绍一个画图包. 在实验内容中, 你需要设计并定义一个类. 通过这个类提供的接口, 用户可以完成一些分形的绘制. 通过这个实验, 我们希望帮助你体会使用面向对象方法解决实际问题的基本流程:

简介

Koch 曲线 (Koch curves)

Koch 曲线是一种分形曲线. 以下分别是0阶, 1阶, 2阶及3阶 Koch 曲线.

0阶      1阶      2阶      3阶

绘制 n 阶 Koch 曲线可以通过以下算法实现:

Koch 雪花 (Koch snowflake)

Koch 雪花是二维平面上由 Koch 曲线组合成的封闭图形. 以下分别是0阶, 1阶, 2阶及3阶 Koch 雪花.

              

绘制 n 阶 Koch 雪花可以通过以下算法实现:

问题: Koch 雪花的面积是有限的, 但周长是无限. 你能否写出周长和面积的表达式?

StdDraw 画图包

StdDraw 包封装了一些基本的画图方法. 可以利用它来绘制简单的集合图形包括点, 线, 矩形, 圆等. 详细的说明可以参见它的文档. 以下列出我们可能会用到的接口:

方法 说明
StdDraw.line(double x1, double y1, double x2, double y2) 画一条从 (x1, y1) 到 (x2, y2) 的直线
StdDraw.setXscale(double minx, double maxx) 画纸 X 轴最左边坐标为 minx, 最右边坐标为 maxx, 默认情况分别为0和1
StdDraw.setYscale(double miny, double maxy) 画纸 Y 轴最下边坐标为 miny, 最上边坐标为 maxy, 默认情况分别为0和1

Math 包

在绘制分形时, 往往需要计算长度和角度. 可以使用 Java Math 包来完成. 我们可能会用到的函数包括:

实验内容

  1. 观察并分析以下三个画图任务, 利用 StdDraw 设计一个类 TurtleDrawer, 使得这三类图片都可以使用 TurtleDrawer 所提供的接口画出. 并利用所设计的 TurtleDrawer 画出这三种图.

              

              

              

  1. 绘制 Koch 雪花. 接收命令行参数 N, 表示图形的阶数 (以下实验中, 参数均通过命令行给出).

  2. 在绘制 Koch 曲线时, 将其中的顺时针替换成逆时针, 逆时针替换成顺时针. 用修改后的 Koch 曲线绘制 Koch 雪花.

  3. 绘制以下分形.

               

               

               

               

               

               

               

  1. 你能否设计出自己的分形?