I don't have any links for this, but the basic idea is as follows.

Your data is defined on a regular grid of points, p(i,j) say, but some of the points in that grid are inside obstructions or are part of the boundary.

You want to advance the value of p(i,j) to get a new value, p'(i,j) say. The result depends on a 'stencil' of points which will differ for different algorithms, but typically are the following: p(i,j), p(i+1,j), p(i-1,j), p(i,j+1), p(i,j-1). The problem is that some of those points may lie inside the boundaries/obstacles, which means you don't have data for them.

The trick is to fill in the data at the unknown points by 'reflecting' the data at the known points. For example, if you've got data for point p(i,j) but point p(i+1,j) is inside the boundary, then you construct the data at p(i+1,j) by imagining that there's a mirror midway between it and p(i,j). If your data represents something like density or wave height then you'd just set p(i+1,j) equal to p(i,j). If it represents a vector quantity such as velocity then you'd need to negate one of its components (so that the velocity in that component is zero exactly at the mirror).

(This approach is cheating a little in that it assumes that the boundaries/obstacles are always aligned with the x- or y-axes, so that if you drew them they would look pixelated. For non-academic applications that's probably a sensible simplification though.)

I suspect that that wasn't a great explanation. Hopefully someone will be able to provide a link to a better one!

Simon