中二一问----时针分针秒针什么时候夹角间隔一样在0时0分0秒开始计时的时候?

逻辑&问题

1.0时钟上一个格子对应6度
2.0只需要模拟12个小时走完一圈就行了
3.0有些时钟不一样可能是一格一格走的,不过对应的角度关系不变,可是会影响到模拟的精度
4.0运算的时候要显示出运算的状态,但是要简明.

下面直接上代码

from queue import Queue
import threading
from decimal import Decimal
from decimal import getcontext
import time,os

angle_dic = Queue(1000)
calculate_ok=1
end_time = 60*60*12
lock = threading.Lock()
def get_angle_time():
    global secends_point
    secends_point = 0
    print("运算开始:")

    while True:
        getcontext().prec = 6
        secends_point+=Decimal(0.2)
        minter_point = Decimal(secends_point)/Decimal(60)
        hour_point = Decimal(minter_point)/Decimal(60)
        if minter_point == end_time:
            print("0k")
            return
        angle={
    
    }
        angle['secends']=secends_point*6
        angle['minter']=Decimal(minter_point)*6
        angle['hour']=Decimal(hour_point)*6
        angle_dic.put(angle)



def calculate_angle():
    global calculate_ok,secends_point

    while True:

        getcontext().prec = 6
        angle_get = angle_dic.get()
        secends_angle = angle_get['secends']%360
        minter_angle = angle_get['minter']%360
        hour_angle = angle_get['hour']%360
        if secends_angle>minter_angle:
            if minter_angle > hour_angle :
                comper_angle_sm = Decimal(secends_angle)- Decimal(minter_angle)
                comper_angle_mh = Decimal(minter_angle) - Decimal(hour_angle)
            elif minter_angle < hour_angle and secends_angle>hour_angle:
                comper_angle_mh = Decimal(hour_angle)-Decimal(minter_angle)
                comper_angle_sm = Decimal(secends_angle) - Decimal(hour_angle)
        elif minter_angle >secends_angle:
            if hour_angle>secends_angle and hour_angle<minter_angle:
                comper_angle_mh = Decimal(minter_angle) - Decimal(hour_angle)
                comper_angle_sm = Decimal(hour_angle) - Decimal(secends_angle)
            elif hour_angle<secends_angle :
                comper_angle_sm = Decimal(minter_angle)- Decimal(secends_angle)
                comper_angle_mh = Decimal(secends_angle) - Decimal(hour_angle)
        elif hour_angle > minter_angle:
            if minter_angle > secends_angle :
                comper_angle_sm = Decimal(hour_angle) - Decimal(minter_angle)
                comper_angle_mh = Decimal(minter_angle)- Decimal(secends_angle)
            elif minter_angle < secends_angle and hour_angle > secends_angle:
                comper_angle_sm = Decimal(secends_angle) - Decimal(minter_angle)
                comper_angle_mh = Decimal(hour_angle) - Decimal(secends_angle)
        else:
            pass
        if abs(comper_angle_mh-comper_angle_sm) < 0.01:
            lock.acquire()
            calculate_ok = 0
            lock.release()
            time_secends = Decimal(secends_angle)/Decimal(6)
            time_minter = Decimal(minter_angle)/Decimal(6)
            time_hour = Decimal(hour_angle)/Decimal(6)
            print("\n在{hour}时{minter}分{secends:.2f}秒三个指针的间隔相等为:{space:.3f}°".format(hour=int(time_hour),minter=int(time_minter),secends=time_secends,space=comper_angle_sm))
        if Decimal(hour_angle)/Decimal(6) >=12:
            calculate_ok=2
            print("\n计算完成")
            os._exit(0)

def showndo():
    global calculate_ok,secends_point
    while True:
        if calculate_ok==2:
            os._exit(0)

        if calculate_ok:

            for i in range(30):

                br = "\033[41m \033[0m"
                time.sleep(0.2)
                print(br, end='')
            br = '\r' + br
            print(br, end='')
        else:
            lock.acquire()
            calculate_ok=1
            lock.release()



t1 = threading.Thread(target=get_angle_time)
t1.start()
t2=threading.Thread(target=calculate_angle)
t2.start()
t3 = threading.Thread(target=showndo)
t3.start()




这里我要吐槽的是,由于这个print()函数的进度条问题,具体原因应该是线程和print函数的线程内部的一些问题,没有办法直接用return结束函数,这里只能使用os._exit(0)强行结束

实时进度条显示

这个其实利用了\r这个玩意,这个东东可以覆盖打印
例如:
print(“abc\rbnx”)
结果时:
bnx
所以这个就好玩了

 for i in range(30):

     br = "\033[41m \033[0m"
     time.sleep(0.2)
     print(br, end='')
 br = '\r' + br
 print(br, end='')

那个奇奇怪怪的\033是他的特殊的输出模式,可以输出带有颜色的字体

这里是引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
"\033[1;30;42m你好\033[0m"
结果就是:高亮红色背景绿色的你好
然后注意那个\033[0m其实是恢复默认的意思,如果你不加入那你后面打印的都是这种格式的内容

在这里插入图片描述

在这里插入图片描述

算法结果

这个么你们也看到了,现在我的秒针跨度是0.2秒,角度数量级为-4,误差精度为小数点后3位
结果是:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/FUTEROX/article/details/113001329
今日推荐