stud

study spacejunk
Log | Files | Refs | LICENSE

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()