Concept
Having taken MVC last semester, as with many others, spherical coordinates are still stuck in my head. Since my last week’s assignment was space themed, I wished to stick with it for a bit longer. With the inspiration from this p5js sketch and the help of this video, I was able to understand how to plot points using the three axes in p5js. As there are few things to be plotted on the globe compared to the standard map, I decided to concern this project with meteorite landings.
I downloaded my CSV file from the NASA website and cleaned it up in Microsoft Excel such that it contained only the relevant rows, mass, latitude, and longitude. Furthermore, I removed the rows with blank cells so that they do not take up more space than needed.
function preload() { meteors = loadTable("M_New.csv", "csv"); }
After plotting the points I was left with the following sketch:
https://editor.p5js.org/ajlasacic/full/yxr9xvKC4
Note: The program is very demanding so I posted only the link in order not to crash the website. By changing the step variable, more landings can be seen.
Challenges
The most challenging part was understanding where the latitude and longitude are supposed to be pasted. Since they were given in degrees in the CSV file, I put the angleMode() to DEGREES. Unfortunately, this plotted the points only on one side of the globe, which took some time to understand why. After reverting back to normal parameters, the points were plotted just right.
let mass = meteors.getColumn(0); let lat = meteors.getColumn(1); let lng = meteors.getColumn(2); for (let i = 2; i < n; i += step) { let lat_ = lat[i]; let lng_ = lng[i]; strokeWeight(map(mass[i], 0, upper_mass_size, 0.7, 5)); if (flag == true) { stroke(map(mass[i], 0, upper_mass_color, 120, 30), 100, 90); } else { stroke(255); } let z = r * cos(lat_); let y = r * sin(lat_) * sin(lng_); let x = r * sin(lat_) * cos(lng_); point(x, y, z); }
Another challenge was understanding how to map the size of the magnitude of the meteors on the map. By using the MIN and MAX functions in Excel, I extracted the smallest and biggest values within the dataset and set them as the values of their respective variables. By using the map() function (considerably the best function in p5js), I was able to set different sizes to the points within the sketch. By trial and error method, I was able to conclude 0.7 and 5 were perfect
strokeWeight(map(mass[i], 0, upper_mass_size, 0.7, 5));
Although the meteors in the dataset are quite similar in mass, slight differences can be seen on the graph. Lastly, I wished to create the sphere more interactive by changing colors. The colors were also added using the map() function, but I was stuck on how to change them when the mouse was pressed. By adding a global boolean flag variable, I was able to overcome this issue and change the color by setting its value to true or false.
Reflection
Although I am not quite satisfied with this project, I am grateful that I could achieve its main purpose which was plotting in 3d. I tried adding texture to the sphere to show the countries, but the picture did properly wrap no matter how much I edited it. In the future, I wish to make the plot more readable by adding either country outlines or an earth texture. Overall, I am pleased that I know how to plot in 3d using p5js.