# 六边形分形几何图形绘制
下面是一个使用Python turtle库绘制六边形分形的完整实现:
```python
import turtle
import math
# 设置画布
screen = turtle.Screen()
screen.setup(800, 800)
screen.title("六边形分形几何图形")
screen.bgcolor("black")
# 创建画笔
t = turtle.Turtle()
t.speed(0) # 最快速度
t.pensize(1)
t.hideturtle()
def draw_hexagon(x, y, radius):
"""
绘制一个正六边形
参数:
x, y: 六边形中心坐标
radius: 外接圆半径
"""
# 计算六个顶点坐标
points = []
for i in range(6):
angle = math.radians(60 * i) # 每个角60度
px = x + radius * math.cos(angle)
py = y + radius * math.sin(angle)
points.append((px, py))
# 绘制六边形
t.penup()
t.goto(points[0])
t.pendown()
for i in range(1, 6):
t.goto(points[i])
t.goto(points[0]) # 回到起点闭合图形
def draw_hex_fractal(x, y, radius, depth):
"""
递归绘制六边形分形
参数:
x, y: 当前六边形中心坐标
radius: 当前六边形半径
depth: 当前递归深度
"""
if depth == 0: # 停止条件
return
# 根据深度设置颜色(创建渐变效果)
colors = ["#FF6B6B", "#4ECDC4", "#FFE66D", "#1A535C", "#F7FFF7"]
t.pencolor(colors[depth % len(colors)])
# 绘制当前六边形
draw_hexagon(x, y, radius)
# 计算子六边形的半径(缩小为原来的40%)
new_radius = radius * 0.4
# 计算六个边上新六边形的位置
# 在每个顶点方向上放置一个子六边形
for i in range(6):
angle = math.radians(60 * i)
# 子六边形中心距离父六边形中心的距离
distance = radius + new_radius
new_x = x + distance * math.cos(angle)
new_y = y + distance * math.sin(angle)
# 递归绘制子六边形
draw_hex_fractal(new_x, new_y, new_radius, depth - 1)
# 另一种风格:在六边形内部绘制更小的六边形
def draw_inner_hex_fractal(x, y, radius, depth):
"""
向内收缩的六边形分形
"""
if depth == 0:
return
# 设置颜色
colors = ["#FF9AA2", "#FFB7B2", "#FFDAC1", "#E2F0CB", "#B5EAD7"]
t.pencolor(colors[depth % len(colors)])
# 绘制当前六边形
draw_hexagon(x, y, radius)
# 计算内部六边形的半径
new_radius = radius * 0.7 # 缩小比例
# 递归绘制内部六边形
draw_inner_hex_fractal(x, y, new_radius, depth - 1)
# 第三种风格:蜂巢式分形
def draw_honeycomb_fractal(x, y, radius, depth):
"""
蜂巢模式六边形分形
"""
if depth == 0:
return
# 绘制中心六边形
t.pencolor("#FFD700")
draw_hexagon(x, y, radius)
# 如果还有深度,继续在周围绘制
if depth > 1:
new_radius = radius * 0.8
# 在六个方向上绘制子分形
for i in range(6):
angle = math.radians(60 * i)
distance = radius * 1.5 # 间距
new_x = x + distance * math.cos(angle)
new_y = y + distance * math.sin(angle)
draw_honeycomb_fractal(new_x, new_y, new_radius, depth - 1)
# 选择要绘制的分形类型
t.clear() # 清空画布
# 选项1:向外扩展的六边形分形
t.color("cyan")
draw_hex_fractal(0, 0, 100, 4)
# 选项2:向内收缩的六边形分形(取消注释下面两行可查看效果)
# t.clear()
# draw_inner_hex_fractal(0, 0, 150, 6)
# 选项3:蜂巢式分形(取消注释下面两行可查看效果)
# t.clear()
# draw_honeycomb_fractal(0, 0, 60, 3)
# 更新屏幕并等待点击关闭
screen.update()
screen.exitonclick()
```
## 代码解释
### 1. 核心函数说明
#### `draw_hexagon(x, y, radius)`
- **功能**:绘制一个以(x,y)为中心、radius为外接圆半径的正六边形
- **原理**:
- 正六边形可以看作是将圆周6等分
- 每个顶点的角度间隔60度(360°/6)
- 使用三角函数计算各顶点坐标:`x + r*cos(θ)`, `y + r*sin(θ)`
#### `draw_hex_fractal(x, y, radius, depth)`
- **功能**:向外扩展的六边形分形
- **特点**:
- 在每个父六边形的六个顶点方向上放置子六边形
- 子六边形与父六边形外切
- 形成星状扩散效果
- 适合表现生长、扩张的概念
#### `draw_inner_hex_fractal(x, y, radius, depth)`
- **功能**:向内收缩的六边形分形
- **特点**:
- 每个子六边形位于同一中心点
- 半径逐层缩小
- 形成同心嵌套效果
- 类似于俄罗斯套娃或涟漪效果
#### `draw_honeycomb_fractal(x, y, radius, depth)`
- **功能**:蜂巢模式分形
- **特点**:
- 模拟蜜蜂蜂巢的自然结构
- 六边形紧密排列,共享边线
- 展现出高效的几何填充模式
- 体现自然界中的最优结构
### 2. 分形几何特性
#### 对称性
- 六重旋转对称:每旋转60度图案不变
- 反射对称:通过中心点的任意直径都是对称轴
- 这种高度对称性使得六边形分形特别美观
#### 自相似性
- 每一层的结构都与整体相似
- 放大任意部分都能看到相同的模式
- 体现了分形的核心特征
#### 空间填充效率
- 六边形是能够密铺平面的最复杂正多边形
- 相比方形和三角形,具有更好的空间利用率
- 周长与面积比最优,节省边界长度
### 3. 数学原理
#### 顶点坐标计算
对于正六边形,第i个顶点坐标为:
```
x_i = center_x + radius × cos(60° × i)
y_i = center_y + radius × sin(60° × i)
```
其中i = 0, 1, 2, 3, 4, 5
#### 邻接关系
两个相邻六边形中心的距离 = √3 × radius
这个距离确保了六边形能够完美贴合而不重叠
### 4. 视觉效果控制
#### 递归深度(depth)
- 控制分形的复杂程度
- depth=1:只有基础形状
- depth=2:一级子结构
- depth越大越复杂,但计算时间也越长
#### 缩放比例
- 决定了分形的密度和紧凑程度
- 比例大(如0.8):结构松散,有更多空白
- 比例小(如0.4):结构紧凑,层次分明
#### 颜色方案
- 使用循环颜色数组创建视觉节奏
- 不同深度使用不同颜色增强层次感
- 黑色背景突出明亮的线条
### 5. 运行说明
1. **环境要求**:
- Python 3.x
- 内置turtle库(无需额外安装)
2. **执行方法**:
```bash
python hexagon_fractal.py
```
3. **交互操作**:
- 点击窗口任意位置关闭程序
- 可以通过注释/取消注释不同分形类型的调用来查看各种效果
4. **参数调整建议**:
- 初始半径:80-150像素(适配画布大小)
- 递归深度:3-5级(平衡效果和性能)
- 缩放比例:0.3-0.8(控制疏密程度)
##