首頁 > 軟體

Python+turtle繪製冬奧吉祥物冰墩墩

2022-02-11 10:03:28

在抖音上面看到了有人畫的冬奧會的冰墩墩,自己也想做一個。當然,圖案的繪製還是得使用我們熟悉的turtle框架。原因很簡單,它是一種基於canvas畫布的UI框架。

文末附完整原始碼,可直接執行。

首先,將這個turtle庫安裝好。

pip install turtle

將turtle匯入我們的模組使用即可。

import turtle as tle

設定畫筆的全域性屬性,先設定畫筆的基本速度和UI介面的標題吧

tle.speed(50)  # 速度設定為100
tle.title('冬奧會:冰墩墩! 公眾號:[Python 集中營]')  # 設定好UI介面的標題
tle.bgcolor('white')  # 將背景顏色設定為白色,有冬季的感覺...
tle.pencolor("deep sky blue")
tle.fillcolor("deep sky blue")

設定好畫筆的全域性屬性以後,接下來就是圖形繪製的部分。思路就是拿一隻畫筆在畫布上面畫圖就好了。

在開始繪製之前,先來說明一下幾個主要函數的使用方法。程式碼量比較多,但是用到的函數基本都是下面這幾個。

turtle.goto(x,y)  將畫筆移動到座標為x,y的位置
turtle.penup()  提起筆移動,不繪製圖形,用於另起一個地方繪製
turtle.circle()  畫圓,半徑為正(負),表示圓心在畫筆的左邊(右邊)畫圓
setheading(angle)  設定當前朝向為angle角度
turtle.pendown()  移動時繪製圖形,預設時也為繪製
turtle.begin_fill()  準備開始填充圖形
turtle.end_fill()  填充完成
turtle.left(degree) 逆時針移動degree°
turtle.forward(distance) 向當前畫筆方向移動distance畫素長度

畫出冰墩墩的兩個耳朵,注意在畫布上把握好座標,儘量計劃將冰墩墩放在畫布的正中間。

# 冰墩墩左耳朵
tle.penup()
tle.goto(-120, 200)
tle.setheading(160)
tle.begin_fill()
tle.pendown()
tle.circle(-30, 230)
tle.setheading(180)
tle.circle(37, 90)
tle.end_fill()
# 冰墩墩右耳朵
tle.penup()
tle.goto(90, 200)
tle.setheading(20)
tle.begin_fill()
tle.pendown()
tle.circle(30, 230)
tle.setheading(0)
tle.circle(-37, 90)
tle.end_fill()

繪製冰墩墩的頭部,頭部主要是通過弧線構成的。

# 冰墩墩頭部
tle.pensize(5)
tle.penup()
tle.goto(-83, 237)
tle.setheading(30)
tle.pendown()
tle.circle(-134, 60)

tle.penup()
tle.goto(-120, 200)
tle.setheading(-120)
tle.pendown()
tle.circle(200, 80)

tle.penup()
tle.goto(90, 200)
tle.setheading(-60)
tle.pendown()
tle.circle(-200, 80)

tle.penup()
tle.setheading(210)
tle.pendown()
tle.circle(-120, 60)

繪製冰墩墩的雙眼情況,雙眼主要由眼圈、眼眶、眼珠構成的。

# 冰墩墩左眼
tle.penup()
tle.goto(-110, 100)
tle.setheading(-45)
tle.begin_fill()
tle.pendown()
agle = 0.2
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:
        agle = agle + 0.1
        tle.left(3)
        tle.forward(agle)
    else:
        agle = agle - 0.1
        tle.left(3)
        tle.forward(agle)
tle.end_fill()

tle.fillcolor("white")
tle.penup()
tle.goto(-73, 125)
tle.setheading(0)
tle.begin_fill()
tle.pendown()
tle.circle(14, 360)
tle.end_fill()

tle.penup()
tle.goto(-72, 133)
tle.setheading(0)
tle.begin_fill()
tle.pendown()
tle.circle(6, 360)
tle.end_fill()

# 冰墩墩右眼
tle.penup()
tle.goto(80, 100)
tle.setheading(45)
tle.begin_fill()
tle.fillcolor("deep sky blue")
tle.pendown()
agle = 0.2
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:
        agle = agle + 0.1
        tle.left(3)
        tle.forward(agle)
    else:
        agle = agle - 0.1
        tle.left(3)
        tle.forward(agle)
