从蒙德里安的《纽约城一号》到我的《北京城七号》

从蒙德里安的《纽约城一号》到我的《北京城七号》

关键字: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各方向观看哦:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值