z-dist.celx
Posted: 17.01.2008, 19:14
A couple of issues I've identified in z-dist.celx.
Firstly, selecting a galaxy and then deselecting it removes the marker indicating the redshift.
Secondly, the selection highlighting does not discriminate between galaxies and other objects.
I've rewritten some of the code in the "main" section of the script to correct these issues, hopefully this all works now.
Firstly, selecting a galaxy and then deselecting it removes the marker indicating the redshift.
Secondly, the selection highlighting does not discriminate between galaxies and other objects.
I've rewritten some of the code in the "main" section of the script to correct these issues, hopefully this all works now.
Code: Select all
-- Title: Show Redshifts of Galaxies
function get_distance(obj_pos, ref_pos)
-- Returns distance Earth-object in Mpc.
distance = ref_pos:distanceto(obj_pos) * km2Mpc
return distance
end
function get_z(distance)
-- Returns redshift z.
-- Hubble constant = 73.2 (km/s)/Mpc, WMAP 3years, best
-- http://map.gsfc.nasa.gov/m_mm/tp_links.html
local H0 = 73.2
local c = 299792.458
z0 = (H0 * distance)/c
z = z0*(1 - z0/4)/(1 - z0/2)^2
-- d <= 2 * c/H0
return z
end
function rgb2hex(r,g,b)
-- Converts color code from RGB to Hex
local hex = string.format("#%.2x%.2x%.2x", r,g,b)
return hex
end
function get_color(z_rel)
-- Returns Hex color code from z_rel
if z_rel > 1 then
z_rel = 1
end
--local green = 255 * (1 - z_rel)/(1 + math.sqrt(z_rel))
local green = 255 * (1 - z_rel)^2
local red = 255
local blue = 255* math.sqrt(green/255)
hex_color = rgb2hex(red, green, blue)
return hex_color
end
function mark_galaxies(sel_pos)
zz = z_max(sel_pos)
for dso in celestia:dsos() do
if dso:type() == "galaxy" then
dso_pos = dso:getposition()
local d = get_distance(dso_pos,sel_pos)
local z_rel = get_z(d)/zz
local hex_color = get_color(z_rel)
dso:mark( hex_color, "disk", 1, 1 )
end
end
end
function z_max(ref_pos)
-- determine maximal redshift in catalog wrto ref_pos
z_old = 0
for dso in celestia:dsos() do
if dso:type() == "galaxy" then
dso_pos = dso:getposition()
local d = get_distance(dso_pos, ref_pos)
local z = get_z(d)
if z > z_old then
z_max = z
z_old = z_max
dsomax = dso
end
end
end
return z_max
end
----------
-- main --
----------
celestia:unmarkall()
celestia:show("markers")
km2Mpc = 1/3.08568025e19
MW = celestia:find("Milky Way")
MW_pos = MW:getposition()
--
-- select and specially mark Milky Way
--
celestia:select(MW)
celestia:mark(MW)
--
-- color encode all other galaxies according to their redshift
-- relative to Milky Way
--
mark_galaxies(MW_pos)
--
-- move observer to a distance of 1000 Mpc from Milky Way
--
observer = celestia:getobserver()
observer:gotodistance(MW, 1000/km2Mpc,5)
sel_old = MW
while true do
sel = celestia:getselection()
--
-- specially mark possible new selection, unmark the old one
--
if sel_old ~= nil then
if sel ~= sel_old then
if sel_old:type() == "galaxy" then
sel_old:unmark()
local d = get_distance(MW_pos,sel_old:getposition())
local z_rel = get_z(d) / zz
local hex_color = get_color(z_rel)
sel_old:mark(hex_color, "disk", 1, 1)
sel_old = nil
end
end
end
sel_pos = sel:getposition()
-- obs_pos = observer:getposition()
if sel:type() == "galaxy" then
sel:unmark()
sel:mark("#00FF00","disk",10,1)
sel_old = sel
local d = get_distance(MW_pos,sel_pos)
local z = get_z(d)
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)
end
wait(0)
end