tle.end_fill()

tle.fillcolor("white")
tle.penup()
tle.goto(43, 125)
tle.setheading(0)
tle.begin_fill()
tle.pendown()
tle.circle(14, 360)
tle.end_fill()

tle.penup()
tle.goto(42, 133)
tle.setheading(0)
tle.begin_fill()
tle.pendown()
tle.circle(6, 360)
tle.end_fill()

完整原始碼

# -*- coding:utf-8 -*-
# @author Python 集中營
# @date 2022/2/9
# @file test10.py

# done
# 剛剛出爐的冬奧會吉祥物:冰墩墩,附原始碼...

# 在抖音上面看到了有人畫的冬奧會的冰墩墩,自己也想做一個。當然,圖案的繪製還是得使用我們熟悉的turtle框架。
# 原因很簡單,它是一種基於canvas畫布的UI框架。

# 冰墩墩.mp4

# 首先,將這個turtle庫安裝好。
# pip install turtle

# 將turtle匯入我們的模組使用即可。
import turtle as tle

# 設定畫筆的全域性屬性,先設定畫筆的基本速度和UI介面的標題吧

tle.speed(50)  # 速度設定為100
tle.title('冬奧會:冰墩墩! 公眾號:[Python 集中營]')  # 設定好UI介面的標題
tle.bgcolor('white')  # 將背景顏色設定為白色,有冬季的感覺...
tle.pencolor("deep sky blue")
tle.fillcolor("deep sky blue")

# 設定好畫筆的全域性屬性以後,接下來就是圖形繪製的部分。思路就是拿一隻畫筆在畫布上面畫圖就好了。
#
# 在開始繪製之前,先來說明一下幾個主要函數的使用方法。程式碼量比較多,但是用到的函數基本都是下面這幾個。

# turtle.goto(x,y)  將畫筆移動到座標為x,y的位置
# turtle.penup()  提起筆移動,不繪製圖形,用於另起一個地方繪製
# turtle.circle()  畫圓,半徑為正(負),表示圓心在畫筆的左邊(右邊)畫圓
# setheading(angle)  設定當前朝向為angle角度
# turtle.pendown()  移動時繪製圖形,預設時也為繪製
# turtle.begin_fill()  準備開始填充圖形
# turtle.end_fill()  填充完成
# turtle.left(degree) 逆時針移動degree°
# turtle.forward(distance) 向當前畫筆方向移動distance畫素長度

# 畫出冰墩墩的兩個耳朵,注意在畫布上把握好座標,儘量計劃將冰墩墩放在畫布的正中間。

# 冰墩墩左耳朵
tle.penup()
tle.goto(-120, 200)
tle.setheading(160)
tle.begin_fill()
tle.pendown()
tle.circle(-30, 230)
tle.setheading(180)
tle.circle(37, 90)
tle.end_fill()
# 冰墩墩右耳朵
tle.penup()
tle.goto(90, 200)
tle.setheading(20)
tle.begin_fill()
tle.pendown()
tle.circle(30, 230)
tle.setheading(0)
tle.circle(-37, 90)
tle.end_fill()

# 繪製冰墩墩的頭部,頭部主要是通過弧線構成的。

# 冰墩墩頭部
tle.pensize(5)
tle.penup()
tle.goto(-83, 237)
tle.setheading(30)
tle.pendown()
tle.circle(-134, 60)

tle.penup()
tle.goto(-120, 200)
tle.setheading(-120)
tle.pendown()
tle.circle(200, 80)

tle.penup()
tle.goto(90, 200)
tle.setheading(-60)
tle.pendown()
tle.circle(-200, 80)

tle.penup()
tle.setheading(210)
tle.pendown()
tle.circle(-120, 60)


# 繪製冰墩墩的雙眼情況,雙眼主要由眼圈、眼眶、眼珠構成的。

# 冰墩墩左眼
tle.penup()
tle.goto(-110, 100)
tle.setheading(-45)
tle.begin_fill()
tle.pendown()
agle = 0.2
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:
        agle = agle + 0.1
        tle.left(3)
        tle.forward(agle)
    else:
        agle = agle - 0.1
        tle.left(3)
        tle.forward(agle)
tle.end_fill()

