Modern technology like GPS satellites allow us to map out the Earth and navigate with incredible precision. They appear to remove the need for constellations and star maps. However, these ancient methods remain a crucial part of human history. Aside from being breeding grounds for human creativity and connection, they continue to serve as useful astronomical tools for celestial navigation. This project explores the uniqueness of each night sky and how different perspectives can completely change the view.
Introduction
Introduction
Using stars was one of the earliest methods of navigation used by sailors while away from land. It works by taking the North Star as the fixed north point and using the paths of other stars across the sky as reference points. Ancient groups realized the stars followed predictable patterns with their rising and setting and noted formations that guided them in the required directions. The formations often had imaginative mythological roots, further creating tools to pass down moral stories. By analyzing these patterns they were able to use them as reliable guides without requiring land to serve as a marker. Based on how far up the North Star is from the horizon, the latitudes can be obtained. From here, the paths of other stars and constellations need to be used.
Unfortunately for any human space explorers, the positions of stars in our sky are based entirely on their angle from Earth. The moment the reference frame is shifted, the angles between stars change drastically and the night sky transforms into something completely different making our current constellations irrelevant. Thankfully, modern astronomy allows us to know more specific coordinates of stars and thus, alter them to match different perspectives as is done here in this project. Using the abundant star data in the Wolfram Knowledgebase, I mapped out the night sky as if I was an alien on a distant stellar system. I applied these to a few different stars and identified the similarities and differences between my star maps and traditional star maps.
Data Cleaning
Data Cleaning
Import and clean stars dataset:
starDataLookup=Withstars=PrependEntityList[EntityClass["Star",{"AbsoluteMagnitude"LessThan[3]}]],,DeleteCases[AssociationThread[stars,EntityValue[stars,{"HelioCoordinates","DistanceFromSun","AbsoluteMagnitude"},"NonMissingPropertyAssociation"]],<||>|_?(Sort[Keys[#]]=!=Sort[{"HelioCoordinates","DistanceFromSun","AbsoluteMagnitude"}]&)];
The first problem to tackle was managing the large amounts of data available on an equally enormous number of stars.
To speed up the process, I used HelioCoordinates instead of the popular AstroPosition. HelioCoordinates aligns with the Earth’s ecliptic plane instead of the Galactic Cartesian frame’s alignment with the Milky Way’s disk. AstroPosition provides more sophisticated, but for this project unnecessary, data. This switch greatly improved the run time while not creating any problems as the reference planes are being switched either way.
Despite this switch, the data still had to be restricted in some capacity to limit the number of stars. This is where I decided to restrict by brightness of the star. Here only brighter stars with an absolute magnitude less than 3 were chosen to tend the charted stars towards the brighter end on the whole.
The data also had to be further cleaned to ensure only stars with no missing relevant values were selected.
To speed up the process, I used HelioCoordinates instead of the popular AstroPosition. HelioCoordinates aligns with the Earth’s ecliptic plane instead of the Galactic Cartesian frame’s alignment with the Milky Way’s disk. AstroPosition provides more sophisticated, but for this project unnecessary, data. This switch greatly improved the run time while not creating any problems as the reference planes are being switched either way.
Despite this switch, the data still had to be restricted in some capacity to limit the number of stars. This is where I decided to restrict by brightness of the star. Here only brighter stars with an absolute magnitude less than 3 were chosen to tend the charted stars towards the brighter end on the whole.
The data also had to be further cleaned to ensure only stars with no missing relevant values were selected.
As seen below, each star now has all the required data in the nested association.
In[]:=
starDataLookup[[1;;2]]
Out[]=
HelioCoordinates,,,DistanceFromSun,AbsoluteMagnitude4.8,HelioCoordinates,,,DistanceFromSun,AbsoluteMagnitude3.00
Calling the data for each star is quite simple and similar to if it was still an entity. For example:
In[]:=
starDataLookup["HelioCoordinates"]
Out[]=
,,
Before moving to visualizing the sky from other stars, I had to first model the space around us. Below is a simple 3D model with the stars plotted as points. We lie at the origin.
Obtains and plots the HelioCoordinate values for each star after separately plotting the Sun as the first.
ListPointPlot3D{{Values[starDataLookup][[1,"HelioCoordinates"]]},Values[starDataLookup][[2;;,"HelioCoordinates"]]},
Out[]=
From this plot, an important point is instantly identified. A lot of stars seem clustered in the center, showing that a large number of the data stored is for stars closer to our Sun. As the reference frames shift further away, this could potentially lead to only faint stars being seen in their respective star maps.
Alien Star Maps
Alien Star Maps
Before beginning, I started to find a few different stars to set as the observing stars (OS). An easy metric to go off of was looking at our Sun’s visibility from the distance of the OS. The table below summarizes the apparent magnitude of our sun from varying parsecs.
Distance Range | Apparent Magnitude | Visibility | Interpretation |
< 1 pc (~3.26 ly) | -1 to +2 | Extremely bright | Very prominent "pole star", dominates the sky |
1 – 5 pc | +2 to +5 | Bright naked-eye star | Excellent reference star, easy navigation |
5 – 10 pc | +5 to +6.5 | Faint but visible naked-eye star | Still usable as a pole star on dark nights |
10 – 20 pc | +6.5 to +8 | Barely visible | "Marginal; needs binoculars or very dark skies |
20 – 50 pc | +8 to +10 | Not visible to naked eye | "Requires telescope; poor navigation aid |
> 50–100 pc | > +10 | Invisible without large telescope | Effectively useless as a naked-eye reference |
Coordinate Transform
Coordinate Transform
The function below transforms the position, distance and apparent magnitude values to orient from the OS instead of our Sun. I used basic vector subtraction to change the reference frame for all the coordinates. I then found the magnitude of the vector to obtain the new distance of each star from the OS. With this value I used the distance modulus formula used to calculate apparent brightness to obtain the apparent brightness from the OS. The final step simply updates the starDataLookup to select stars within the visible magnitude from the OS instead of the original Earth.
In[]:=
translateToObserverWith[observerCoords_,lookup_]:=MapWith{vector=#["HelioCoordinates"]-observerCoords},{distance=Norm[vector]},<|"ObserverCoordinates"->vector,"DistanceFromObserver"->distance,"ApparentMagnitudeFromObserver"->#["AbsoluteMagnitude"]+5*Log10|>&,lookup
QuantityMagnitude[UnitConvert[distance,"Parsecs"]]
10
In[]:=
ClearAll[translateToObserver]translateToObserver[observer_Entity,lookup_Association]:=Module[{observerCoords=lookup[observer,"HelioCoordinates"],updateStarLookup},updateStarLookup=translateToObserverWith[observerCoords,lookup];KeySelect[updateStarLookup,updateStarLookup[#]["ApparentMagnitudeFromObserver"]<6.5||#===Entity["Star","Sun"]&]]
Now that the function is defined, any star can be input as the OS.
Perspective From Sirius
Perspective From Sirius
The first star I picked was Sirius. It is the brightest star in our sky and lies only 2.64pc away.
In[]:=
siriusLookup=translateToObserver,starDataLookup;
When the new coordinates are plotted the stars around Sirius can be visualized instead and a clear difference can be seen. There are also fewer stars visible as the apparent magnitude has been restricted. This means that all the stars seen in the plot would also be visible to the naked eye on Sirius.
ListPointPlot3D{{Values[siriusLookup][[1,"ObserverCoordinates"]]},Values[siriusLookup][[2;;,"ObserverCoordinates"]]},
Out[]=
Perspective from Theta 1 Orionis E
Perspective from Theta 1 Orionis E
The same can be done for other, farther stars. An interesting example is Theta 1 Orionis E which lies 392pc away. Our Sun can be seen as the yellow point peeking out from the other stars.
Axes Alignment
Axes Alignment
This function alignToSun aligns the axes so the Sun is directly on the Z-axis from the observing star and then creates the unit vectors.
The next step is to align all the stars to a new axis. For my project I chose to align the z axis with the Sun. This means that our Sun is at the north pole of the OS the way Polaris is at our north pole. The basis of this decision was the lack of information about the rotational axes of stars available. While scientists have obtained impressive amounts of rotational measurements on stars, the large majority of stars do not have this information available. Consequently, the star maps all work on the assumption that the rotational axis of the OS points directly at the Sun, placing it at the celestial north. Fortunately, this does not alter the constellations themselves as the star groupings and relative distance remains the same. Although, it does change which ones are visible at any given point and hence alters what the sky “looks like” at a glance.
To do this the function simply sets the z-axis as the normalized sun vector. Once this is done, it creates a temporary vector that is not parallel so it can take the cross product. This cross product vector would be perpendicular to both vectors. The final yDir takes the cross product of the x-axis and z-axis to once again create an axis perpendicular to both those axes as a normal coordinate system should be.
To do this the function simply sets the z-axis as the normalized sun vector. Once this is done, it creates a temporary vector that is not parallel so it can take the cross product. This cross product vector would be perpendicular to both vectors. The final yDir takes the cross product of the x-axis and z-axis to once again create an axis perpendicular to both those axes as a normal coordinate system should be.
2D Projection
2D Projection
From this, the formula for resizing the points can be derived
The size still had to be further restricted to ensure no points were too big or too small. To do this, the logarithmically scaled values were once again rescaled to sit between 0.0025 and 0.01 and saved in sizes.
Uses the formula to scale the sizes and maps the Rescale function across all the values in the original logarithmically scaled sizes.
The last step before mapping was to create some labels for my stars. I selected only the brightest to label and created a graphic that can be overlaid on any graph.
This function essentially makes the same graphic as with the upcoming 2D projection, however, instead of making the graphic with points, it offsets and outputs the labels.
Now comes the actual 2D projection, which the function below creates . It starts by selecting only stars with a positive z coordinate so only the stars in the northern hemisphere are included. Once again, as previously mentioned, the “north” of the star was decided arbitrarily to point at our Sun. Thus, the selected northern hemisphere of the OS is equally dependent on this assumption. It then goes to perform a zenithal projection by first calculating the values for polar coordinates {r,θ}.I then converted these to altered Cartesian coordinate and used Graph[] to create the plot . To resize the points according to brightness I overlaid a Graphic.
Ensuring the stars remain plotted as a graph and not just a graphic was an important feature to maintain. This difference means that the stars can be connected in the next step for the making of the constellations.
This function makes 3 key output components. It creates polar coordinates and then the polarFrame as the backdrop, the starGraph to maintain the Graph head for the star points and pointGraphics for the stylistic components.
This projection can be applied to any star as well. The following are some examples.
Perspective From Sirius
Perspective From Sirius
Calling the functions to align the previously transformed Sirius coordinates to the Sun and then create the projections.
Perspective from Theta 1 Orionis E
Perspective from Theta 1 Orionis E
Calling the functions to align the previously transformed Theta 1 Orionis E coordinates to the Sun and then create the projections .
As seen above, Orionis E’s star map exhibits a belt of stars similar to the visible milky way belt in our own night sky.
Constellation Creation
Constellation Creation
Once the stars were mapped from the OS, it was time to actually start making the constellations. Historically constellations have been made with very intentional groupings to form shapes. However, they tend to cluster together nearby bright stars in clear, short paths inadvertently. Due to this, for this project I chose to find clustered stars that were close to each other and then join them by the shortest paths between the composing individual stars to create pseudo-constellations that could realistically be grouped by any residents of the OS.
To do this, I used NearestNeighbourGraph and FindSpanningTree. As seen below, the NearestNeighbourGraph connects each star to its closest stars, hence creating a network.
I then split it up based on these networks to apply FindSpanningTree . This function finds the shortest paths to connect all the points in the input graph instead of just connecting to the closest stars. This creates the constellation lines . This also eliminates the intersections between edges from multiple points which are rarely seen in our real constellation maps.
First creates a 2D projection similar to before, then finds clusters in a NearestNeighbourGraph and creates the spanning tree.
Below are the constellations for the same stars. Despite not searching explicitly for more recognizable shapes in the stars, the graphical construction of constellations has given rise to patterns similar to those one would see on traditional Earth star maps.
Perspective From Sirius
Perspective From Sirius
An example plot without the constellations but labelled stars instead. I labeled the brightest stars with an apparent magnitude of less than 0.5 from the OS in the first plot. An interesting observation here is the alphanumeric names for most stars. These represent modern day stars that were not given ancient names due to not being brighter from Earth. This is a clear demonstration of the shift in perspective: as I moved further away, the stars that were brighter from the OS became stars that were not bright enough to be initially observed from Earth.
Calling the constellation function for Sirius
Perspective from Theta 1 Orionis E
Perspective from Theta 1 Orionis E
Calling the constellation function for Theta 1 Orionis E
Future Directions
Future Directions
A clear limitation with this project is the bias towards stars closer to us. Even with all measures taken while data cleaning, the database itself simply contains more information on stars closer to us. This means that the only way to truly remove this bias is to simply collect more data to expand the database to further stars.
A few more short term improvements would be to be more purposeful with making the constellations. Instead of simply grouping the stars by the shortest path, I could create an algorithm to pick a few existing constellations or historically common shapes to find in the star groupings. I could also explore other projections aside from zenithal to analyze the difference between them. Lastly, since constellations have great navigational benefits, it is likely that there are certain areas of the universe where alien explorers are more likely to get lost. It would be interesting to explore such areas with fewer stars or less obvious and constant constellations.
A few more short term improvements would be to be more purposeful with making the constellations. Instead of simply grouping the stars by the shortest path, I could create an algorithm to pick a few existing constellations or historically common shapes to find in the star groupings. I could also explore other projections aside from zenithal to analyze the difference between them. Lastly, since constellations have great navigational benefits, it is likely that there are certain areas of the universe where alien explorers are more likely to get lost. It would be interesting to explore such areas with fewer stars or less obvious and constant constellations.
Conclusion
Conclusion
Throughout this project I got an in-depth look at constellations and star maps. Using vector subtraction, I built functions to transform the coordinates of stars to new reference frames from set OSs. I then continued by setting our Sun as the north star for each OS by aligning the Sun along the z-axis and transforming all other coordinates. Finally, I created 2D zenithal projections and found clusters and spanning tree graphs to create constellations from that. Through this, I demonstrated the large variation in the orientation of stars from different perspectives. The project also revealed the biases human data has to closer celestial objects but nevertheless opens up new prospects for analysis in this manner.
Acknowledgements
Acknowledgements
I would like to thank my mentor Joseph Brennan for his invaluable guidance in terms of both the concepts and navigating Wolfram Language. I would also like to thank the TAs who helped throughout the program. Last but certainly not least, I thank the directors Rory Foulger, Eryn Gillam, Megan Davis and Cyrus Taylor along with Stephen Wolfram, without whom this entire program would not be possible.
Additional thanks to Stephen Wolfram for suggesting this project.
References
References
CITE THIS NOTEBOOK
CITE THIS NOTEBOOK
Charting alien skies
by Grace Tijo
Wolfram Community, STAFF PICKS, July 9, 2026
https://community.wolfram.com/groups/-/m/t/3751895
by Grace Tijo
Wolfram Community, STAFF PICKS, July 9, 2026
https://community.wolfram.com/groups/-/m/t/3751895