# #Copyright (C) 2012 Sofia Abrunhosa #Escola Secundária da Ramada # #This program is free software; you can redistribute it and/or modify it under #the terms of the GNU General Public License as published by the Free Software #Foundation; either version 2 of the License, or (at your option) any later #version. # #This program is distributed in the hope that it will be useful, but WITHOUT #ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # from visual import * import time scene.autoscale=False a=0 e=0 c=0 print("a= comprimento do semieixo maior \ne= excentricidade da elipse") while c==0: change=input("\nDeseja inserir os valores de a e de e em vez de utilizar os predefinidos (a=10, e=0.7)? 1 para sim, 0 para não: ") c=1 try: int(change)-1 except: print("Insira 1 ou 0") c=0 if c==1: if int(change) not in (1,0): print("Insira 1 ou 0") c=0 if int(change)==0: a=10 e=0.7 b=1 if int(change)==1: while a==0: a=input("\nInsira o valor de a: ") b=1 try: float(a)-1 except: print("Insira um valor válido") a=0 b=0 if float(a)<=0 and b!=0: print("Insira um valor superior a 0") a=0 while e==0: e=input("\nInsira o valor de e: ") try: float(e)-1 except: print("Insira um valor válido") e=0 if float(e)<0 or float(e)>1: print("Insira um valor entre 0 e 1") e=0 a=float(a) e=float(e) c=e*a b=sqrt(a**2-c**2) dt=0.001 angle=0 m=0 d=1 f=1 g=1 h=1 i=1 j=0 l=0 o=0 t=0 ball1=sphere(pos=(c+a*cos(angle), b*sin(angle),0), radius=0.1) #Bolas e respetivas trajetórias ball1.trail=curve(color=color.orange, radius=0.02) ball2=sphere(pos=(c+a*cos(angle), a*sin(angle),0)) ball2.trail=curve(color=color.blue, radius=0.02) ball3=sphere(pos=(c+b*cos(angle), b*sin(angle),0)) ball3.trail=curve(color=color.red, radius=0.02) x_axis=curve(pos=[(-a+c,0,0), (a+c,0,0)], radius=0.02) #Eixos coordenados y_axis=curve(pos=[(c,-a,0), (c,a,0)], radius=0.02) a_length=curve(pos=[(a+c,0,0), (c,0,0)], radius=0.03, color=color.blue) #Parâmetros da elipse representados b_length=curve(pos=[(c,0,0), (c,b,0)], radius=0.03, color=color.red) c_length=curve(pos=[(0,0,0), (c,0,0)], radius=0.03, color=color.green) f1 = sphere(pos=(0,0,0), radius=0.1, color=color.orange) #Focos f2 = sphere(pos=(c+c,0,0), radius=0.1, color=color.orange) r1 = curve(pos=(c,0,0), radius=0.03, color=color.yellow) #Vetores posição r2 = curve(pos=[(c,0,0), (c+a*cos(pi/4), a*sin(pi/4),0)], color=color.cyan) r3 = curve(pos=[(c,0,0), (c+b*cos(pi/4), b*sin(pi/4),0)], color=color.magenta) r4 = curve(pos=(c,0,0), radius=0.03, color=color.yellow) r5 = curve(pos=(c,0,0), radius=0.03, color=color.yellow) r6 = curve(pos=(c,0,0), radius=0.03, color=color.green) r7 = curve(pos=(c,0,0), radius=0.03, color=color.green) r8 = curve(pos=(c,0,0), radius=0.03, color=color.blue) r9 = curve(pos=(c,0,0), radius=0.03, color=color.blue) x = curve(radius = 0.01) y = curve(radius = 0.01) label_areas=label(pos=(a+c,b,0)) label_velocity=label(pos=(-c,b,0)) r1.visible=False r2.visible=False r3.visible=False x.visible=False y.visible=False ball1.visible=False ball2.visible=False ball3.visible=False ball2.trail.visible=False ball3.trail.visible=False label_areas.visible=False label_velocity.visible=False scene.center=(c,0,0) #Texto explicativo dos comandos que podem ser executados print("\nClique em: \n 1: para ser mostrado o vetor posição da bola num determinado instante predefinido \n" " m: para ser mostrada uma circunferência de raio a \n n: para ser mostrada uma circunferência de raio b \n \n \n" "Para proceder à verificação da Segunda Lei de Kepler clique em <2> \nPara fixar dois vetores posição da bola, clique no mesmo número em dois instantes diferentes (formando um ângulo menor do que 180º) \n" "Será contabilizado o tempo decorrido entre os dois instantes \n \nPara fixar outro vetor posição, clique novamente em <2> \n" "O vetor seguinte corresponde ao vetor posição decorrido o tempo contabilizado \nIsto será repetido mais uma vez caso se clique novamente em <2> \n \n" "Para reiniciar clique em <0> \n \n \n" "No topo do ecrã: \n Velocidade: da bola \n A: área «varrida» pelo vetor posição num determinado intervalo de tempo \n P: deslocamento no mesmo intervalo de tempo (aproximadamente, para pequenos intervalos, distância percorrida)") while True: if j==1: rate(100) angle=angle+pi*dt #Variação do ângulo ball1.pos=(c+a*cos(angle), b*sin(angle),0) #Posição da bola em função do ângulo velocity=sqrt((-a*pi*sin(angle))**2+(b*pi*cos(angle))**2) #Velocidade da bola (derivada da posição) label_velocity.text="Velocidade= " + str(round(velocity,2)) if i==1: ball1.trail.append(pos=ball1.pos) #Elipse ball2.pos=(c+a*cos(angle), a*sin(angle),0) ball2.trail.append(pos=ball2.pos) #Circunferência maior ball3.pos=(c+b*cos(angle), b*sin(angle),0) ball3.trail.append(pos=ball3.pos) #Circunferência menor if m==0 and angle >= pi/4: r1.append(pos=(ball1.pos)) #Vetor posição em pi/4 x.append(pos=(ball1.pos.x,0,0)) x.append(pos=ball1.pos) y.append(pos=(c, ball1.pos.y,0)) y.append(pos=ball1.pos) m=1 if angle >= 2*pi: i=2 if angle>=2*pi: angle=0 if scene.kb.keys: #Comandos do teclado k = scene.kb.getkey() if k == "1": #Torna visível/invisível o vetor posição em pi/4 if d==1: r1.visible = True x.visible = True y.visible = True d=0 elif d==0: r1.visible = False x.visible = False y.visible = False d=1 if k == "m": #Torna visível/invisível a circunferência maior if f==1: ball2.trail.visible=True r2.visible=True f=0 elif f==0: ball2.trail.visible=False r2.visible=False f=1 if k == "n": #Torna visível/invisível a circunferência menor if g==1: ball3.trail.visible=True r3.visible=True g=0 elif g==0: ball3.trail.visible=False r3.visible=False g=1 if k == "2": #Fixa dos vetores posição da bola e calcula a área "varrida" e o deslocamento da bola num determinado intervalo de tempo l=l+1 if l==1: label_areas.visible=True label_velocity.visible=True ball1.visible=True j=1 if o==0: angle=0 a_length.visible=False b_length.visible=False c_length.visible=False elif l==2: r4.append(pos=ball1.pos) u1x=ball1.pos.x u1y=ball1.pos.y alpha1=acos((ball1.pos.x-c)/a) elif l==3: r5.append(pos=ball1.pos) u2x=ball1.pos.x u2y=ball1.pos.y alpha2=acos((ball1.pos.x-c)/a) theta1=abs(alpha2-alpha1) area1=theta1/2*a**2 p1=sqrt((u2x-u1x)**2+(u2y-u1y)**2) label_areas.text=(" A1= " + str(round(area1,2)) + "\n P1= " + str(round(p1,2)) + "\n A2= \n P2= \n A3= \n P3= ") elif l==4: r6.append(pos=ball1.pos) u3x=ball1.pos.x u3y=ball1.pos.y angle1=angle+pi*t r7.append(pos=(c+a*cos(angle1), b*sin(angle1),0)) u4x=c+a*cos(angle1) u4y=b*sin(angle1) theta2=pi*t area2=theta2/2*a**2 p2=sqrt((u4x-u3x)**2+(u4y-u3y)**2) label_areas.text=(" A1= " + str(round(area1,2)) + "\n P1= " + str(round(p1,2)) + "\n A2= " + str(round(area2,2)) + "\n P2= " + str(round(p2,2)) + "\n A3= \n P3= ") elif l==5: r8.append(pos=ball1.pos) u5x=ball1.pos.x u5y=ball1.pos.y angle2=angle+pi*t r9.append(pos=(c+a*cos(angle2), b*sin(angle2),0)) u6x=c+a*cos(angle2) u6y=b*sin(angle2) theta3=pi*t area3=theta3/2*a**2 p3=sqrt((u6x-u5x)**2+(u6y-u5y)**2) label_areas.text=(" A1= " + str(round(area1,2)) + "\n P1= " + str(round(p1,2)) + "\n A2= " + str(round(area2,2)) + "\n P2= " + str(round(p2,2)) + "\n A3= " + str(round(area3,2)) + "\n P3= " + str(round(p3,2))) if k == "0": #Reinicia a demonstração l=0 t=0 o=1 r4.pos=(c,0,0) r5.pos=(c,0,0) r6.pos=(c,0,0) r7.pos=(c,0,0) r8.pos=(c,0,0) r9.pos=(c,0,0) label_areas.visible=False label_velocity.visible=False label_areas.text=(" A1= \n P1= \n A2= \n P2= \n A3= \n P3= ") if l==2: #Conta o tempo decorrido entre a marcação do primeiro e do segundo vetores posição t=t+dt