JustPaste.it

Skrypt w Pythonie rysujący światło w Niebocentryzmie

Widoczny bieg promieni światła pod firmamentem.

Widoczny bieg promieni światła pod firmamentem.

 

NCLightNCLight2NCLight3NCLight4NCLight6NCLight7NCLight8

Klawisz Backspace przywraca poprzedni widok (np. oddalony).
Myszą zaznacza się aby przybliżyć.
Pierwsza po lewej na dole opcja przywraca ogólny widok.

Dobrze jest rozmiar okna dobrać jako jednakowy w obu wymiarach aby obraz miał właściwy kształt (aspekt – 1:1).
Prosty skrypt do tego, potrzebny jest program wmctrl:
#!/bin/bash
wmctrl -r “Promienie swiatla we wkleslej Ziemi” -e 0,10,10,480,480

Kod skryptu w Pythonie, biblioteki wymagane matplotlib i numpy

 

  1. #/usr/bin/python2
  2. from numpy import *
  3. from math import *
  4. import matplotlib.pyplot as plt
  5. import matplotlib.patches as pat
  6. import matplotlib.colors as colors
  7. from matplotlib.path import *
  8. import sys
  9.  
  10. #przygotowanie obiektow biblioteki
  11.  
  12. fig, ax = plt.subplots()
  13. #aby pelne okno wykorzystac i nie bylo problemu z biblioteka
  14. fig.subplots_adjust(wspace=0,hspace=0,left=0,bottom=0,right=1,top=1)
  15. fig.canvas.set_window_title("Promienie swiatla we wkleslej Ziemi")
  16.  
  17. #wspolrzedne transformowane swiatla nad linia Karmana
  18. xcoords=[]
  19. ycoords=[]
  20. #wspolrzedne transformowane swiatla po zalamaniu i rozszczepieniu przez firmament
  21. xcoords_firm=[]
  22. ycoords_firm=[]
  23.  
  24. RelIOR=.7 #przykladowy wzgledny wspolczynnik zalamania firmamentu
  25. r=an=0
  26. R=2.5
  27. R_2=R*R
  28. _2R=2*R
  29. KarmanR=R*(1+100/6371.008)
  30.  
  31. start_a=-1
  32. end_a=1
  33. b=0
  34. Da=abs(end_a-start_a)
  35. #okrag skorupy ziemskiej
  36. pat=ax.add_patch(plt.Circle((0,0),KarmanR,fill=False,edgecolor='#773300'))
  37. pat.zorder=-8
  38.  
  39. #pod firmamentem
  40. for a in arange(start_a,end_a,0.004):
  41. for x in arange(_2R, .03,-.03):
  42. try:
  43. a_firm=tan(asin(sin(atan(a))/RelIOR))
  44. except:
  45. continue
  46. y=a_firm*(_2R-x)+b
  47. hyppow2=x*x+y*y
  48. if sqrt(hyppow2)<=R-0.1:
  49. break
  50. kwr=R_2/hyppow2
  51. X=x*kwr
  52. Y=y*kwr
  53. xcoords_firm.append(X)
  54. ycoords_firm.append(Y)
  55. ax.plot(xcoords_firm,ycoords_firm,color=colors.hsv_to_rgb((abs(a-start_a)/Da/6,1,0.88)),clip_path=pat,clip_on=True,zorder=-8)
  56. xcoords_firm=[]
  57. ycoords_firm=[]
  58.  
  59. #okrag szkla nieba na linii Karmana
  60. pat_firm=ax.add_patch(plt.Circle((0,0),R,fill=True,facecolor='#FFFFFF',edgecolor='#1177ff'))
  61. pat_firm.set_zorder=-4
  62.  
  63. #nad
  64. for a in arange(start_a,end_a,0.1):
  65. for x in arange(_2R,0,-.023):
  66. y=a*(_2R-x)+b
  67. hyppow2=x*x+y*y
  68. if sqrt(hyppow2)<=KarmanR:
  69. break
  70. kwr=R_2/hyppow2
  71. X=x*kwr
  72. Y=y*kwr
  73. xcoords.append(X)
  74. ycoords.append(Y)
  75. #promien swiatla przed zalamaniem
  76. ax.plot(xcoords,ycoords,color=(0.8,0.8,0),clip_path=pat_firm,clip_on=True,zorder=20)
  77. xcoords=[]
  78. ycoords=[]
  79.  
  80. plt.show()
  81.