Determining the intersections of a line segment and grid
I suggest using a simple iterative method.
Let's first find the places where it crosses a vertical grid lines.  These are places where the line goes through a point $(x,y)$ where $x$ is an integer.  The points $(x,y)$ on the line can be written in the form
$$(x,y) = (x_0,y_0) + t (x_1-x_0,y_1-y_0),$$
where $(x_0,y_0),(x_1,y_1)$ are the two endpoints of the line and $t \in [0,1]$ is a free variable.  Now this point crosses a vertical grid line if $x$ is an integer, i.e., if $x_0 + t(x_1-x_0)$ is an integer.  This has solutions of the form $t = (i - x_0)/(x_1-x_0)$, where $i$ is an integer with $x_0 \le i \le x_1$.
Therefore, to find all places where the line crosses a vertical grid line, you can iterative over $i$ in the range $\lceil x_0 \rceil,\dots,\lfloor x_1 \rfloor$, and for each such $i$, compute $t = (i - x_0)/(x_1-x_0)$ and then compute the point $(x,y) = (x_0,y_0) + t (x_1-x_0,y_1-y_0)$.  This enumerates all such points on the line.
You can repeat the same for places where the line crosses a horizontal grid line, i.e., where $y$ is an integer.  You can then merge these two sequences, sorting them by increasing value of $t$ (note that no sort operation is needed as the list of horizontal crossings and the list of vertical crossings are both already sorted; you just need to merge these two sorted lists).
The running time is linear in the number of such points.  This is asymptotically optimal; obviously any algorithm to output all such points must take at least $O(1)$ time per point, so needs to take at least linear time.
This does not have problems with accumulation of floating point errors, as far as I can see.  I don't see how this would cause missed or double crossings.  I find it elegant, though of course that is a matter of personal taste.