GT_MM_1718_T1_Tutorial_1_2D

551 days ago by GT_MM_1718

Trigonometría esférica

Cambio de unidades

Las siguientes funciones pasan de grados a radianes y viceversa.

#auto def rad_to_deg(arad): arad=arad*180/pi # Pasamos a grados signo=sign(arad) # Guardamos el signo arad=abs(arad) # Quitamos el signo para trabajar siempre con cantidades positivas grados=floor(arad) # Grados if floor(arad+10^-13)>floor(arad): grados=floor(arad+10^-13) # Si estamos muy cerca de una cifra exacta, la usamos minutos=floor((arad-grados)*60) # Minutos if floor((arad-grados)*60+10^-12)>floor((arad-grados)*60): minutos=floor((arad-grados)*60+10^-12) # Si estamos muy cerca de una cifra exacta segundos=((((arad-grados)*60)-minutos)*60).n() # Segundos if abs(segundos)<10^-9: segundos=0 return signo*grados,minutos,segundos.n() def deg_to_rad(grados,minutos=0,segundos=0): return (sign(grados)*(abs(grados)+minutos/60+segundos/60/60)*pi/180).n() 
       

Vamos a probar las funciones pasando 1 radian a grados

rad_to_deg(1) 
       
rad_to_deg(-1) 
       

Es decir, 1 radian es 57 grados, 17 minutos y 44.8 segundos, aproximadamente.

Vamos a volver a convertir la salida en radianes

deg_to_rad(57,17,44.8062470963632) 
       

Practica:

1. Pasa $90^o$ en radianes y vuelta a grados.

2. Pasa $80^o10'11"$ a radianes.

3. Pasa $\pi/3$ a grados

4. Pasa $-40^o10'$ a radianes.

recto=deg_to_rad(90,0,0);recto 
       
rad_to_deg(recto) 
       

Mapa del mundo

Vamos a utilizar la proyección de Peters del mapa del mundo.

#auto import matplotlib.pyplot as plt import matplotlib.image as mpimg peters=mpimg.imread(DATA+'peters.png') n,m,_=peters.shape meridiano_0=935;ecuador=n/2; peters=peters[[n-1,n-2..0],:,:] # Lo colocamos bien peters_map=matrix_plot(peters)+points([(0,0),(0,peters.shape[0]),(peters.shape[1],0),(peters.shape[1],peters.shape[0])],size=0,xmin=0,xmax=m) 
       

Escribiendo peters_map, obtenemos el mapa del mundo.

peters_map 
       

Vertices

Creamos una función que recibe un punto (longitud y latitud en radianes) y devuelve el vértice correspondiente a ese punto dibujado en la esfera.

#auto def coordenadas_a_proyeccion_Peters(V): px=m*V[0]/pi/2+meridiano_0 if px<0: px=px+m py=n*sin(V[1])/2+ecuador return px,py def vertice2D(V,color='black'): return point(coordenadas_a_proyeccion_Peters(V),rgbcolor=color,size=10); 
       

Probamos la función:

peters_map+vertice2D([0,pi/2])+vertice2D([-pi,0]) 
       

Circunferencias máximas

Creamos una función que recibe dos puntos y dibuja el arco de circunferencia máxima que une los dos puntos.

#auto var('t') def arista2D(vA,vB,color='red'): # Si las dos longitudes coinciden, es un meridiano if abs(vA[0]-vB[0])<10^-10: lon=vA[0] lmin=min(vA[1],vB[1]) lmax=max(vA[1],vB[1]) s1=parametric_plot((m*lon/pi/2+meridiano_0-m,n*sin(t)/2+ecuador),(t,lmin,lmax),rgbcolor=color,xmin=0,xmax=m) s2=parametric_plot((m*lon/pi/2+meridiano_0,n*sin(t)/2+ecuador),(t,lmin,lmax),rgbcolor=color,xmin=0,xmax=m) s3=parametric_plot((m*lon/pi/2+meridiano_0+m,n*sin(t)/2+ecuador),(t,lmin,lmax),rgbcolor=color,xmin=0,xmax=m) return s1+s2+s3 # Tomamos como vértice A el que tenga menor longitud # y tal que la distancia sea menor que pi if vA[0]<=vB[0] and vB[0]-vA[0]>pi: vA,vB=vB,vA if vA[0]>vB[0] and vA[0]-vB[0]<=pi: vA,vB=vB,vA if vA[0]>vB[0] and vA[0]-vB[0]>pi: vB[0]=vB[0]+2*pi # Calculamos el ángulo A (que ha de ser constante en toda la arista) a=pi/2-vB[1];b=pi/2-vA[1];C=vB[0]-vA[0]; A=arccot((cot(a)*sin(b)-cos(b)*cos(C))/sin(C)) b=pi/2-vA[1];C=t-vA[0]; lat(t)=arctan((cos(b)*cos(C)+sin(C)*cot(A))/sin(b)) s1=parametric_plot((m*t/pi/2+meridiano_0-m,n*sin(lat(t))/2+ecuador),(t,vA[0],vB[0]),rgbcolor=color,xmin=0,xmax=m) s2=parametric_plot((m*t/pi/2+meridiano_0,n*sin(lat(t))/2+ecuador),(t,vA[0],vB[0]),rgbcolor=color,xmin=0,xmax=m) s3=parametric_plot((m*t/pi/2+meridiano_0+m,n*sin(lat(t))/2+ecuador),(t,vA[0],vB[0]),rgbcolor=color,xmin=0,xmax=m) return s1+s2+s3 
       
