分形 Sierpinski 艺术生成 纹理
元胞自动机天然适合生成图案——从Sierpinski三角形到分形地毯到流体般的涡旋。本课将CA变成艺术创作工具。
| 规则 | 图案 | 数学结构 |
|---|---|---|
| 规则90 | Sierpinski三角形 | Pascal三角形模2 |
| 规则150 | 类Sierpinski分形 | 3输入XOR |
| 规则30 | 混沌纹理 | 伪随机图案 |
| B3/S23 | 生命游戏 | 复杂涌现 |
| B2/S | 爆炸纹理 | Seeds规则 |
| Gray-Scott | Turing图案 | 反应扩散 |
// ============================================================================
// pattern_generator.v - CA图案生成器
// 支持多种图案模式、颜色映射和参数化控制
// 输出适合VGA/HDMI显示的像素流
// ============================================================================
module pattern_generator #(
parameter WIDTH = 640,
parameter HEIGHT = 480,
parameter MODES = 8 // 图案模式数
)(
input wire clk,
input wire rst_n,
input wire [2:0] mode, // 图案模式选择
input wire enable,
input wire [7:0] param1, // 参数1(规则号/阈值等)
input wire [7:0] param2, // 参数2
input wire [3:0] color_scheme, // 颜色方案
output wire [23:0] pixel_out, // 24位RGB输出
output wire pixel_valid,
output wire [9:0] pixel_x,
output wire [9:0] pixel_y
);
// ---- CA状态缓冲 ----
reg [WIDTH-1:0] ca_curr;
reg [WIDTH-1:0] ca_next;
reg [8:0] row_cnt;
reg [31:0] frame_cnt;
// ---- 规则应用 ----
integer x;
always @(*) begin
for (x = 0; x < WIDTH; x = x + 1) begin
reg L, R;
L = (x == 0) ? ca_curr[WIDTH-1] : ca_curr[x-1];
R = (x == WIDTH-1) ? ca_curr[0] : ca_curr[x+1];
case (mode)
3'd0: ca_next[x] = param1[{L, ca_curr[x], R}]; // 1D Wolfram
3'd1: ca_next[x] = L ^ ca_curr[x] ^ R; // 规则150
3'd2: ca_next[x] = L ^ R; // 规则90
3'd3: ca_next[x] = L ^ (ca_curr[x] | R); // 规则30
default: ca_next[x] = param1[{L, ca_curr[x], R}];
endcase
end
end
// ---- 颜色映射 ----
reg [7:0] r, g, b;
always @(*) begin
case (color_scheme)
4'd0: begin // 经典黑白
r = ca_curr[pixel_x[5:0]] ? 8'hFF : 8'h00;
g = ca_curr[pixel_x[5:0]] ? 8'hFF : 8'h00;
b = ca_curr[pixel_x[5:0]] ? 8'hFF : 8'h00;
end
4'd1: begin // 粉红渐变
r = ca_curr[pixel_x[5:0]] ? 8'hEC : 8'h0D;
g = ca_curr[pixel_x[5:0]] ? 8'h48 : 8'h11;
b = ca_curr[pixel_x[5:0]] ? 8'h99 : 8'h17;
end
4'd2: begin // 热力图
r = ca_curr[pixel_x[5:0]] ? {frame_cnt[7:0]} : 8'h00;
g = 8'h00;
b = ca_curr[pixel_x[5:0]] ? 8'h80 : 8'h00;
end
default: begin
r = ca_curr[pixel_x[5:0]] ? 8'hFF : 8'h00;
g = g; b = b;
end
endcase
end
assign pixel_out = {r, g, b};
// ---- 时序控制 ----
reg [9:0] px, py;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
px <= 10'd0; py <= 10'd0;
row_cnt <= 9'd0; frame_cnt <= 32'd0;
end else if (enable) begin
if (px == WIDTH - 1) begin
px <= 10'd0;
if (py == HEIGHT - 1) begin
py <= 10'd0;
frame_cnt <= frame_cnt + 32'd1;
end else begin
py <= py + 10'd1;
end
// 每行推进CA一步
ca_curr <= ca_next;
end else begin
px <= px + 10'd1;
end
end
end
assign pixel_x = px;
assign pixel_y = py;
assign pixel_valid = enable;
endmodule
Sierpinski三角形与Pascal三角形:
规则90(XOR)产生的图案等价于Pascal三角形模2
C(n,k) mod 2 = 1 ⟺ (n AND k) = k
这是Lucas定理的推论,也是分形自相似性的来源
分形维数:d = log(3)/log(2) ≈ 1.585
Sierpinski地毯:
规则90的二维版本,每步3×3窗口的中心=4个角的XOR
分形维数:d = log(8)/log(3) ≈ 1.893
分形维数的计算方法:
1. 盒计数法:D = lim(ε→0) [log N(ε) / log(1/ε)]
其中N(ε)是覆盖图案所需的边长ε的盒子数
2. 相关维数:D₂ = lim(r→0) [log C(r) / log r]
其中C(r)是距离小于r的点对的比例
3. 信息维数:D₁ = lim(ε→0) [H(ε) / log(1/ε)]
其中H(ε)是格子化后的Shannon熵
CA图案的分形维数:
规则90 (Sierpinski):D = log3/log2 ≈ 1.585
规则30 (混沌):D ≈ 1.73(经验值)
规则110 (复杂):D ≈ 1.66(经验值)
// 分形维数估算器 - 用盒计数法估算图案的分形维数
module fractal_estimator #(
parameter WIDTH = 256,
parameter HEIGHT = 256,
parameter MAX_BOX = 8
)(
input wire clk,
input wire rst_n,
input wire [WIDTH*HEIGHT-1:0] pattern,
output reg [15:0] box_counts [0:MAX_BOX-1],
output reg [15:0] fractal_dim,
output reg estimation_done
);
integer scale, bx, by, count;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
estimation_done <= 1'b0;
fractal_dim <= 16'd0;
end else begin
for (scale = 0; scale < MAX_BOX; scale = scale + 1) begin
count = 0;
for (by = 0; by < HEIGHT; by = by + (1 << scale)) begin
for (bx = 0; bx < WIDTH; bx = bx + (1 << scale)) begin
// 检查这个盒子中是否有活元胞
reg has_active;
has_active = 1'b0;
for (integer dy = 0; dy < (1<
CA图案在数字艺术中的应用:
1. 纹理合成:CA生成的图案作为3D模型的纹理
2. 地形生成:用CA生成高度图,用于游戏和影视
3. 建筑设计:CA图案启发的参数化建筑表皮
4. 数据可视化:用CA的时空演化图可视化高维数据
在进行CA实验时,科学的方法论至关重要。以下是一些通用的实验指导原则:
实验设计三要素:
系统性地扫描参数空间是理解CA行为的关键技术:
| 参数 | 范围 | 步长 | 测量指标 |
|---|---|---|---|
| 规则号 | 0-255 | 1 | 种群密度/周期 |
| 初始密度 | 0.1-0.9 | 0.1 | 收敛时间 |
| 网格大小 | 16-256 | ×2 | 有限尺寸效应 |
| 边界条件 | 环形/固定/镜像 | 离散 | 边界效应 |
CA实验产生的数据通常是高维的(空间+时间+状态)。有效的可视化对于理解至关重要:
自相关分析:
时间自相关:R(τ) = ⟨n(t)·n(t+τ)⟩ / ⟨n²⟩
空间自相关:C(r) = ⟨n(x)·n(x+r)⟩ / ⟨n²⟩
如果R(τ)以周期T振荡 → 系统有周期T的行为
如果C(r)幂律衰减 → 系统处于临界状态
将CA从理论变为可运行的硬件系统需要解决许多工程细节。以下是基于实践经验的详细指南:
CA系统通常需要多个时钟域:
跨时钟域同步使用双触发器或异步FIFO
| 优化项 | 方法 | 节省量 |
|---|---|---|
| 邻居计数器 | 增量更新替代全加法 | ~40% LUT |
| 状态存储 | BRAM替代分布式RAM | ~60% FF |
| 规则查找 | 硬编码XOR替代MUX | ~75% LUT(XOR规则) |
| 显示输出 | 行缓冲替代全帧缓冲 | ~50% BRAM |
| 边界处理 | 环形替代固定(零开销) | 0 |
CA系统的调试有其特殊性:
为CA引擎建立性能基准:
关键性能指标:
理论峰值PPS = f_clk × W × H(全并行)
实际PPS取决于架构——行缓冲约为理论值的1/H
元胞自动机课程 · 从Conway到Langton到Lattice Gas