鱼C论坛

 找回密码
 立即注册
查看: 9740|回复: 224

[作品展示] 第一次发帖,祝祖国繁荣昌盛,用python画个国旗

  [复制链接]
发表于 2020-1-2 13:56:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
根据标准,画一个国旗
但是由于计算量有点大,所以程序运行时间有点点长,大家运行代码时呢需要耐心等待
from tkinter import *  
from sympy import *    # sympy模块 是用来解方程的(提前用pip下载好)
import math as m

W = 1440 # 国旗的比例为 4:3
H = 960

root = Tk()

C = Canvas(root, width = W, height = H, background = "#f40002") #根据标准,国旗背景色RGB值为 #f40002
C.pack()

# 计算每颗五角星每一个角的初始坐标值
# 这个计算和小甲鱼python视频的第72课的方法一样
def compute_star(x, y, R):
    r1 = R * m.sin(2 * m.pi / 5)
    r2 = R * m.cos(2 * m.pi / 5)
    r3 = R * m.sin(m.pi / 5)
    r4 = R * m.cos(m.pi / 5)

    points = [
        # 左上点
        x - r1,
        y - r2,
        # 右上点
        x + r1,
        y - r2,
        # 左下点
        x - r3,
        y + r4,
        # 顶点
        x,
        y - R,
        # 右下点
        x + r3,
        y + r4
        ]
   
    return points

# 根据圆的方程和两点之间的距离公式解出旋转后得到的坐标值
def func(x, y, R, L, x1, y1):
    X = symbols("X")
    Y = symbols("Y")

    result = solve(
        [(X - x1)**2 + (Y - y1)**2 - L**2,
         (X - x)**2 + (Y - y)**2 - R**2],
        [X, Y] )

    return result

# 获得旋转后的每个角的坐标值(四颗小五角星都有一个角是指向大五角星的中心)
def rotate_star(x, y, R, L):
    points = compute_star(x, y, R)

    if L == 0:
        return points

    a = func(x,y,R,L,points[0],points[1])
    b = func(x,y,R,L,points[2],points[3])
    c = func(x,y,R,L,points[4],points[5])
    d = func(x,y,R,L,points[6],points[7])
    e = func(x,y,R,L,points[8],points[9])

    # 经过解方程得到的值是一个二元列表,至少都是两队坐标,需要筛选,使得五角星统一顺时针旋转
    # 左上角
    if a[0][1] < points[1]:
        points[0] = a[0][0]
        points[1] = a[0][1]
    else:
        points[0] = a[1][0]
        points[1] = a[1][1]

    # 右上角
    if b[0][1] > points[3]:
        points[2] = b[0][0]
        points[3] = b[0][1]
    else:
        points[2] = b[1][0]
        points[3] = b[1][1]

    # 左下角
    if c[0][1] < points[5]:
        points[4] = c[0][0]
        points[5] = c[0][1]
    else:
        points[4] = c[1][0]
        points[5] = c[1][1]

    # 顶点
    if d[0][0] > points[6]:
        points[6] = d[0][0]
        points[7] = d[0][1]
    else:
        points[6] = d[1][0]
        points[7] = d[1][1]

    # 右下角
    if e[0][0] < points[8]:
        points[8] = e[0][0]
        points[9] = e[0][1]
    else:
        points[8] = e[1][0]
        points[9] = e[1][1]

    return points
   

# 得到旋转后的坐标值,开始绘制( L为旋转量 )
def paint_star(x, y, R, L):
    points = rotate_star(x, y, R, L)
    C.create_polygon(points, outline="#faf408", fill="#faf408") # 五角星的RGB值为 #faf408

# 大五角星
center_X = 5 * H / 20   # 外接圆的圆心横坐标
center_Y = 5 * H / 20   # 纵坐标
R1 =  3 * H / 20        # 半径

paint_star(center_X, center_Y, R1, 0)  # 大五角星不旋转

# 第一颗小五角星
center_x1 = 10 * H / 20 # 小五角星外接圆的圆心横坐标
center_y1 = 2 * H / 20  # 纵坐标
R2 = H / 20             # 小五角星外接圆的半径都为 R2

paint_star(center_x1, center_y1, R2, 19.5) # 这些旋转量都是我经过多次实验得出来相对比较合适的

# 第二颗小五角星
center_x2 = 12 * H / 20
center_y2 = 4 * H / 20

paint_star(center_x2, center_y2, R2, 37)

# 第三颗小五角星
center_x3 = 12 * H /20
center_y3 = 7 * H / 20

paint_star(center_x3, center_y3, R2, 55)

# 第四颗小五角星
center_x4 = 10 * H /20
center_y4 = 9 * H / 20

paint_star(center_x4, center_y4, R2, 17.2)

mainloop()

评分

参与人数 3荣誉 +10 鱼币 +9 贡献 +3 收起 理由
LYF511 + 5 + 5 + 3 鱼C有你更精彩^_^
新雨花石 + 2 + 1
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-2 14:02:50 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-2 14:18:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-2 15:47:56 | 显示全部楼层
支持楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 15:48:39 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-2 15:50:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-2 16:35:14 | 显示全部楼层
我康康,学习一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 16:45:57 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 19:22:48 | 显示全部楼层
教教我唄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 20:12:01 | 显示全部楼层
支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-2 21:20:31 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-2 22:19:10 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-3 09:43:07 | 显示全部楼层
看一看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-3 14:47:22 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-3 15:06:43 | 显示全部楼层
这么厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-3 15:29:14 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-3 16:21:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-3 16:41:53 | 显示全部楼层
可以可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-3 16:57:18 | 显示全部楼层
学习学习哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-3 18:35:35 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 22:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表