tle.fillcolor("white")
tle.penup()
tle.goto(-73, 125)
tle.setheading(0)
tle.begin_fill()
tle.pendown()
tle.circle(14, 360)
tle.end_fill()

tle.penup()
tle.goto(-72, 133)
tle.setheading(0)
tle.begin_fill()
tle.pendown()
tle.circle(6, 360)
tle.end_fill()

# 冰墩墩右眼
tle.penup()
tle.goto(80, 100)
tle.setheading(45)
tle.begin_fill()
tle.fillcolor("deep sky blue")
tle.pendown()
agle = 0.2
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:
        agle = agle + 0.1
        tle.left(3)
        tle.forward(agle)
    else:
        agle = agle - 0.1
        tle.left(3)
        tle.forward(agle)
tle.end_fill()

tle.fillcolor("white")
tle.penup()
tle.goto(43, 125)
tle.setheading(0)
tle.begin_fill()
tle.pendown()
tle.circle(14, 360)
tle.end_fill()

tle.penup()
tle.goto(42, 133)
tle.setheading(0)
tle.begin_fill()
tle.pendown()
tle.circle(6, 360)
tle.end_fill()

# 繪製冰墩墩的鼻子、嘴,通過倒立的弧形來展現。

# 冰墩墩鼻子
tle.penup()
tle.goto(-25, 133)
tle.begin_fill()
tle.fillcolor("deep sky blue")
tle.pendown()
tle.forward(20)
tle.seth(-120)
tle.forward(20)
tle.seth(120)
tle.forward(20)
tle.end_fill()

# 冰墩墩嘴巴
tle.penup()
tle.goto(-40, 110)
tle.setheading(-30)
tle.begin_fill()
tle.fillcolor("deep sky blue")
tle.pendown()
tle.circle(50, 60)
tle.setheading(-120)
tle.circle(-100, 15)
tle.circle(-15, 90)
tle.circle(-100, 15)
tle.end_fill()

# 繪製冰墩墩的四肢情況,是常規的正面打招呼的經典形象。

# 冰墩墩左臂
tle.fillcolor("deep sky blue")
tle.penup()
tle.goto(-145, 100)
tle.begin_fill()
tle.setheading(-120)
tle.pendown()
tle.forward(100)
tle.setheading(-110)
tle.circle(20, 180)
tle.forward(30)
tle.circle(-5, 160)
tle.end_fill()

# 冰墩墩右臂
tle.penup()
tle.goto(115, 100)
tle.setheading(60)
tle.begin_fill()
tle.pendown()
tle.forward(100)
tle.setheading(70)
tle.circle(20, 180)
tle.forward(30)
tle.circle(-5, 160)
tle.end_fill()

# 冰墩墩手掌心的小紅心
tle.penup()
tle.pencolor('red')
tle.goto(135, 200)
tle.begin_fill()
tle.fillcolor("red")
tle.pendown()
tle.circle(-5, 180)
tle.setheading(90)
tle.circle(-5, 180)
tle.setheading(-120)
tle.forward(17)
tle.penup()
tle.goto(135, 200)
tle.pendown()
tle.setheading(-60)
tle.forward(17)
tle.end_fill()

tle.pencolor("deep sky blue")
tle.fillcolor("deep sky blue")

# 冰墩墩左腿
tle.penup()
tle.goto(-90, -45)
tle.begin_fill()
tle.pendown()
tle.setheading(-90)
tle.circle(-140, 20)
tle.circle(5, 109)
tle.forward(30)
tle.circle(10, 120)
tle.setheading(90)
tle.circle(-140, 10)
tle.end_fill()

# 冰墩墩右腿
tle.penup()
tle.goto(60, -45)
tle.begin_fill()
tle.pendown()
tle.setheading(-90)
tle.circle(140, 20)
tle.circle(-5, 109)
tle.forward(30)
tle.circle(-10, 120)
tle.setheading(90)
tle.circle(140, 10)
tle.end_fill()

