衡水名师工作室
Python编程 | 绘制标准五星红旗

桂建旺发表于2025-12-13

五星红旗是中华人民共和国国旗。本文详细讲解绘制五星红旗的规范,以及使用Python的画笔功能绘制五星红旗的过程。

国旗制作规范

国旗的形状、颜色两面相同,旗上五星两面相对。为便利计,本件仅以旗杆在左之一面为说明之标准。对于旗杆在右之一面,凡本件所称左均应改右,所称右均应改左。

(一)旗面为红色,长方形,其长与高为三与二之比,旗面左上方缀黄色五角星五颗。一星较大,其外接圆直径为旗高十分之三,居左;四星较小,其外接圆直径为旗高十分之一,环拱于大星之右。旗杆套为白色。

(二)五星之位置与画法如下:

1、为便于确定五星之位置,先将旗面对分为四个相等的长方形,将左上方之长方形上下划为十等分,左右划为十五等分。

2、大五角星的中心点,在该长方形上五下五、左五右十之处。其画法为:以此点为圆心,以三等分为半径作一圆。在此圆周上,定出五个等距离的点,其一点须位于圆之正上方。

然后将此五点中各相隔的两点相联,使各成一直线。此五直线所构成之外轮廓线,即为所需之大五角星。五角星之一个角尖正向上方。

3、四颗小五角星的中心点,第一点在该长方形上二下八、左十右五之处,第二点在上四下六、左十二右三之处,第三点在上七下三、左十二右三之处,第四点在上九下一、左十右五之处。

其画法为:以以上四点为圆心,各以一等分为半径,分别作四个圆。在每个圆上各定出五个等距离的点,其中均须各有一点位于大五角星中心点与以上四个圆心的各联结线上。然后用构成大五角星的同样方法,构成小五角星。此四颗小五角星均各有一个角尖正对大五角星的中心点。


● 以上内容摘自《中华人民共和国国旗法》

国旗绘制过程

下面通过动态图来看一下国旗的绘制过程。


程序设计

下面开始编写程序脚本。本文所用的Python编程工具为编程猫海龟编辑器。

确定画布大小&绘制旗面


导入海龟库,设置屏幕大小为:1000X800。设置两个画笔,star_center用来标记大五角星的中心位置,为绘制小五角星提供参考(制作要求小五角星一角要正对大五角星中心);画笔pen用于绘制各类图形。

设置国旗的大小为:900X600(保持长高比为3:2)。

  • flag_length = 900  

  • flag_height = 600

据此可以确定一等分的长度为30

  • unit = flag_length / 30

绘制旗面时,将画笔pen移至长方形左上角位置,然后绘制一个长方形,以红色填充即可。参考代码如下。

import turtle 
# 设置画布 
screen = turtle.Screen() 
screen.title("标准五星红旗"
screen.setup(1000800
screen.bgcolor("white"
#star_center用于标记五角星中心 
star_center = turtle.Pen() 
star_center.hideturtle() 
#pen用于绘制图形
pen = turtle.Pen() 
pen.speed(50
pen.hideturtle()
# 国旗尺寸参数(长高比为3:2)
flag_length = 900
flag_height = 600
unit = flag_length / 30# 旗面长度30等分即为基本单位长度 
# 绘制红色旗面 
def draw_background():
    pen.penup() 
    pen.goto(-flag_length/2, flag_height/2#画笔移动到旗面左上角位置
    pen.pendown() 
    pen.color("red"
    pen.begin_fill() 
    for _ in range(2): 
        pen.forward(flag_length) 
        pen.right(90
        pen.forward(flag_height) 
        pen.right(90
    pen.end_fill() 
    pen.penup()

确定五角星顶点坐标

在五角星的外接圆等距离确定5个点,相隔两点相连,所得外轮廓线即为五角星。绘制方法是:

将画笔移动至五角星中心点位置,设置好画笔方向,使之移动一个外接圆半径,画笔就位于外接圆上了。调整画笔方向与圆心垂直,并且使圆心位于画笔左侧;以画笔画圆形,每旋转72度,记录下画笔坐标,得到的5个坐标即为五角星顶点坐标。如下图所示。


视频详情

根据上述方法,定义获取五角星顶点坐标的函数get_star_ops(x, y, size, angle),它有4个参数,x和y是五角星中心点坐标,size是五角星外接圆的半径,angle是从中心点到第一个顶点位置面向的方向,函数返回5个顶点坐标值列表points。代码如下所示。

# 获取五角星顶点坐标 
def get_star_ops(x, y, size, angle):  
    pen.penup() 
    pen.goto(x, y) 
    pen.setheading(angle)
    pen.forward(size)
    pen.left(90)
    points=[]
    for _ in range(5): 
        x = pen.xcor() 
        y = pen.ycor()
        points.append((x, y)) 
        pen.circle(size,72)
    return points

绘制五角星

确定好五角星的5个顶点后,按照顺序①→③→⑤→②→④→①将各点连接,即可画出五角星,如下图所示。


因为后面要反复使用,我们将画五角星的过程定义为一个函数draw_star(points),函数参数points就是五角星的5个顶点坐标列表。代码如下所示。

# 绘制五角星 
def draw_star(points):  
    pen.penup() 
    pen.goto(points[0]) 
    pen.pendown() 
    pen.color("yellow"
    pen.begin_fill() 
    pen.goto(points[2])
    pen.goto(points[4])
    pen.goto(points[1])
    pen.goto(points[3])
   
    pen.end_fill()
    pen.penup()

计算小五角星中心点

4个小五角星的中心点位置是由旗面大小决定的,为此可以定义一个函数small_stars_pos()来计算,返回4个小五角星中心点坐标列表。参考代码如下。

# 计算小五角星中心点位置 
def small_stars_pos():  
    # 第一颗小星(上二下八、左十右五) 
    x1 = -flag_length/2 + 10 * unit 
    y1 = flag_height/2 - 2 * unit 
    # 第二颗小星(上四下六、左十二右三) 
    x2 = -flag_length/2 + 12 * unit 
    y2 = flag_height/2 - 4 * unit 
    # 第三颗小星(上七下三、左十二右三) 
    x3 = -flag_length/2 + 12 * unit 
    y3 = flag_height/2 - 7 * unit
    # 第四颗小星(上九下一、左十右五) 
    x4 = -flag_length/2 + 10 * unit 
    y4 = flag_height/2 - 9 * unit 
    return [(x1, y1), (x2, y2), (x3, y3), (x4, y4)]

设计主程序

按照旗面、小五角星、小五角星的绘制顺序,调用相关函数,即可完成绘制。参考代码如下所示。

# 主程序 
draw_background() #绘制旗面 
# 确定大五角星中心点位置(上五下五、左五右十) 
big_star_x = -flag_length/2 + 5 * unit 
big_star_y = flag_height/2 - 5 * unit 
point=get_star_ops(big_star_x, big_star_y, 3 * unit, 90)#返回大五角星的顶点坐标列表
draw_star(point)#绘制大五角星
star_center.penup()
star_center.goto(big_star_x, big_star_y) #将center_star移动至大五角星中心点
# 绘制四颗小五角星 
small_stars = small_stars_pos() #获得四个小五角星的中心点坐标
for x, y in small_stars:
    pen.goto(x,y)#画笔移至小五角星中心点
    angle=pen.towards(star_center)#获取画笔面向大五角星中心点的角度
    point=get_star_ops(x,y,unit,angle)#返回小五角星的顶点坐标列表
    draw_star(point) 
turtle.done()

评论详情