#!/usr/bin/python3
# ===================================================================
# Rough cut of star display
#
# Read a star catalog and display selected stars in a graphics window.
# There is no star selection, scaling, mapping to graphics window,...
# like I said, a rough cut.
# ===================================================================
import graphics as gr
import draw_xy_axes as ax
import user_interface as ui
import coordinate_conversion as cc
from math import radians, sin, cos
import sys
star_catalog = 'bsc5.dat'
win_width = 801
win_height = 801
# -------------------------------------------------------------------
# ---- draw a circle
# -------------------------------------------------------------------
def draw_circle(win,x,y,color="black",raidus=2):
wx,wy = cc.center_to_win_coords(x,y,win.width,win.height)
c = gr.Circle(gr.Point(wx,wy),raidus)
c.setFill(color)
c.setWidth(1)
c.setOutline(color)
c.draw(win)
return c
# -------------------------------------------------------------------
# ---- draw stars (small circles)
# ---- skip drawing if Z coord <= 0.0
# ---- if star is double/multiple-star draw red circle
# ---- else draw black circle
# -------------------------------------------------------------------
def draw_stars(win,stars):
for s in stars:
if s[2] > 0.0:
if s[3] == '': # double/multiple-star code
draw_circle(win,s[0],s[1])
else:
draw_circle(win,s[0],s[1],'red')
# -------------------------------------------------------------------
# ---- convert galactic lat/lon to xyz
# ---- (unit vector is radius of sphere)
# -------------------------------------------------------------------
def lat_lon_to_xyz(lat,lon,scale=300.0):
rlat = radians(lat) # convert to radians
rlon = radians(lon) # convert to radians
x = sin(rlat) * cos(rlon)
y = sin(rlat)
z = cos(rlat) * cos(rlon)
return (x*scale, y*scale, z*scale)
# -------------------------------------------------------------------
# ---- convert galactic lat/lon to xyz
# -------------------------------------------------------------------
def read_star_catalog(catalog):
stars = []
lcount = 0
skipped = 0
catalog_file = open(catalog,'r')
for line in catalog_file:
lcount += 1 # count lines
# ---- strip '\r\n' characters from the end of the line
line = line.rstrip('\r\n')
# ---- get galactic lat/lon and convert to float
lon = line[90:96].strip()
lat = line[96:102].strip()
if not lon or not lat:
skipped += 1
continue
x,glon = ui.is_float(lon)
if not x:
catalog_file.close()
print()
print(f'unknow longitude value ({lon}) in record {i}')
print()
sys.exit()
x,glat = ui.is_float(lat)
if not x:
catalog_file.close()
print()
print(f'unknow latitude value ({lat}) in record {i}')
print()
sys.exit()
# ---- double,multiple-star code
code = line[43]
if code == ' ':
code = ''
# ---- convert galactic lat/lon to xyz coordinates
x,y,z = lat_lon_to_xyz(glat,glon)
stars.append((x,y,z,code))
# ---- limit the number of stars for testing
##if lcount > 10:
## break
# ---- return stars
catalog_file.close()
print()
print(f'{lcount:5} stars read from file')
print(f'{skipped:5} stars skipped')
return stars
# -------------------------------------------------------------------
# ---- main
# -------------------------------------------------------------------
if __name__ == '__main__':
# ---- python3?
if not ui.running_python3():
print()
print('Must run Python3 - exit program')
print()
sys.exit()
# ---- get a list of stars from the catalog
stars = read_star_catalog(star_catalog)
# ---- create window
win = gr.GraphWin("Star Map",win_width,win_height)
win.setBackground("white")
# ---- draw axes
ax.draw_xy_axes(win,True)
# ---- draw the stars
draw_stars(win,stars)
# ---- end of program
ui.pause()
win.close()