# 繪製出冰墩墩最外面的一個雪殼,由於3D形象不好繪製,這裡使用一個最外面的輪廓線表示。
tle.pensize(5)
tle.penup()
tle.goto(-130, 195)
tle.setheading(160)
tle.pendown()
tle.circle(-40, 230)
tle.setheading(30)
tle.circle(-134, 58)
tle.setheading(60)
tle.circle(-40, 215)
tle.setheading(-60)
tle.forward(15)
tle.circle(2, 200)
tle.setheading(65)
tle.forward(30)
tle.circle(-25, 180)
tle.forward(100)
tle.circle(2, 25)
tle.circle(-200, 47)
tle.circle(2, 60)
tle.circle(140, 23)
tle.circle(-2, 90)
tle.setheading(180)
tle.forward(70)
tle.circle(-2, 90)
tle.forward(30)
tle.setheading(-160)
tle.circle(-100, 35)
tle.setheading(-90)
tle.forward(30)
tle.circle(-2, 90)
tle.forward(70)
tle.circle(-2, 90)
tle.setheading(60)
tle.circle(140, 30)
tle.circle(2, 45)
tle.circle(-200, 19)
tle.circle(2, 130)
tle.forward(30)
tle.circle(-25, 180)
tle.forward(100)
tle.setheading(90)
tle.circle(-200, 30)

# 繪製冰墩墩的面罩,通過繪製幾條不同顏色的弧線來實現效果。

tle.pensize(3)
tle.penup()
tle.goto(95, 120)
tle.setheading(90)
tle.pendown()

# 繪製第一層紅色的弧線
tle.pencolor("red")
agle = 1
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:  # 控制a的變化
        agle = agle + 0.25
        tle.left(3)  # 向左轉3度
        tle.forward(agle)  # 向前走a的步長
    else:
        agle = agle - 0.25
        tle.left(3)
        tle.forward(agle)

# 繪製第二層橘黃色的弧線
tle.pencolor("orange")
tle.penup()
tle.goto(96, 120)
tle.pendown()
agle = 1
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:
        agle = agle + 0.255
        tle.left(3)
        tle.forward(agle)
    else:
        agle = agle - 0.255
        tle.left(3)
        tle.forward(agle)

# 繪製第三層綠色的弧線
tle.pencolor("green")
tle.penup()
tle.goto(97, 120)
tle.pendown()
agle = 1
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:
        agle = agle + 0.2555
        tle.left(3)
        tle.forward(agle)
    else:
        agle = agle - 0.2555
        tle.left(3)
        tle.forward(agle)

# 繪製第四層天藍色的弧線
tle.pencolor("deep sky blue")
tle.penup()
tle.goto(98, 120)
tle.pendown()
agle = 1
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:
        agle = agle + 0.25955
        tle.left(3)
        tle.forward(agle)
    else:
        agle = agle - 0.25955
        tle.left(3)
        tle.forward(agle)

# 繪製第五層粉色的弧線
tle.pencolor("pink")
tle.penup()
tle.goto(101, 120)
tle.pendown()
agle = 1
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:
        agle = agle + 0.26
        tle.left(3)
        tle.forward(agle)
    else:
        agle = agle - 0.26
        tle.left(3)
        tle.forward(agle)

# 繪製第六層紫色的弧線
tle.pencolor("purple")
tle.penup()
tle.goto(102, 120)
tle.pendown()
agle = 1
for i in range(120):
    if 0 <= i < 30 or 60 <= i < 90:
        agle = agle + 0.269
        tle.left(3)
        tle.forward(agle)
    else:
        agle = agle - 0.269
        tle.left(3)
        tle.forward(agle)


# 繪製字母字樣,背景歡迎您。
printer = tle.Turtle()
printer.hideturtle()
printer.penup()
printer.goto(-15, 5)
printer.write("welcome to beijing !", move=True, align='center', font=('黑體', 14, 'normal'))


# 繪製奧運五環
tle.penup()
tle.goto(-25, -10)
tle.pendown()
tle.pencolor("blue")
tle.circle(10)
tle.penup()
tle.goto(-10, -10)
tle.pendown()
tle.pencolor("black")
tle.circle(10)
tle.penup()
tle.goto(5, -10)
tle.pendown()
tle.pencolor("red")
tle.circle(10)
tle.penup()
tle.goto(-20, -20)
tle.pendown()
tle.pencolor("yellow")
tle.circle(10)
tle.penup()
tle.goto(0, -20)
tle.pendown()
tle.pencolor("green")
tle.circle(10)

tle.hideturtle()
# 繪製完成
tle.done()

到此這篇關於Python+turtle繪製冬奧吉祥物冰墩墩的文章就介紹到這了,更多相關Python turtle冰墩墩內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com