|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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() |
评分
-
查看全部评分
|