开发者

通过Python绘制中国结的示例代码

目录
  • 1 中国结的组成部分
  • 2 设计中国结对象
  • 3 绘制结体
  • 4 绘制耳翼
  • 5 绘制挂耳和流苏
  • 6 完整代码,一键运行

1 中国结的组成部分

中国结是一种手工编织工艺品,它身上所显示的情致与智慧正是汉族古老文明中的一个侧面。因为其外观对称精致,可以代表汉族悠久的历史,符合中国传统装饰的习俗和审美观念,故命名为中国结。中国结代表着团结幸福平安,特别是在民间,它精致的做工深受大众的喜爱。其主要组成部分如下图所示。

通过Python绘制中国结的示例代码

2 设计中国结对象

基于python Turtle库实现绘制,首先设计一个中国结对象,画笔颜色就选择中国红。再定义一个__goto()函数封装turtle库对画笔移动的操作。

import turtle as t

class chineseKnot:
 '''
 * @breif: 中国结
 ''' 
 def __init__(self) -> None:
  # 画笔初始化
  self.t = t
  self.t.pensize(10)
  self.t.setup(700, 700)
  self.t.pencolor("red")
  self.t.speed(14)
  # 结心坐标
  self.x = 0
  self.y = 200
 
 '''
 * @breif: 画笔移动到指定位置
 * @param[in]: x -> 画笔移动位置横坐标
 * @param[in]: y -> 画笔移动位置纵坐标
 * @retval: None
 ''' 
 def __goto(self, x: int, y: int) -> None:
  self.t.penup()
  self.t.goto(x,y)
  self.t.pendown()

3 绘制结体

def drawBody(self) -> None:
    for i in range(11):
        self.__goto(self.x - i * 10 * sqrt(2), self.y - i * 10 *编程客栈 sqrt(2))
        self.t.seth(-45)
        self.t.fd(200)
        self.__goto(self.x + i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
        self.t.seth(-135)
        self.t.fd(200)

4 绘制耳翼

def drawEdge(self) -> None:
  for i in range(4):
   # 左上角
   self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2),
         200 - 10 * sqrt(2) - i * 20 * sqrt(2))
   self.t.seth(135)
   self.t.fd(20)
   self.t.circle(10, 180)
   self.t.fd(20)

   # 右上角
   self.__goto(10 * sqrt(2) + i * 20 * sqrt(2),
         200 - 10 * sqrt(2) - i * 20 * sqrt(2))
   self.t.seth(45)
   self.t.fd(20)
   self.t.circle(-10, 180)
   self.t.fd(20)

   # 左下角
   self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2),
         200 - 190 * sqrt(2) + i * 20 * sqrt(2))
   self.t.seth(-135)
   self.t.fd(20)
   self.t.circle(-10, 180)
   self.t.fd(20)
   
   # 右下角
   self.__goto(10 * sqrt(2) + i * 20 * sqrt(2),
         200 - 190 * sqrt(2) + i * 20 * sqrt(2))
   self.t.seth(-45)
   self.t.fd(20)
   self.t.circle(10, 180)
   self.t.fd(20)

  # 左侧
  self.t.seth(-45www.cppcns.com)
  self.__goto(90 * sqrt(2), 200 - 110 * sqrt(2)) 
  self.t.circle编程客栈(20,270)
  self.__goto(-90 * sqrt(2), 200 - 110 * sqrt(2))
  self.t.circle(-20,270)
 
  # 右侧
  self.__goto(80 * sqrt(2), 200 - 120 * sqrt(2))
  self.t.circle(40,270)
  self.__goto(-80 * sqrt(2), 200 - 120 * sqrt(2))
  self.t.circle(-40,270)

5 绘制挂耳和流苏

def drawAdorn(self):
  # 上侧
  self.__goto(self.x, self.y)
  self.t.pensize(14)
  self.t.seth(90)
  self.t.fd(60)
  self.__goto(0,320)
  self.t.seth(180)
  self.t.circle(30,360)
  # 下侧
  self.__goto(0,200 - 200 * sqrt(2))
  self.t.pensize(40)
  self.t.seth(-90)
  self.t.fd(20)
  self.t.pensize(2)
  for i in range(11):
    self.__goto(-20 + 4 * i, 200 - 200 * sqrt(2))
    self.t.seth(-90)
    self.t.fd(200)

