starMap = {
const svg = DOM.svg(width,width);
function toRadians(angle) {
return angle * (Math.PI / 180);
};
var split_stars = stars.split(/\r?\n/);
var all_stars = [];
for (var star of split_stars) {
var newStar = {
'name': star.substring(0,25).trim(),
'heading': rotateIt + parseFloat(star.substring(41,46).trim()),
'ascension': star.substring(47,52).trim(),
'apparent_mag': star.substring(73,78).trim(),
'abs_mag': star.substring(79,84).trim(),
'distance': star.substring(92,97).trim()
}
if (parseFloat(newStar.distance) < 20) {
all_stars.push(newStar)
}
}
var grid_lines = [];
for (var i = 0; i < 360; i+=10) {
grid_lines.push(i + rotateIt);
}
var grid_circles = [5,10,15,20];
var scale_num = 20;
var scale_factor = 2;
var select = d3.select(svg);
select.append('rect')
.attr('x',0).attr('y',0).attr('width',width).attr('height',width)
.attr('fill','black');
// zero point
select.append("line")
.attr('x1',width/2 + 21*scale_num*Math.sin(toRadians(0+rotateIt)))
.attr('y1',width/2 + 21*scale_num*Math.cos(toRadians(0+rotateIt))/scale_factor)
.attr('x2',width/2 + 23*scale_num*Math.sin(toRadians(0+rotateIt)))
.attr('y2',width/2 + 23*scale_num*Math.cos(toRadians(0+rotateIt))/scale_factor)
.attr('stroke','goldenrod')
select.append("line")
.attr('x1',width/2 + 22*scale_num*Math.sin(toRadians(2+rotateIt)))
.attr('y1',width/2 + 22*scale_num*Math.cos(toRadians(2+rotateIt))/scale_factor)
.attr('x2',width/2 + 23*scale_num*Math.sin(toRadians(0+rotateIt)))
.attr('y2',width/2 + 23*scale_num*Math.cos(toRadians(0+rotateIt))/scale_factor)
.attr('stroke','goldenrod')
select.append("line")
.attr('x1',width/2 + 22*scale_num*Math.sin(toRadians(-2+rotateIt)))
.attr('y1',width/2 + 22*scale_num*Math.cos(toRadians(-2+rotateIt))/scale_factor)
.attr('x2',width/2 + 23*scale_num*Math.sin(toRadians(0+rotateIt)))
.attr('y2',width/2 + 23*scale_num*Math.cos(toRadians(0+rotateIt))/scale_factor)
.attr('stroke','goldenrod')
// Radial grid, circles
select.selectAll('ellipse.grid_circle')
.data(grid_circles)
.enter()
.append('ellipse')
.attr('class','grid_circle')
.attr('cx',width/2)
.attr('cy',width/2)
.attr('rx',d => d*scale_num)
.attr('ry',d => d*scale_num/scale_factor)
.attr('fill','none')
.attr('stroke','goldenrod')
// .attr('stroke-dasharray','5,5')
// Radial grid, lines
// select.selectAll('line.grid_lines')
// .data(grid_lines)
// .enter()
// .append('line')
// .attr('class','grid_lines')
// .attr('x1',width/2)
// .attr('y1',width/2)
// .attr('x2',d => width/2 + (50*scale_num)*Math.sin(toRadians(d)))
// .attr('y2',d => width/2 + (50*scale_num)*Math.cos(toRadians(d))/scale_factor)
// .attr('stroke','goldenrod')
// // .attr('stroke-dasharray','5,5')
// stars
// the point math is translate to center, then calculate radius * heading
// radius is distance * abs value of trig math for ascension (cah) times scale
// also fun fact, absolute magnitude big numbers means dimmer
// select.selectAll('circle.star')
// .data(all_stars)
// .enter()
// .append('circle')
// .attr('class','star')
// .attr('cx',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.sin(toRadians(d.heading)))
// .attr('cy',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.cos(toRadians(d.heading)) / scale_factor)
// .attr('r',1)
// .attr('fill','white')
// .attr('stroke','white')
// straight line
// select.selectAll('line.star_line')
// .data(all_stars)
// .enter()
// .append('line')
// .attr('class','star_line')
// .attr('x1',width/2)
// .attr('y1',width/2)
// .attr('x2',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.sin(toRadians(d.heading)))
// .attr('y2',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.cos(toRadians(d.heading)) / scale_factor - (d.distance*scale_num*Math.sin(toRadians(d.ascension))))
// .attr('stroke','blue')
// elevated line
select.selectAll('line.star_elv')
.data(all_stars)
.enter()
.append('line')
.attr('class','star_elv')
.attr('x1',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.sin(toRadians(d.heading)))
.attr('y1',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.cos(toRadians(d.heading)) / scale_factor)
.attr('x2',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.sin(toRadians(d.heading)))
.attr('y2',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.cos(toRadians(d.heading)) / scale_factor - (d.distance*scale_num*Math.sin(toRadians(d.ascension))))
.attr('stroke','goldenrod')
.attr('stroke-width',function(d){
if(Math.sin(toRadians(d.ascension)) > 0) {
return '1'
} else {
return '1'
}
})
.attr('stroke-dasharray',function(d){
if(Math.sin(toRadians(d.ascension)) > 0) {
return 'none'
} else {
return 'none'
}
})
// plane line
select.selectAll('line.star_line_plane')
.data(all_stars)
.enter()
.append('line')
.attr('class','star_line_plane')
.attr('x1',width/2)
.attr('y1',width/2)
.attr('x2',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.sin(toRadians(d.heading)))
.attr('y2',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.cos(toRadians(d.heading)) / scale_factor)
.attr('stroke','goldenrod')
// elevated stars
select.selectAll('circle.star_elv')
.data(all_stars)
.enter()
.append('circle')
.attr('class','star_elv')
.attr('cx',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.sin(toRadians(d.heading)))
.attr('cy',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.cos(toRadians(d.heading)) / scale_factor - (d.distance*scale_num*Math.sin(toRadians(d.ascension)))) // may want to divide by scale factor, not sure
.attr('r',4)
.attr('fill',function(d){
if(Math.sin(toRadians(d.ascension)) > 0) {
return 'blue'
} else {
return 'blue'
}
})
// text
select.selectAll('text.star_name')
.data(all_stars)
.enter()
.append('text')
.attr('class','star_name')
.attr('fill','red')
.attr('x',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.sin(toRadians(d.heading)))
.attr('y',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.cos(toRadians(d.heading)) / scale_factor - (d.distance*scale_num*Math.sin(toRadians(d.ascension))))
.text(d => d.name)
select.selectAll('text.star_dist')
.data(all_stars)
.enter()
.append('text')
.attr('class','star_dist')
.attr('fill','orange')
.attr('x',d => width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.sin(toRadians(d.heading)))
.attr('y',d => 16 + width/2 + (d.distance*Math.abs(Math.cos(toRadians(d.ascension)))*scale_num) * Math.cos(toRadians(d.heading)) / scale_factor - (d.distance*scale_num*Math.sin(toRadians(d.ascension))))
.text(d => parseFloat(d.distance).toFixed(1) + ' LY')
// Sol
select.append("circle")
.attr('cx',width/2)
.attr('cy',width/2)
.attr('r',8)
.attr('fill','blue')
return svg;
}