Subtitles section Play video Print subtitles (bell rings) - Hello and welcome to a black hole coding challenge. Time has really slowed down for me, or maybe it's sped up. I can't remember which is which because I'm actually now recording this many days after the actual livestreamed coding challenge. In a little bit, I will change my clothes and travel into the past through the black hole. I don't know how it's all going to work, but you will see me live coding, writing the code to do this simulation. In truth, it's less simulation than visualization. On April 10th, the first ever image of a black hole was published. This image was put together by a team of scientists known at the Event Horizon Telescope. It was compiled from data from many telescopes all over the Earth all synchronized. I looked at this image and I thought, it looks kind of fuzzy and glowy and maybe there's some way I could reproduce this image through a simulation. I started to sort of dig into this. I quickly realized I'm many, many steps away from doing that and I wanted to find the place to start, somewhere where I could at least begin to simulate or visualize the behavior of space time and black holes. Here are the resources that I used to learn about this. First, let me thank Veritasium's video, the how to understand the image of a black hole. This video was actually published the day before the image was revealed, which is really kind of amazing. If you watch this video, the explanation is superb. In particular, there's a short animation in the video that depicted beams of light traveling towards the black hole, some disappearing into the black hole, some wrapping around in an orbit. That's my starting point where I was interested in. I also learned quite a bit from Chris Orbin and the STEM Coding YouTube channel. STEM Coding, if you're not familiar with that YouTube channel, you should definitely check it out. They have a lot of videos about physics and science taught through the lens of coding and visualization. In particular, they have a video called Slingshot with Gravity and Chris Orbun published an article explaining how that code example could be tweaked a little bit to kind of get at some of the ideas around how gravity and black holes. Finally, there's a wonderful paper from 1978. Thank you to Veritasium also for this reference called Image of a Spherical Black Hole with Thin Accretion Disk. This paper has diagrams and the mathematics behind the photon trajectories around a black hole. It gives you a lot of background into what you would want to do to visualize a black hole. Of course, I'm not the first one to try this. Many people have made beautiful visualizations and artistic renderings of black holes. There's the one that you might remember from the move Interstellar. Kip Thorn, a Caltech physicist, was actually an advisor on that film, but there's a lot of artistic license there. I also want to point out to you Ricardo Antonelli who's written this wonderful article How to Draw a Black Hole, Geodesic Raytracing in Curved Space Time. In the article he goes through step-by-step a bunch of different computer graphic tricks and techniques along with the sort of physics of black holes themselves to create a 3D visual of what a black hole might look like. If you've watched me before, you know I am not a physicist, I'm not a scientist. There are many caveats. I don't play a physicist on YouTube. I'm just here wanting to make something in 2D Canvas JavaScript. In fact, I already did it. What I'm here right now, let me talk to you about the pieces that I want to put in this visualization as a sort of reference point for when I start coding. The black hole that I want to visualize is in the galaxy M87. It previously didn't have a name. It was just called M87 star, the star for black hole, but it was recently named Powehi. I'm not sure if I'm pronouncing that correctly, but it is from a Hawaiian chant and it means something like adorn, dark, fathomless creation, something like that. Very appropriate for a black hole. This is what's known as a super massive black hole. Not all black holes are super massive, but this one is and its mass is equivalent to 2.6 billion solar masses, or suns. Take the sun, our sun, the one up in the sky that shines on us, and put together 2.6 billion of those and you have a black hole. It's so massive, we can't see it. Why? Because the gravitational pull is so strong, there's so much matter in there, that any light traveling towards it, once it gets to a certain proximity, can no longer escape. You couldn't be inside the black hole and shine a flashlight. You could be there, but outside the black hole, you couldn't see it 'cause the light can't get out. Of course, you couldn't also be there because you would be dead, very, very dead in the black hole, or you'd just be like Matthew McConaughey, one or the other is true. This little ring here, this distance from the center of black hole at which nothing can escape, not even light, not even the fastest thing we know about light can escape, is known as the event horizon. There's actually a formula for calculating the distance from the center of black hole to that event horizon itself, the Schwarzschild radius, or R sub S. The Schwarzschild radius is calculated as two times G, the universal gravitational constant, times M, the mass of the black hole itself, remember, 2.6 billion solar masses, divided by C squared where C is the speed of light. Of course, the event horizon isn't really a circle. It's a sphere, but for us in our 2D simulation, we're going to make it flat. In order to actually calculate this, I need some of these values. I have the mass, I also need C, the speed of light, which I'm looking over there, I don't have this memorized, which is 299,792,458 meters per seconds squared. That's very, very fast. Not seconds squared. I don't know why I put seconds squared there. It's just meters per second. This number, meters per second. That's the speed of light. I also need G, the universal gravitational constant, which is 6.67 times 10 to the negative 11th power. Now, with these values, with the mass of the black hole, with the universal gravitational constant, with the speed of light, you can actually calculate this. I will leave that to you to calculate and leave your answer in the comments, or you could probably looks it up because people are calculating this stuff all the time. Another element that I want to include in my visualization is the accretion disk. The accretion disk is a whole lot of matter that's outside of the event horizon orbiting the black hole and sort of feeding the black hole. This is a particularly active one. Again, a black hole isn't emptiness. It's we think of it as emptiness. There's just so much matter there that the light cannot escape so it's nothingness. So crazy. The accretion disk is this orbit that's outside of matter orbiting. It has a specific measurement where it is, which is three times the Schwarzschild radius. From the center, one, two, three. You can see not drawn to scale, but this is the accretion disk, three RS. What about light? The accretion disk is full of matter. Matter has mass and it's orbiting at some speed and we could calculate gravitational attraction and all that stuff, but light travels at the speed of light, photons of light travel the speed of light, that speed, and have the mass of zero. It so happens that at 1.5, right around here, at 1.5 times the Schwarzschild radius, this is where light will orbit, but not in a stable orbit. Any photons, any light that's orbiting there will eventually either spiral out forever or spiral in pass the event horizon, never to be seen or heard from again. These are the elements I want in my visualization. I want to depict the black hole right here, really the shadow of the black hole, measured with the event horizon. I want this photon ring, but both the event horizon is really a sphere and this photon ring is really a photon sphere, this is the place where light is orbiting, it's not a stable orbit. It doesn't slow down so it's always eventually going to shoot out or shoot in, but ultimately, if you were standing there, the light would actually draw a circle and you would see the back of your head, which is not what's happening to me right now and I'm trying to think of that. My mind doesn't work that way. I want to depict that and then the accretion disk as well. These are the elements that I want in my visualization. However, I want to animate something. I want to look at what happens when light itself is traveling at the black hole. What does it do? We could be pretty sure that if I take a beam of light, a photon, and point it directly at the center of the black hole, it's going to travel up to the black hole, go past the event horizon, and never come back. We're never going to hear from it again. It sucked into the event horizon. What happens if though there's a beam of light over here, or over here, or over here? What happens there? We can actually see a diagram of this in Ricardo Antonelli's tutorial. This is really the core inspiration for what it is that I want to create in p5.js. What you see here is basically my visualization. There's the black hole, there's the photon ring, here are beams of light, they're bending around, they sort of temporarily end up in that orbit, and then spiral out or spiral in. The thing is, are they really bending, going in a curved path, or are they simply traveling in a straight line through the curve of space time? This is where it would be useful to talk about relativity. The theory of relativity will help to explain why the space time bends around an object, a super massive object. You can think of it as space time being this trampoline and there's a big bowling ball sitting in the center and it's just weighing it down and the space time around it starts to bend and things start to fall in towards it. That's ultimately what's happening with a black hole. The theory of relativity is beyond the scope of what I'm doing in this video. I just want to look at is there a way that I can create the effect. What if I take these beams of light, photons, one starting out pointing directly at the center of the black hole and outwards, how can I look at a way that I could simulate how they would bend around, end up in the photon ring, and then spiral in or spiral out? If you saw the diagram that looks something like this in Veritasium's video, you will also see that there is a radius here, 2.6 times the Schwarzschild radius, there's a distance here from this photon pointed directly at the center outwards at which the light will spiral out as opposed to spiraling in. That is 2.6. In theory, if I were to do all of my math correctly in my visualization, which spoiler alert, I do not, you would see this behavior exactly. The reason why what you're going to watch does not do that is I am simulating sort of this idea with newtonian gravitational attraction. I'm going to approximate the speed of light and these photons will never go faster or never slow down. I don't actually get to that 'til the very end. I kind of fudge that for awhile, but get it a little bit closer, and just use raw gravitational attraction. The coding challenge is about to begin. I'm going to try to program exactly this. You'll see where the code ends up at the end and then I'll come back wearing this shirt again, that's how you'll know how time changed, and I'm going to talk to you a little bit about some things that you might try to account for relativity, to make the behavior of these photons more accurate and I hope that you'll be inspired to make your own visualization of a black hole and share it with me. Let's see, we need some variables. Number one is we need the speed of light. 299, 792, 458, there we go. I don't need the commas because this is code. Now we got the speed of light. Excellent. Things are going very well so far in my coding. Now we need the universal gravitational constant. G, which is 6.67 times power 10 to the negative 11. What could go wrong there? This seems exactly right. Now I need to have my RS, my Schwarzschild radius, which is two times G times. The mass! Now I need a constant. M is the mass. That was 6.5 billion, move two zeroes, some more zeroes, some more zeros. I don't know, how much is the mass of the sun? Mass of the sun. (man laughs) You see the folly here! One folly here is while these numbers are incredibly meaningful and important, they're not going to do me so much good here in my p5.js web editor JavaScript program. What I'm going to do is make up some numbers. We're going to create our own two-dimensional universe that has a speed of light, that has a universal gravitational constant. In fact, rather than put the mass of the black hole right here, I'm going to make a black hole class. Let's just arbitrarily say do something approximating this. The speed of light is 30 and the universal gravitational constant is six, why not right? Also go and make a black hole.js file. Then I'm going to say class black hole and I need a constructor, just an XY. Let me use a P-vector for this. I'm going to say this dot position equals create vector, X comma Y. Now I need a mass. This dot mass equals 6.5. Our measurements are in billions. Then its radius, the Schwarzschild radius, is two times G times this dot mass divided by C times C. I need a little more space here to be able to see more code, but fortunately actually I can do this. Let's put these in parentheses. Now what I can do is I can write show, and what am I going to do? Let's make fill zero, let's fill in the black hole with the color black, let's draw a circle at this dot pos dot X, this dot pos dot Y with the Schwarzschild radius times two. I guess I should might as well pass in an argument here for mass. If I were to in my main program say, let's call it M87, we're going to call our black hole M87, M87 equals a new black hole. I'm going to place it at sort of the top. Actually, the left of my canvas. Let's place it at 100 comma 320 and we're going to give it a mass of, what'd I say, 6.5, and then I'm going to say M87 dot show. We have a black hole. RS is not defined. ♪ This dot ♪ ♪ This dot ♪ ♪ This dot, this dot son ♪ There we go, that fixes that. Where is my black hole? Let's take a look at what this dot RS is. Way too tiny. My units are really kind of all over the place. Let's make some units that make more sense for our pixel space. Let's make the mass of the black hole probably much bigger, 6,500. There we go, look! (bell rings) Thank you! (upbeat jazz music) Goodnight. I have now made my simulation of a black hole. This is the first ever known image of a black hole made in p5.js. Just because I don't have a lot of pixel space to work with right now, let's make the mass a tenth as large. We can see, there's my much smaller black hole. Okay fine. This is looking good to me. That's the size of the black hole that I want. Let's now draw the accretion disk. Let's make some sort of accretion disk. I'm going to say no fill stroke and let's make it kind of grayish. I'm going to draw the accretion disk as a circle. This dot pause dot X, this dot pause dot Y, this dot RS times. This just in from the chat, I forgot about this. I forgot about this. I can say ellipse mode radius, which should now allow me to, let me comment this out, just use the radius as the ellipse. Perfect. Just used the radius value as the size of the circle. Thank you Simon Tiger for that. Great correction. Now I'm going to say this circle is at the radius times three and maybe I will give it a stroke weight of eight. I want no stroke here. Let's make it stroke weight of 24 or 64. Let's give it some alpha. There we go. That's kind of my visualization of the accretion disk. The truth of the matter is, this is not exactly correct 'cause I have a feeling that distance is right here in the center whereas the stroke weight kind of fans out the thickness there. It's a little bit off and I probably should be a little bit more accurate about that. I guess what I could do is just add to the radius itself the half of the stroke weight. If I add 32 there, there we go. I think that's accurate now. Nothing about this is really accurate. Now let's draw the unstable photon orbit. That would be at 1.5 of the radius. I can do the same exact thing, but this time at 1.5. Maybe I want to make that one a little less thick. Give myself a little more space here. Make the 16 and make this 32 and maybe this one should be some kind of color 'cause I'm so good at design. Some kind of orange. It was better before I guess. Some kind of orangeish color. Look at this! We now have the black hole, the accretion disk, and a sort of photon orbit ray. The other thing that I want to do is I want to start a bunch of photons, I want to have them coming from over here towards the black hole. I need to know how far, I can't jump up 'cause my green screen only goes this high, I want to know how far up does it need to be for it to not really curve, but travel in a straight line around the path of the curved path of space and time to end up in an orbit to either spiral out to infinity or end up into the black hole. That we said was 2.6 Schwarzschild radius. What I'm going to do is I am going to create another class. I'm going to call this photon.js. Photon.js will be a photon, make a constructor, this will also have a position, give it an X and a Y, and let's make sure we include it in our HTML file, and let's also write a show function. Let's just make this stroke weight four, point this dot pause dot X, this dot pause dot Y. Let's make this distinctly red just for right now. Now what I could do potentially is let me make an array. I'm going to call it light, maybe just call it photons particles, I'll call it particles, whatever, and I want to say four let Y equal 320, and really this is height divided by two, Y is greater than height divided by two minus, I'm actually going to put these into variables 'cause it'll make more sense. Let's say start is height divided by two, end is height divided by two minus M87's Schwarzschild radius times 2.6. Height divided by two. Actually, I can start it at the end. It's less than start and Y plus equal every 10 pixels. Let's do that, every 10 pixels. What I want to do, particles index I equals a new photon at where? X will be just with minus some amount, with minus 20 comma Y. What's wrong there? I is not defined. I'll just say particles dot push. I can add things to the array with a push function 'cause I'm not using I to iterate. That makes more sense. Here in the draw function, I can say four every photon of particles P dot show. There we go. I have all of my points of light that I want to send out at the speed of light towards the black hole and watch them follow their straight line path through the curved space time thing. Now let me give them a velocity. If I go back into my photon, I'm also going to say this dot velocity equals create vector, traveling at the speed of light in the negative X direction, negative C comma zero. Then I am going to do, not constructor, an update function in which case this dot position dot add, this dot velocity. What I can do now is in sketch.js, is I can say P dot update. Ready? Here we go everybody. There they go! What is the speed of light here? 30. 30 pixels per frame is going to be going quite slowly actually. The frame rate seems slow. 30 pixels per frame, that's not really a nice way to watch an animation so I'm going to include another variable. I'm going to call it DT. This is the delta time step. Even though my frame, my animation frame, goes one at a time, 30 frames per second, maybe I only want to travel ahead a little bit in time. Let's try .1, a tenth. What I need to adjust by that delta T is the photons' velocity. I guess I'm going to make a copy of this. I will just say this dot delta V equals this dot velocity dot copy and then this dot delta, this is a little bit awkward about using P-vector, multiply by DT. Not this dot. I just want a delta V and then multiply that by DT and then add that instead. Now you can see, there we go. There are the photons traveling at the speed of light, but they're not curving, they're not changing. Now we just need to have them bend. We need to have them bend according to the curvature of space time. This is now the moment where it makes sense for me to go read one of those papers and try to look at those formulas, but I'm going to actually see what happens if I just apply newtonian gravitational attraction. I need this photon to basically have a force pointed in the direction of the center of the black hole that it accelerates its velocity towards it, but an interesting side note here and I guess this is an approximation of relativity, is that we can't go faster than the speed of light. We're really only adjusting the direction so the speed is going to remain constant at the speed of light. Again, major caveats to how inaccurate this is, but it's a starting point. I want to add a function. Basically, I want to be able to say I have some sort of force, which is M87 curve, pull, I don't know what to say. I could say attract. I'm just going to say pull as a kind of arbitrary word. Pull that particle. Then I want to say particle apply force that force. This is very similar to how I approach a very basic physics simulation in my nature of code examples. You could refer back to chapters one and two of that book, which is essentially what I've got here. What I need is a function now in the black hole object called pull that expects a photon. First thing I need to calculate this force vector is a vector that points from the particle itself towards the center of the black hole. To make that vector, I'm going to make variable called force, and I'm going to say P5 vector dot subtract, what is it? This dot position, the position of the black hole, minus photon dot position, the position of that particular photon. That's the vector. What I need to calculate the force of gravity according to the newtonian laws of motion is the force of gravity equals the universal gravitational constant, G, times the mass of one object. Guess what? That's this. Times the mass of another object. What's the mass of this? We've got a problem now. The mass of this is, well, zero, but the force isn't zero. This makes kind of no sense. The good news for us is we're going to use this in acceleration. Because we also have force equals mass times acceleration and I want to know the acceleration of this, acceleration equals force divided by mass. This mass will just get divided out. Of course I couldn't divide by zero. This is the essence of why I'm kind of going down the wrong direction here to do this accurately, but it's a starting point. I can just consider this right now. G times the mass of the black hole itself divided by R squared, or the distance between the photon and the black hole, R squared or distance squared. I have that value actually in my code because I have R is the magnitude of the force. Then I could actually calculate that force magnitude, which is the force of gravity equals G times this dot mass divided by R times R. Now I could say force dot set magnitude F of G, photon. Then I can just say this dot velocity add force. Photon dot velocity. Then I just want to add that force to the photon's velocity. P dot apply force is not a function. Actually, I've simplified this. What I can just do is get rid of this whole extra step or returning the vector and I can just do this. (man yelling) Did you see those photons? Let's be able to see this a bit better. We'll see why this is not correct. First, let me do a couple things. One, let me make these variables. Let me draw lines. Let me say stroke zero line from zero start zero end. Sorry. Zero start width start. Let me say stroke weight one. Then let me also do the same for the end. I just want to be able to see where these are. This is showing that spot. Guess what? The photon should always be traveling at the speed of light. I forgot about that so this is a huge hack here. I'm going to say right here when I do that pull in the black hole, I do that pull, I'm going to say photon dot velocity dot set magnitude C. Maybe I should just limit it. Let's just limit it. It could slow down I suppose. (man laughs) It could slow down. Let's just limit it and see what happens. Everything got sucked in! Look at that! The black hole sucked it all in! Couple things. This is good. In other words, this is kind of a nice little simulation in the sense that the force is so strong, even in my very crude simulation, that it's never going to escape. Let's add a little trail here. The photon, I'm going to give it a variable called this dot history. Every time it updates its position, or every time before it updates its position, I'm going to say history dot push this dot pause dot copy. Then also this dot history. Then also let's just say if this dot history dot length is greater than 100, this dot history dot splice, let's just remove the oldest element. Now I can say stroke zero, stroke weight one, begin shape, end shape, no fill, for every vector in history, vertex V dot X, V dot Y. This dot history. Now we're able to see those paths as well as they bend. Again, I don't have it right and we can give ourselves a much longer history here. What I'm going to do here now also is I am going to start some particles from higher than end. I'm just going to start all the way from zero like the top and then let's space them out by a little bit more, and here we go. Nothing escaped. Look at that, nothing escaped my black hole! Again, it's not accurate. I've got this wrong because I'm not taking to account general relativity, which is kind of a thing. It's a thing. I'm visualizing the idea here. What happens if I make the gravitational pull constant smaller? Let's see if we can get anything to escape. There we go. You can see it's there in the photon orbit, but back into the center. We're getting the idea. Do we have something sort of similar to this? (bell rings) I think we do! Change the color to red. Try shrinking the mass. Let's go back and change. You want the color to be red of the photons' paths. I can just take this out. Let's also make this stroke weight a little bit wider so I can see it. Let me give actually give myself much more space here. I'm going to say window width whatever space I have, window height, and let's also make this even less. Full screen, here we go. Here is my black hole simulation. Let's move it over so we can have a little bit more space to work with. 300. There we go. Of course, you can see this should be where they're able to escape, but my simulation is completely off so I should take out those start and end lines and just watch this go. There it is, the curvature of space and time. Center the black hole please. That's actually not a bad idea. I'm also just going to unfortunately take out these lines just 'cause it really shows how incorrect it is. For me to have some plausible deniability here. Let's see what we've got. It's running quite slow because of drawing all these trails. Some things that I could do to make this better, flow faster, number one is in the photon itself, I don't have to add every single spot, I could just say if frame count module is 10 equals zero. (bell rings) This video's not over yet. Thanks to the chat, I think this is actually kind of problematic. The way that I'm doing this is the photons are actually slowing down and they should stay. I shouldn't limit them to the speed of light. I should actually just keep their magnitude at the speed of light. Again, it's sort of inaccurate anyway so what's the difference. I've also added more photons here. You can look at it this way. This is going to be a slightly different result because now I'm locking them at the speed of light. I think there's also a big performance improvement that I can make, which is that once they're sucked into the black hole, I don't need to keep tracking their position and keeping that history going. I should really shut them off as soon as they've been sucked in. Another thing that I can do here is since I have that distance, I can say if R is less than the event horizon, I could remove the photon, just delete it, but I want to still see its path. I think I'll say photon dot stop. That doesn't mean anything, but I can then in the photon class, I can have a variable called stopped equals false and then I can write a function called stop where I say this dot stopped equals true. Then what I can do is I don't want to continue updating it. As long as it's not stopped, I can just freeze its history. I still want to draw it where it last was, but I can freeze its history. Here we go. There's my photons flying at the black hole, space time starts to bend, the photons spin around, and some will get sucked in, some curve, and there we go. (bell rings) I am back a few days later again. Thank you for watching the coding challenge. This is the code that's actually linked in the video's description right here and I've made some further corrections. There's some pretty significant somewhat trivial errors, but errors nonetheless. Number one is in the code that I wrote, this was actually called ER, this dot ER for event horizon, which is not a variable I'm using anywhere. It should actually be RS for Schwarzschild radius. I even had a typo here, photo dot stop instead of photon. Now this is actually stopping the motion of those photons as they enter the event horizon. Now in the simulation, none of them have escaped. Why have none of them escaped? I was actually drawing things the wrong size as well. I didn't realize that ellipse mode, which I love this new function I discovered ellipse mode, which allows me to specify the size of an ellipse by a radius instead of diameter. It doesn't actually work, this is a P5 bug, with the circle function. You'll notice if I just change this to circle, suddenly it's drawing it a different size. I like to use the circle function 'cause it's kind of a nice simple word as opposed to ellipse, but it was actually a mistake. Maybe now that I've put this out there into the universe, this bug has been fixed in P5. Of course the main thing about this simulation that I did in the coding challenge is that it's wildly inaccurate. I am using newtonian gravitational attraction formulas with this very crude physics time step 2D canvas thing. With this, I've actually now drawn a line at this distance, 2.6 Schwarzschild radius, I've drawn a line there and that is the place at which the photon should enter the photon ring orbit and escape outwards. You can see even at that spot right there, this one, comes on in and disappears, you can't really see that, into the black hole itself. In fact, all of these do all the way up to there. None of them make it out. This is inaccurate. Thank you to Chris Orbin from STEM coding who sent me an email over the weekend with some formulas to instead of calculating using newtonian gravitational attraction, you could actually just calculate the angle of velocity for that photon and just set its magnitude to the speed of light. Again, this isn't superbly accurate, but it will draw the paths more accurately than what I did with this just using gravitational attraction. I have that, I will also link this. You can see the formulas here. I might refactor this a bit, but the whole idea is that I just have an angle that's between the current photon's position and the black hole's position. Then I calculate the change in angle based on the relativistic curvature of space time and then adjust the angle based on that change in the angle and then set a new velocity in that way. I'm cheating a little bit 'cause the angle stuff is so strong, it spirals some stuff out that shouldn't so I just give the Schwarzschild radius a little bit of bigger room there to capture the stuff. You'll see now when I run this. This is the one we want to follow. You can see it's right there at that 2.6 measurement. Here it comes, here it comes. That one goes into the photon ring and escapes, it's that one, while this one gets caught inside. I'm not suggesting this is now a scientifically precise simulation of the curvature of space time around a black hole. Once again, this is JavaScript Canvas 2D with P5, but we've gotten something closer there. I will try to include links to the explanation of how these formulas work. I hope to hear from you. How can you play with this? How can you turn this into 3D? What kind of steps might I take next if I wanted to work on this further and actually look more at how that image was actually created itself, or maybe model the accretion disk and how it's sort of bending. I don't know. There's so much more that I could do. I hope you make a version of this. Share with me in your comments. Somebody who knows way more about black holes and science I'm sure will help me out there. I'll see you in a future coding challenge. I'm looking for my train whistle. I'm standing on top of a train that's moving very fast, but you are also and so to you, it looks like we're standing still. Relativity. (train whistle blows) (upbeat music)
B1 black hole hole photon black radius accretion Coding Challenge #144: 2D Black Hole Visualization 16 0 林宜悉 posted on 2020/03/27 More Share Save Report Video vocabulary