探索视觉错觉:用Python绘制动态几何图案
在计算机图形学的世界里,我们可以通过简单的代码创造出令人惊叹的视觉效果。本文将介绍一个使用Python的 turtle 模块创建视觉错觉图案的程序,通过分析代码结构和实现原理,带你了解如何用代码构建具有欺骗性视觉效果的几何图形。
一、程序整体概述
这个视觉错觉程序主要通过绘制规则排列的正方形和水平线,利用人眼的视觉感知特性,创造出一种线条弯曲的错觉效果。程序的核心在于巧妙设计图形的位置偏移和排列规律,让静态图形在观察者眼中产生动态扭曲的视觉体验。
以下是完整的Python代码实现:
"""Illusion
Exercises:
1. Change the size of the squares.
2. Change the number of rows and lines.
"""
from itertools import cycle
from turtle import *
from freegames import line, square
size = 25
def draw_row(x, y):
for i in range(0, 10):
offset = x + (i * size * 2)
square(offset, y, size, 'black')
def draw_rows():
offsets = [-200, -190, -180, -190]
pairs = zip(cycle(offsets), range(150, -176, -25))
for offset, y in pairs:
draw_row(offset, y)
def draw_lines():
x = -200
y = 150
for i in range(0, 14):
line(x, y - i * size, x + 16 * size, y - i * size)
setup(420, 400, 30, 0)
hideturtle()
tracer(False)
listen()
draw_rows()
draw_lines()
done()
二、核心功能模块解析
1. 基础设置与导入
程序首先导入了必要的库:
itertools.cycle:用于循环使用偏移量列表turtle模块:Python的标准图形绘制库freegames中的line和square函数:提供简化的线段和正方形绘制功能
size = 25 定义了正方形的基本边长,这是控制图形比例的关键参数。
2. 单行正方形绘制函数 draw_row
def draw_row(x, y):
for i in range(0, 10):
offset = x + (i * size * 2)
square(offset, y, size, 'black')
这个函数的作用是在指定的 (x, y) 坐标处绘制一行正方形:
- 通过循环10次,计算每个正方形的水平偏移量
offset - 偏移量公式为
x + (i * size * 2),即每个正方形之间间隔size*2的距离 - 调用
square函数绘制黑色正方形,边长为size
3. 多行正方形绘制函数 draw_rows
def draw_rows():
offsets = [-200, -190, -180, -190]
pairs = zip(cycle(offsets), range(150, -176, -25))
for offset, y in pairs:
draw_row(offset, y)
该函数负责绘制多行正方形,是形成视觉错觉的关键部分:
- 定义
offsets列表:[-200, -190, -180, -190],用于控制每行的起始水平偏移 - 使用
cycle(offsets)让偏移量列表循环使用,形成周期性偏移规律 range(150, -176, -25)生成垂直方向的坐标序列,每行向下移动25个单位- 通过
zip函数将偏移量和垂直坐标一一对应,逐行调用draw_row绘制
4. 水平线绘制函数 draw_lines
def draw_lines():
x = -200
y = 150
for i in range(0, 14):
line(x, y - i * size, x + 16 * size, y - i * size)
此函数用于绘制水平参考线:
- 从坐标
(-200, 150)开始 - 循环14次,每次向下移动
size(25)个单位 - 绘制长度为
16 * size的水平线,覆盖整个图形区域
5. 程序初始化与执行
setup(420, 400, 30, 0)
hideturtle()
tracer(False)
listen()
draw_rows()
draw_lines()
done()
这部分代码完成绘图环境的初始化:
setup(420, 400, 30, 0):设置窗口大小和位置hideturtle():隐藏海龟图标,使画面更简洁tracer(False):关闭动画追踪,提高绘图效率listen():准备接收键盘事件(虽然本例未使用)- 依次调用
draw_rows和draw_lines绘制图形 done():完成绘制并保持窗口显示
三、视觉错觉的实现原理
该程序利用了 赫尔曼栅格错觉(Hermann Grid Illusion) 的原理:当观察由黑色正方形和白色背景组成的网格时,在交叉点处会看到灰色的斑点,而实际上这些交叉点的背景是白色的。
关键技术点:
- 行偏移设计:
offsets = [-200, -190, -180, -190]这个非对称的偏移列表,使得每行正方形的起始位置略有不同,打破了严格的网格对称性,增强了错觉效果。 - 循环偏移量:通过
cycle(offsets)循环使用偏移量,形成-200, -190, -180, -190, -200, -190...的周期性模式,使图形在垂直方向上产生规律性的错位。 - 视觉感知特性:人眼的视网膜神经节细胞对亮度变化敏感,当黑白图形以特定规律排列时,大脑会错误地处理亮度信息,产生不存在的灰色区域或线条弯曲的错觉。
四、扩展练习与定制方法
代码注释中提出了两个扩展练习,我们可以进一步探索更多定制方式:
1. 修改正方形大小
只需修改 size 变量的值即可调整正方形尺寸:
- 增大
size:如size = 30,图形会更大,错觉效果更粗犷 - 减小
size:如size = 20,图形更精细,错觉效果可能更明显
2. 调整行数和线条数
- 修改行数:调整
draw_rows函数中range(150, -176, -25)的参数:- 起始值
150和结束值-176决定了垂直方向的绘制范围 - 步长
-25决定了每行的垂直间隔
- 起始值
- 修改线条数:调整
draw_lines函数中range(0, 14)的结束值,如range(0, 20)会绘制更多水平线。
3. 更多创意修改
- 颜色变化:尝试修改正方形和线条的颜色,如使用
'red'、'blue'等,观察不同颜色组合对视觉错觉的影响。 - 偏移量调整:修改
offsets列表中的数值,创造不同的错位模式,可能产生全新的视觉效果。 - 添加动画:取消
tracer(False),并添加循环绘制代码,实现动态变化的错觉效果。
五、总结与拓展
通过这个视觉错觉程序,我们展示了如何利用Python的 turtle 模块创建有趣的图形效果。程序的核心在于巧妙设计图形的排列规律,利用人眼的视觉感知特性产生错觉。这种编程方式不仅能用于娱乐,还能帮助我们理解视觉心理学和计算机图形学的基本原理。
如果你对视觉错觉感兴趣,可以进一步探索其他类型的错觉效果,如运动错觉、颜色错觉等,并尝试用代码实现它们。通过调整参数和扩展功能,你可以创造出属于自己的独特视觉艺术作品。