speed improvements

master
Pablo Gonzalez 2021-01-29 13:25:34 +01:00
parent fa0b2c7d08
commit 96c75058a3
2 changed files with 42 additions and 35 deletions

View File

@ -8,4 +8,12 @@ Plan is to show also constellations, but this is work in progress. Now it shows
I think code is quite optimized already. It runs as fast as I could make it run. If someone has some ideas to speed it up, I could plot more stars.
Basic equations to compute declination and right ascension for stars where taken from this [github repo](https://github.com/Michi83/planetarium).
Basic equations to compute declination and right ascension for stars where taken from this [github repo](https://github.com/Michi83/planetarium). Thanks!
## How to use
The planetarium plots the stars as if you are looking to the sky (with your watch screen pointing downwards). This means, if you have the watch in your wrist, you have to look south to see the stars matching. If you want to look north, just take out the watch from your wrist and make a 180º turn.
## Improvements
I plan to add more constellations as soon as I have time. I am adding the constellations that I know of, but the plan is to add all the main ones (at least for North Hemisphere).
Please note that the watch hardware is limited and computing the stars positions is a quite intensive task for this little processor. This is why it plots only stars and no planets or the moon. For plotting the planets, storage will be a limiting factor as well as computing the position for planets needs more initial data compared with stars.

View File

@ -46,7 +46,6 @@ function drawStars(lat,lon,date){
storage = require('Storage');
f=storage.read("planetarium.data.csv","r");
linestart=0;
g.clear();
//Common calculations based only on time
@ -59,42 +58,42 @@ function drawStars(lat,lon,date){
let starNumber = 0;
var starPositions = {};
for (i=0;i<f.length;i++)
{
if (f[i]=='\n'){
starNumber++;
//console.log("Line from "+linestart.toString()+"to "+(i-1).toString());
line = f.substr(linestart,i-linestart);
//console.log(line);
linestart = i+1;
//Process the star
starInfo = line.split(',');
//console.log(starInfo[0]);
starRA = parseFloat(starInfo[0]);
starDE = parseFloat(starInfo[1]);
starMag = parseFloat(starInfo[2]);
//var start = new Date().getTime();
var dec = Math.asin(Math.sin(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) + Math.cos(theta) * Math.sin(starDE));
var ascen = Math.atan2(Math.cos(starDE) * Math.sin(starRA + zeta), Math.cos(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) - Math.sin(theta) * Math.sin(starDE)) + z;
var H = siderealTime(julianDay) - longitude - ascen;
//Compute altitude
var alt = Math.asin(Math.sin(latitude) * Math.sin(dec) + Math.cos(latitude) * Math.cos(dec) * Math.cos(H));
if(alt >= 0)
{
//Compute azimuth
var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude));
var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi);
var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi);
starPositions[starNumber] = [x,y];
var magnitude = starMag<1.5?2:1;
g.fillCircle(x, y, magnitude);
if (starMag<1 && settings.starnames)
g.drawString(starInfo[3],x,y+2);
g.flip();
var line,linestart = 0;
lineend = f.indexOf("\n");
while (lineend>=0) {
line = f.substring(linestart,lineend);
starNumber++;
//console.log(line);
//Process the star
starInfo = line.split(',');
//console.log(starInfo[0]);
starRA = parseFloat(starInfo[0]);
starDE = parseFloat(starInfo[1]);
starMag = parseFloat(starInfo[2]);
//var start = new Date().getTime();
var dec = Math.asin(Math.sin(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) + Math.cos(theta) * Math.sin(starDE));
var ascen = Math.atan2(Math.cos(starDE) * Math.sin(starRA + zeta), Math.cos(theta) * Math.cos(starDE) * Math.cos(starRA + zeta) - Math.sin(theta) * Math.sin(starDE)) + z;
var H = siderealTime(julianDay) - longitude - ascen;
//Compute altitude
var alt = Math.asin(Math.sin(latitude) * Math.sin(dec) + Math.cos(latitude) * Math.cos(dec) * Math.cos(H));
if(alt >= 0)
{
//Compute azimuth
var azi = Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(latitude) - Math.tan(dec) * Math.cos(latitude));
var x = size / 2 + size / 2 * Math.cos(alt) * Math.sin(azi);
var y = size / 2 + size / 2 * Math.cos(alt) * Math.cos(azi);
starPositions[starNumber] = [x,y];
var magnitude = starMag<1.5?2:1;
g.fillCircle(x, y, magnitude);
if (starMag<1 && settings.starnames)
g.drawString(starInfo[3],x,y+2);
g.flip();
}
}
linestart = lineend+1;
lineend = f.indexOf("\n",linestart);
}
if (settings.constellations){
//Each star has a number (the position on the file (line number)). These are the lines