z-dist.celx
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. -- Title: Show Redshifts of Galaxies
  2. function get_distance(obj_pos, ref_pos)
  3.    -- Returns distance Earth-object in Mpc.
  4.    distance = ref_pos:distanceto(obj_pos) * km2Mpc
  5.    return distance
  6. end
  7. function get_z(distance)
  8.    -- Returns redshift z.
  9.    -- Hubble constant = 73.2 (km/s)/Mpc, WMAP 3years, best
  10.    -- http://map.gsfc.nasa.gov/m_mm/tp_links.html
  11.    local H0 = 73.2
  12.    local c = 299792.458
  13.    z0 = (H0 * distance)/c
  14.    z = z0*(1 - z0/4)/(1 - z0/2)^2
  15.    -- d <= 2 * c/H0
  16.    return z
  17. end
  18. function rgb2hex(r,g,b)
  19.    -- Converts color code from RGB to Hex
  20.    local hex = string.format("#%.2x%.2x%.2x", r,g,b)
  21.    return hex
  22. end
  23. function get_color(z_rel)
  24.    -- Returns Hex color code from z_rel
  25.    if z_rel > 1 then
  26.        z_rel = 1
  27.    end
  28.    --local green = 255 * (1 - z_rel)/(1 + math.sqrt(z_rel))
  29.    local green = 255 * (1 - z_rel)^2
  30.    local red   = 255 
  31.    local blue  = 255* math.sqrt(green/255)
  32.    hex_color   = rgb2hex(red, green, blue)
  33.    return hex_color
  34. end
  35.    
  36. function mark_galaxies(sel_pos)
  37.    zz = z_max(sel_pos)
  38.    for dso in celestia:dsos() do
  39.       if dso:type() == "galaxy" then
  40.          dso_pos = dso:getposition()
  41.          local d = get_distance(dso_pos,sel_pos)
  42.          local z_rel = get_z(d)/zz
  43.          local hex_color = get_color(z_rel)
  44.          dso:mark( hex_color, "disk", 1, 1 )
  45.       end
  46.    end
  47. end
  48. function z_max(ref_pos)
  49.    -- determine maximal redshift in catalog wrto ref_pos
  50.    z_old = 0
  51.    for dso in celestia:dsos() do
  52.       if dso:type() == "galaxy" then
  53.          dso_pos = dso:getposition()
  54.          local d = get_distance(dso_pos, ref_pos)
  55.          local z = get_z(d)
  56.          if z > z_old then
  57.              z_max = z
  58.              z_old = z_max
  59.              dsomax = dso
  60.          end    
  61.       end
  62.    end
  63.    return z_max
  64. end
  65. ----------
  66. -- main -- 
  67. ----------
  68. celestia:unmarkall()
  69. celestia:show("markers")
  70. km2Mpc = 1/3.08568025e19
  71. MW = celestia:find("Milky Way")
  72. MW_pos = MW:getposition()
  73. --
  74. -- select and specially mark Milky Way
  75. --
  76. celestia:select(MW)
  77. celestia:mark(MW)
  78. --
  79. -- color encode all other galaxies according to their redshift
  80. -- relative to Milky Way
  81. --
  82. mark_galaxies(MW_pos)
  83. --
  84. -- move observer to a distance of 1000 Mpc from Milky Way
  85. --
  86. observer = celestia:getobserver()
  87. observer:gotodistance(MW, 1000/km2Mpc,5)
  88. sel_old = MW
  89.    
  90. while true do   
  91.    sel = celestia:getselection()
  92.    --
  93.    -- specially mark possible new selection, unmark the old one
  94.    --
  95.    if sel ~= sel_old then
  96.        sel:unmark()
  97.        sel_old:unmark()
  98.        sel:mark("#00FF00","disk",10,1)
  99.        sel_old = sel
  100.    end    
  101.    
  102.    sel_pos = sel:getposition()
  103.    
  104.    -- obs_pos = observer:getposition()
  105.    
  106.    if sel:type() == "galaxy" then
  107.       local d = get_distance(MW_pos,sel_pos)
  108.       local z = get_z(d)
  109.       celestia:print(sel:name()..": "..string.format("redshift z = %5.3f,  distance = %5.2f  Mpc", z,d).."nmax. redshift: "..dsomax:name(),5,-1,-1,0,6)
  110.    end
  111.    wait(0)
  112. end