peters_map+arista2D([0,0],[pi/2,pi/4])+arista2D([-pi+0.5,-pi/3],[pi-0.3,pi/4],color=[0.5,0,0])+arista2D([-pi/2,-pi/4],[-pi/2,pi/2-0.001],color=[0.8,0,0]) 
       

A continuación, tenemos una función que recibe un vértice y un rumbo y dibuja la circunferencia máxima que pasa por ese vértice con ese rumbo

#auto var('t') def cmaxima2D(vA,A,color='yellow'): # Tomamos el ángulo entre 0 y pi while A>=pi: A=A-pi while A<0: A=A+pi # Si el ángulo es 0 es un meridiano if abs(A)<10^-10: lon=vA[0] return parametric_plot((m*lon/pi/2+meridiano_0,n*sin(t)/2+ecuador),(t,-pi/2,pi/2),rgbcolor=color) # Calculamos el ángulo A (que ha de ser constante en toda la arista) b=pi/2-vA[1];C=t-vA[0]; lat(t)=arctan((cos(b)*cos(C)+sin(C)*cot(A))/sin(b)) return parametric_plot((m*t/pi/2+meridiano_0,n*sin(lat(t))/2+ecuador),(t,-pi,pi),rgbcolor=color) 
       
peters_map+cmaxima2D([0,0],pi/4)+vertice2D([0,0]) 
       

Practica:

1. Dibuja los puntos correspondientes a los polos, el origen de coordenadas y los puntos $(\pm 45,\pm 45)$.

2. Dibuja el ecuador, los meridianos -45, 0, 45, la circurferencia máxima que pasa por el $(0,0)$ y tiene un ángulo de 45 respecto de la vertical y la circunferencia máxima que pasa por los puntos $(-45,45)$ y $(45,45)$.

 
       

Distancias

La siguiente función recibe un vértice y una distancia y devuelve los puntos a esa distancia.

#auto var('t_lat,t_lon') def distanciaVertice2D(V1,distancia,color='purple'): N=V1[0]-(t_lon-meridiano_0-m)*2*pi/m a=pi/2-V1[1] b=pi/2-arcsin(2*(t_lat-ecuador)/n) s1=implicit_plot(cos(distancia)==cos(a)*cos(b)+sin(a)*sin(b)*cos(N),(t_lon,0,m),(t_lat,-0,n)) N=V1[0]-(t_lon-meridiano_0)*2*pi/m a=pi/2-V1[1] b=pi/2-arcsin(2*(t_lat-ecuador)/n) s2=implicit_plot(cos(distancia)==cos(a)*cos(b)+sin(a)*sin(b)*cos(N),(t_lon,0,m),(t_lat,-0,n)) N=V1[0]-(t_lon-meridiano_0+m)*2*pi/m a=pi/2-V1[1] b=pi/2-arcsin(2*(t_lat-ecuador)/n) s3=implicit_plot(cos(distancia)==cos(a)*cos(b)+sin(a)*sin(b)*cos(N),(t_lon,0,m),(t_lat,-0,n)) return s1+s2+s3 
       

Probemos la función

peters_map+distanciaVertice2D([0,0],pi/3) 
       
peters_map+distanciaVertice2D([0,pi/2],pi/3) 
       
peters_map+distanciaVertice2D([pi,0],pi/3) 
       

Practica:

1. Dibuja los vértices en la posición (0,0) y (0,45).

2. Dibuja los puntos que distan $30^o$ de cada uno de los puntos anteriores. Idem con $45^o$ y con $60^o$.