task3.py (2281B) - Raw
1 #!/usr/bin/python3 2 3 import sys 4 5 from math import sin, cos, radians 6 from shapely.geometry import LineString 7 import matplotlib.pyplot as plt 8 9 10 11 # bendri 12 lambda_0 = 0 13 dphi = 5 14 dlambda = 5 15 R = 6_388_945 16 H = 350_000 17 D = H + R 18 19 # Įdomesni 20 dphi = 2 21 dlambda = 2 22 phi_p, phi_s = 0, 32 23 lambda_v, lambda_r = -16, 16 24 plt.xkcd(scale=0) 25 26 # mano 27 #phi_p, phi_s = 43, 53 28 #lambda_v, lambda_r = -5, 5 29 30 # Ovodo 31 # phi_p, phi_s = 40, 50 32 # lambda_v, lambda_r = -5, 5 33 34 # apskaičiuoti 35 nphi = int((phi_s-phi_p)/dphi)+1 36 phi_0 = (phi_p+phi_s)/2 37 nlambda = int((lambda_r-lambda_v)/dlambda)+1 38 39 40 def c(x): 41 return "{}°".format(x) 42 43 44 def annotate(ax, text, point, heading): 45 ax.annotate(text, point, textcoords="offset points", xytext=heading, fontsize='xx-small') 46 47 48 def yx(phi, lambd): 49 # phi - lat in degrees 50 # lambd - lon in degrees 51 rphi = radians(phi) 52 rlambd = radians(lambd) 53 cosz = sin(rphi)*sin(rphi_0)+cos(rphi)*cos(rphi_0)*cos(rlambd-rlambda_0) 54 sinzcosa = sin(rphi)*cos(rphi_0)-cos(rphi)*sin(rphi_0) 55 sinzsina = cos(rphi)*sin(rlambd-rlambda_0) 56 x = H*R*sinzcosa/(D-R*cosz) 57 y = H*R*sinzsina/(D-R*cosz) 58 return (y/1e4, x/1e4) 59 60 61 W, E, N, S = (-25, 0), (10, 0), (0, 10), (0, -25) 62 63 64 # verčiame laipsnius į radianus 65 for v in ['phi_0', 'phi_p', 'phi_s', 'lambda_0', 'lambda_v', 'lambda_r']: 66 locals()["r"+v] = radians(locals()[v]) 67 68 points = [] 69 for i in range(nphi): 70 phid = phi_p + i*dphi 71 on_y = [] 72 for j in range(nlambda): 73 lambdad = lambda_v + j*dlambda 74 on_y.append(yx(phid, lambdad)) 75 points.append(sorted(on_y)) 76 77 78 fig, ax = plt.subplots() 79 ax.axis("off") 80 81 # abscises 82 for i in range(nphi): 83 row = [points[i][j] for j in range(nlambda)] 84 ax.plot(*(LineString(row).xy), color="xkcd:black", linewidth=.5) 85 annotate(ax, c(phi_p+i*dphi), row[0], W) 86 annotate(ax, c(phi_p+i*dphi), row[-1], E) 87 88 # ordinates 89 for i in range(nlambda): 90 col = [points[j][i] for j in range(nphi)] 91 ax.plot(*(LineString(col).xy), color="xkcd:black", linewidth=.5) 92 annotate(ax, c(lambda_v+i*dlambda), col[0], S) 93 annotate(ax, c(lambda_v+i*dlambda), col[-1], N) 94 95 96 if __name__ == '__main__': 97 if len(sys.argv) == 2: 98 plt.savefig(sys.argv[1], bbox_inches='tight') 99 print("Saved %s" % sys.argv[1]) 100 else: 101 plt.show()