您的位置:首页 > 编程语言 > Python开发

震惊, 我居然用Python干这种事ꈍ .̮ ꈍ

2019-04-15 22:52 876 查看

阅读本文只需花费你两分钟, 两分钟你买不了吃亏,你也买不了上当. 那么, 为何不静下心来看看呢?

 

Python 海龟创意绘画, Turtle库创作精美图画 

Author:Amd794     E-mail:2952277346@qq.com    全部完整代码下载地址 

前言:

  • 最初来自于 Wally Feurzig 和 Seymour Papert 于 1966 年所创造的 Logo 编程语言
  • 可以通过相关的指令, 轻松地绘制出精美的形状和图案
  • 可以培养学习计算机的兴趣, 以一种娱乐的方式了解计算机的趣味

 

教程:

正文:

  1. 先来个简单的例子, 我们来用Turtle来写一段诗词, 用过的人都知道, Turtle实现写字是十分简单的, 那么, 如何才能把朴素的文字, 变得更吸引人呢? 先来看下我想的. 效果图如下:

gif图像, 可能打了一点, 无法上传, 但这并不影响. 那么它是怎么绘制的呢? 莫慌, 我们来看下代码 , 如下:

from turtle import *
import random

str_ = """
守一段情 念一个人。
时光不老 我们不散。
厮守终生 不离不弃。
天暗下来 你就是光。
亡魂溺海 止于终老。
生死挈阔 与子成说。
柔情似水 佳期如梦。
我中有你 你中有我。
青山不老 为雪白头。
心若向阳 无畏悲伤。
一人一心 白首不离。
心如荒岛 囚我终老。
我的世界 只有你懂。
你若安好 便是晴天。
心有灵犀 一点就通。
厮守海角 非你不娶。
执子的手 漫漫的走。
执子之手 与子偕老。
山河拱手 为君一笑。
红尘初妆 山河无疆。
千秋功名 一世葬你。
既不回头 何必不忘。
既然无缘 何须誓言。
今日种种 似水无痕。
明夕何夕 君已陌路。
才会相思 便害相思。
人来人往 繁华似锦。
回首万年 情衷伊人。
生能尽欢 死亦无憾。
执手若无 泪溅花上。
花开花落 人世无常。
入我心者 待以君王。
为醉而醉 似醉非醉。
伤心鸿影 爱已惘然。
只要你要 只要我有。
日久生情 日久情疏。
忧佳相随 风雨无悔。
有生之年 誓死娇宠
引喻山河 指日可诚。
水上鸳鸯 云中翡翠。
天荒地老 海誓山盟。
生则同襟 死则同穴。
生有此女 夫复何求""".split("。")
setup(1280,720)  # 设置窗口大小
colormode(255)  # 使用的颜色模式, 整数还是小数
up()
a, b = -500, 280
goto(a,b)
bgcolor("black")

down()
def w(str_,b):
bgcolor( random.randint(0,255),random.randint(0,255),random.randint(0,255))  # 随机生成RGB值, 每次调用函数改变背景颜色
for i in range(len(str_)):
up()
goto(a+100*i,b)
down()
size =  random.randint(12,68)  # 随机字体大小
color( random.randint(0,255),random.randint(0,255),random.randint(0,255))  # 随机字体颜色
write(str_[i], align="center",font=("楷体",size))

for k in range(4):
for i in range(7):
w(str_[i+7*k],b-100*i)
reset()  # 清屏

for i in range(7):
w(str_[i+7*4],b-100*i)

  

 

2. 这很一般啊, 也没什么好看的, 变来变去的,看到我眼睛都花了乛c乛, 也对, 起初我是想背景是动态星空的背景的, 文字通过下拉滑动的方式显示, 这样会比较友好, 但是我没找到合适的, 哈哈哈. 话题跑偏了,抱歉, 那么, 你能不能拿点***的来呢, 这都吹的吧.好吧, 那么, 看下下面的效果, 如下图:

由于篇幅有限, 显示部分, 完整代码在标题 ,代码如何下:

# 文字个性化
def writez(x, y, str_, size=56, font="华文行楷"):
gotopos(x, y)
write(str_, font=(font, size))

color("#7d776d")
s = "愿天化作比翼鸟"
s2 = "在地愿为连理枝"
for i in range(len(s)):
writez(560,350-i*50,s[i],36)
for i in range(len(s2)):
writez(460,350-i*50,s2[i],36)
color("#888475")
writez(-50, 100, "我")
writez(-50, 40, "的")
writez(-160, 0, "心", 96)
writez(-50, 0, "月", 176)
writez(33, -30, "代", 62)
writez(-18, -95, "表", 78)
writez(-213, -210, "亮", 196)

  

3. 怎么样, 还行吧. 哼, 这也没什么难度的, 我也行啊, 好吧, 我们来干点高级一点的, 我们基于Lsystem来,用turtle优雅的画一颗树

  • 一个L-系统Lindenmayer系统是并行重写系统和类型的形式文法。L系统由可用于制作字符串的符号字母表,用于将每个符号扩展为更大的符号串的生产规则集合,用于开始构建的初始“ 公理 ”字符串以及用于制作字符串的机制组成。将生成的字符串转换为几何结构。

  • 更多请看 https://github.com/Amd794/Python123/blob/master/README.md
  • 变量  : 'FX'

    常数  :+ - [] a b c

    开始 :'FX'

    规则 :    'F': 'aFF-[b-F+F]+[c+F-F]',
                     'X': 'aFF+[b+F]+[c-F]'

    角度 :25°

  • 好啦, 初始阶段已经介绍完毕, 那么我们开始写代码:

1. 先初始化一下变量:

setup(1280,720)  # 设置窗口的大小
t.speed(0)  # 改变海龟的绘制速度
t.pensize(1) # 可以通过海龟的大小, 来凸显树干与树枝的粗细差别
length = 5 # 每一次绘制的长度
path = 'FX' # 初始的规则
angle = 25  # 每次变换的角度

expalnation = {
'F': '画线',
'x': '-',
'+': '逆时针旋转',
'-': '顺时针旋转',
'[': '记录当前位置',
']': '恢复上一个位置',
'a': '上色',
'b': '上色',
'c': '上色'
}

# 替换的规则
rules = {
'F': 'aFF-[b-F+F]+[c+F-F]',
'X': 'aFF+[b+F]+[c-F]'
}

  

2. 下面开始应用规则:

def apply_rules(path, rules):
L = [_ for _ in path]
for i in range(len(L)):
symbol = L[i]
if symbol == 'F':
L[i] = rules[symbol]
if symbol == 'X':
L[i] = rules[symbol]
path = ''.join(L)
return path

for _ in range(5):
path = apply_rules(path, rules)

  

3. 最后, 开始画图:

# 这里通过映射的方式更佳, 我起初写前面的例子的时候规则不是很多, 就没怎么留意.
def draw_path(path, expalnation):
posList, angleList = [], []
t.up()
t.goto(0, -350)
t.down()
t.lt(90)
for symbol in path:
if symbol == 'F':
t.forward(length)
elif symbol == '+':
t.left(angle)
elif symbol == '-':
t.rt(angle)
elif symbol == '[':
posList.append(t.pos())
angleList.append(t.heading())
elif symbol == 'a':
t.pensize(3)
t.color("#8c503c")
elif symbol == 'b':
t.pensize(2)
t.color("#4ab441")
elif symbol == 'c':
t.pensize(2)
t.color("#18b418")
elif symbol == ']':
t.up()
t.home()
t.goto(posList.pop())
t.left(angleList.pop())
t.down()

  

 

好, 所有都已准备好了, 我们来看下效果:

哎呀, 好像忘记了改变画笔大小了, 没关系,这些后期处理一下就好.那么本文到此结束.

总结:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: