You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
3.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import tkinter as tk
import tkinter.font as tf
import math
FinishLevel_Y = 14
TreePercent_Y = 0.7
LeftAngle_Y = 30
RightAngle_Y = 30
InitPoint_Y = (420, 500)
InitAngle_Y = 90
InitLong_Y = 150
params_Y = " 分形层数finishLevel={}\n" \
" 缩放比例treePercent={}\n" \
" 左枝倾角leftAngle={}\n" \
" 右枝倾角rightAngle={}\n" \
" 初始点initPoint={}\n" \
" 初始角initAngle={}\n" \
" 初始长度initLong={}".format(FinishLevel_Y, TreePercent_Y, LeftAngle_Y, RightAngle_Y,
InitPoint_Y, InitAngle_Y, InitLong_Y)
# 创建全局变量 cv_small 和 cv_big
cv_small = None
cv_big = None
# Y形基本图案函数
def yPattern():
cv_small.delete("all") # 清除画布
cv_small.create_line(30, 10, 90, 70, fill='red', width=2) # 左臂
cv_small.create_line(150, 10, 90, 70, fill='red', width=2) # 右臂
cv_small.create_line(90, 140, 90, 70, fill='red', width=2)
# Y形树执行函数
def run_Y_tree():
def Y_tree(depth, percent, left_angle, right_angle, start_point, angle, length, canvas):
if depth == 0:
return
end_point = (start_point[0] + length * math.cos(math.radians(angle)),
start_point[1] - length * math.sin(math.radians(angle)))
canvas.create_line(start_point, end_point, fill='LightBlue4', width=2)
Y_tree(depth - 1, percent, left_angle, right_angle, end_point, angle + right_angle, length * percent,
canvas) # 画右枝
Y_tree(depth - 1, percent, left_angle, right_angle, end_point, angle - left_angle, length * percent,
canvas) # 画左枝
root = tk.Tk()
root.geometry('1270x650')
root.title('分形树')
ft3 = tf.Font(family="黑体", size=18)
global cv_small, cv_big # 声明 cv_small 和 cv_big 为全局变量
# 创建蓝色边框的大画布
cv_big = tk.Canvas(root, bg="white", highlightthickness=1, highlightbackground="LightBlue")
cv_big_width = 880
cv_big_height = 690
cv_big.config(width=cv_big_width, height=cv_big_height)
cv_big.place(x=330, y=10, anchor='nw')
# 创建红色边框的小画布
cv_small_width = cv_big_width // 4
cv_small_height = cv_big_height // 4
cv_small = tk.Canvas(root, bg="white", highlightthickness=1, highlightbackground="red")
cv_small.config(width=cv_small_width, height=cv_small_height)
cv_small.place(x=530, y=cv_big_height - cv_small_height + 10, anchor='nw')
# 绘制Y形基本图案
yPattern()
# 调用绘制Y形分形树的函数
Y_tree(FinishLevel_Y, TreePercent_Y, LeftAngle_Y, RightAngle_Y, InitPoint_Y, InitAngle_Y, InitLong_Y, cv_big)
# 创建底部的结果输出框
output_text = tk.Text(root, bg="white", highlightthickness=1, highlightbackground="LightBlue")
output_text.configure(font=ft3, spacing1=8)
output_text.insert(tk.INSERT, params_Y)
# 设置文本框不可编辑
output_text.configure(state="disabled")
output_text.place(x=20, y=800, width=1390, height=80, anchor='sw')
root.mainloop()
# 调用运行Y形树的函数
run_Y_tree()