Exemplo n.º 1
0
def calculate():
    global canvas, startTime   
    fr_control.start()
    const = 1 / (width)    
    k = 0.051
    collided = False
    canvas.delete(ALL)        
    nrCollisions = 0
    text = canvas.create_text(width/2, 72)
    nrDigits = int(digits.get())
    TimeSteps = 1
    block1 = Block(10, height, 1, 30, 50)
    block2 = Block(500, height, 100 **( nrDigits-1), 30, 100, (-100/TimeSteps))
    k = - 100
    block1.show(canvas)
    block2.show(canvas)       
    numerator = (width - block2.x + k) 
    oldNumerator = numerator
    firstTime = True
    #secondTime = False
    realNrCollisions = int(math.pi * 10 ** (nrDigits-1))
    previousNrCollisions = 0
    while(True):
        block1.setOld()
        block2.setOld()
        for i in range(0, TimeSteps):
            numerator = (width - block2.x + k)
            if (block1.x <= 0):            
                block1.vx *= -1
                #block1.x = block1.x * -1
                collided = True
            elif (block1.collide(block2)):
                collided = True
                sumOfMasses = block1.mass + block2.mass
                newV1 = (block1.mass - block2.mass) * block1.vx
                newV1 += (2 * block2.mass) * block2.vx
                newV1 /= sumOfMasses

                newV2 = (block2.mass - block1.mass) * block2.vx
                newV2 += (2 * block1.mass) * block1.vx
                newV2 /= sumOfMasses
                #block1.x -= block1.size - (x2 - x1) / 2
                #block2.x += block1.size - (x2 - x1) / 2
                block1.vx = newV1
                block2.vx = newV2
            
            if(nrCollisions == realNrCollisions and firstTime):    
                firstTime = False            
                block2.vx *= TimeSteps
                TimeSteps = 1
                break
            elif(numerator - oldNumerator > 100):
                #firstTime = False
                oldNumerator = numerator
                nrSteps = math.ceil(nrDigits * numerator * const)
                block2.vx *= TimeSteps
                block1.vx *= TimeSteps
                TimeSteps = nrSteps ** (nrSteps - 1)
                block2.vx /= TimeSteps
                block1.vx /= TimeSteps   
            if(collided):
                nrCollisions += 1          
                collided = False  
            block1.update()
            block2.update()            
        #print(block2.vx - block1.vx)
        canvas.itemconfig(text, text=str(nrCollisions))    
        canvas.itemconfig(text, font=("Courier", 72)) 
        block1.move(canvas)
        block2.move(canvas) 
        root.update()
        fr_control.delay()
    block1 = None
    block2 = None