从蒙德里安的《纽约城一号》到我的《北京城七号》
关键字:Python、turtle、随机、抽象画、纽约城一号
事情还要从下面这则新闻说起:
新闻截图
抽象画派蒙德里安的大作《纽约城一号》被倒挂几十年?!正挂和倒挂的区别在哪里呢?(恕我理工男的审美能力低下,O(∩_∩)O哈哈~)
这样吧,我来用Python3.7的自带模块(无需额外安装)turtle模块画一幅抽象画《北京城七号》吧
import math
import random
import turtle
def random_lines_new_york():
"""
仿绘蒙德里安的《纽约城一号》作品,作品使用红黄蓝三原色绘制线条。
:return:
"""
def _draw_x(x, color, canvas_size):
"""
画平行于X轴的线条
:param x: 指定的x坐标
:param color: 颜色
:param canvas_size: 画布大小
:return:
"""
if type(color) is str:
turtle.color(color)
else:
r, g, b = color
# 设置画笔颜色
turtle.color(r/255.0, g/255.0, b/255.0)
# 移动画笔到开始点
turtle.goto(x, -canvas_size / 2)
turtle.down() # 落下画笔
# 从画笔所在的位置画直线到指定的坐标点
turtle.goto(x, canvas_size / 2)
turtle.up() # 抬起画笔
def _draw_y(y, color, canvas_size):
"""
画平行于指定的Y轴的线条
:param y: y坐标
:param color: 颜色
:param canvas_size: 画布大小
:return:
"""
if type(color) is str:
turtle.color(color)
else:
r, g, b = color
# 设置画笔颜色
turtle.color(r / 255.0, g / 255.0, b / 255.0)
# 移动画笔到开始点
turtle.goto(-canvas_size / 2, y)
turtle.down() # 落下画笔
# 从画笔所在的位置画直线到指定的坐标点
turtle.goto(canvas_size / 2, y)
turtle.up() # 抬起画笔
size = 600 # 画布大小
margin = 20 # 画布边缘留白(最边缘的线条距离画布边缘的距离)
margin_between = 15 # 线条最小间隔
# turtle画布的原点在画布中心
turtle.screensize(size, size, "white")
turtle.up() # 画笔抬起
turtle.speed(10) # 画笔速度
turtle.pensize(12) # 画笔粗细
yellow = (255,215,0) #'yellow'
blue = 'blue'#(25,25,112)
red = 'red'
# 指定颜色(垂直于x轴的线条)
color_x_list = [blue, red, red, red, red, yellow, yellow, yellow, yellow, yellow]
# 打乱顺序
random.shuffle(color_x_list)
print(color_x_list)
# 指定颜色(垂直于y轴的线条)
color_y_list = [blue, blue, blue, red, red, red, red, yellow, yellow, yellow, yellow, yellow, yellow]
# 打乱顺序
random.shuffle(color_y_list)
print(color_y_list)
# 随机生成垂直于x轴的线条位置
point_x_list = [margin, size - margin]
while len(point_x_list) < len(color_x_list):
temp_x = random.randint(margin, size - margin)
is_ok = True
if len(point_x_list) > 0:
# 保证最小间距
for i in point_x_list:
if math.fabs(temp_x - i) < margin_between:
is_ok = False
break
if is_ok:
point_x_list.append(temp_x)
print(point_x_list)
# 生成12个垂直于y轴的线条位置
point_y_list = [margin, size - margin]
while len(point_y_list) < len(color_y_list):
temp_y = random.randint(margin, size - margin)
is_ok = True
if len(point_y_list) > 0:
# 保证最小间距
for i in point_y_list:
if math.fabs(temp_y - i) < margin_between:
is_ok = False
break
if is_ok:
point_y_list.append(temp_y)
print(point_y_list)
label_x = []
for _ in point_x_list:
# 添加x轴线条标识
label_x.append('x')
label_y = []
for _ in point_y_list:
# 添加y轴线条标识
label_y.append('y')
info_list = []
info_list += zip(label_x, point_x_list, color_x_list)
info_list += zip(label_y, point_y_list, color_y_list)
# 打乱顺序
random.shuffle(info_list)
# 绘制线条
for label, x, c in info_list:
if label == 'x':
_draw_x(x-size/2, c, size)
else:
_draw_y(x-size/2, c, size)
# 抬起画笔
turtle.up()
# 隐藏画笔
turtle.ht()
turtle.done()
if __name__ == '__main__':
random_lines_new_york()
效果图如下,可以从4各方向观看哦: