一点也不好看。
from tkinter import *
master = Tk()
canvas_width = 1200
canvas_height = 400
w = Canvas(master,
width=canvas_width,
height=canvas_height)
w.pack()
w.create_line(10,0, 10, canvas_height, fill="#0000FF", width=1)
w.create_line(0,canvas_height//2, canvas_width, canvas_height//2, fill="red", width=1)
def line(p2):
a,b,c,d=p2
w.create_line(a, b, c, d, fill="#476042", width=1)
##===================================
"""
这里,在collatz变换中,一个正整数变成1的过程中,
遇到的奇数称之为接入点。接入点连在一起,
成为接入链路。它们距离终端1有多少节,称为阶。比如
5是一阶接入点,7为五阶接入点。
"""
def yap(n,z=2):
i=0
while n>1 and n % z ==0:
n //=z
i+=1
return i,n
##--------------------- 在某一范围内求,接入点和环
di={} #已知的 接入点和阶记录
def apnt(n):
s=[]# 记录前进中遇到的奇数
t=0
if n <=0:return
#ct=0
#print('--',n)
ll=2
while n!=1:
#ct+=1
if n%2 ==1:
if n in di :#和已知某路径接续
b=di[n]
for a in s: #增添新的接入点
di[a]=t+b
x1=a/128 # 把奇数缩小作为x坐标
y1=(t+b)*4 # 阶数放大作为y坐标
p2=x1,y1,x1+1,y1+1
line(p2)
t-=1
s=[] #____________
#print('brk')
break
else:
s+=[n]
t+=1
n=n*3+1
else:
n=yap(n)[1]
#print(ct,n)
#__________________________
if s!=[]:# 全新的路径,新的接入点
for a in s:
di[a]=t
t-=1
for i in range(60000):
apnt(i)
'''
def ff():# 打印[接入点和阶记录]字典
v=list(di.items())
v=sorted(v,key=lambda x:x[1])
for i in v:
print(i)
print()
##-----------------
ccd={} #用来在某环统计接入点个数(在某个范围下)
ccp={} #记录某环上的接入点
def cc():# 制作上面2字典
for i in di:
r=di[i]
if r in ccd:
ccd[r]+=1
ccp[r]+=[i]
else:
ccd[r]=1
ccp[r]=[i]
'''
mainloop()