6 完整代码,一键运行

import turtle as t
from math import sqrt
www.cppcns.com
class chineseKnot:
 '''
 * @breif: 中国结
 ''' 
 def __init__(self) -> None:
  # 画笔初始化
  self.t = t
  self.t.pensize(10)
  self.t.setup(700, 700)
  self.t.pencolor("red")
  self.t.speed(14)
  # 结心坐标
  self.x = 0
  self.y = 200

 '''
 * @breif: 画中国结
 * @param[in]: None
 * @retval: None
 '''
 def drawKnot(self) -> None:
  self.drawBody()
  self.drawEdge()
  self.drawAdorn()
  self.t.hideturtle()
  self.t.done()

 '''
 * @breif: 画中国结主体部分
 * @param[in]: None
 * @retval: None
 '''
 def drawBody(self) -> None:
  for i in range(11):
    self.__goto(self.x - i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
    self.t.seth(-45)
    self.t.fd(200)
    self.__goto(self.x + i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
    self.t.seth(-135)
    self.t.fd(200)

 '''
 * @breif: 画中国结边缘部分
 * @param[in]: None
 * @retval: None
 '''   
 def drawEdge(self) -> None:
  for i in range(4):
   # 左上角
   self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2),
         200 - 10 * sqrt(2) - i * 20 * sqrt(2))
   self.t.seth(135)
   self.t.fd(20)
   self.t.circle(10, 180)
   self.t.fd(20)

   # 右上角
   self.__goto(10 * sqrt(2) + i * 20 * sqrt(2),
         200 - 10 * sqrt(2) - i * 20 * sqrt(2))
   self.t.seth(45)
   self.t.fd(20)
   self.t.circle(-10, 180)
   self.t.fd(20)

   # 左下角
   self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2),
         200 - 190 * sqrt(2) + i * 20 * sqrt(2))
   self.t.seth(-135)
   self.t.fd(20)
   self.t.circle(-10, 180)
   self.t.fd(20)
   
   # 右下角
   self.__goto(10 * sqrt(2) + i * 20 * sqrt(2),
         200 - 190 * sqrt(2) + i * 20 * sqrt(2))
   self.t.seth(-45)
   self.t.fd(20)
   self.t.circle(10, 180)
   self.t.fd(20)

  # 左侧
  self.t.seth(-45)
  self.__goto(90 * sqrt(2), 200 - 110 * sqrt(2)) 
  self.t.circle(20,270)
  self.__goto(-90 * sqrt(2), 200 - 110 * sqrt(2))
  self.t.circle(-20,270)
 
  # 右侧
  self.__goto(80 * sqrt(2), 200 - 120 * sqrt(2))
  self.t.circle(40,2QBbdxr70)
  self.__goto(-80 * sqrt(2), 200 - 120 * sqrt(2))
  self.t.circle(-40,270)

 '''
 * @breif: 画中国结装饰部分
 * @param[in]: None
 * @retval: None
 ''' 
 def drawAdorn(self):
  # 上侧
  self.__goto(self.x, self.y)
  self.t.pensize(14)
  self.t.seth(90)
  self.t.fd(60)
  self.__goto(0,320)
  self.t.seth(180)
  self.t.circle(30,360)
  # 下侧
  self.__goto(0,200 - 200 * sqrt(2))
  self.t.pensize(40)
  self.t.seth(-90)
  self.t.fd(20)
  self.t.pensize(2)
  for i in range(11):
    self.__goto(-20 + 4 * i, 200 - 200 * sqrt(2))
    self.t.seth(-90)
    self.t.fd(200)

 '''
 * @breif: 画笔移动到指定位置
 * @param[in]: x -> 画笔移动位置横坐标
 * @param[in]: y -> 画笔移动位置纵坐标
 * @retval: None
 ''' 
 def __goto(self, x: int, y: int) -> None:
  self.t.penup()
  self.t.goto(x,y)
  self.t.pendown()
   
if __name__ == '__main__':
 knot = chineseKnot()
 knot.drawKnot()

到此这篇关于通过Python绘制中国结的示例代码的文章就介绍到这了,更多相关Python绘制中国结内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