Eric Lippert wrote an excellent series on generating line-of-sight in C# with Shadow CastingShadow Casting on a rectangular planar grid..
Amongst other issues, Eric dealt with various questions that must be answered about the line-of-sight requirements, which give different results, and gives examples of a couple of different results. One of the articles deals in depth with a "looking around the corner" circumstance which occurred in an early version of his algorithm.
I have adapted Eric's algorithm to a hexagonal grid here, and successfully used it on large hexagonal grids (> 400 x 700) with an extensive visibility radius (> 60 hexes). This implementation calculates and displays complete field-of-view as fast as I can blink, using a single i7 CPU. This is certainly fast enough for any uses I expect to put it to.
Line-of-sight with elevation:
The hex-grid implementation linked to above calculates line-of-sight with elevation, not just obstacles. The documentation notes also discuss an additional decision which must be made in regards to the elevation calculations: The target height and observer height. The default selection is to make both equal, which creates symmetric field-of-view, but ground-to-ground and observer-eyes to ground can alsealso be selected. (The code is Open Source under MIT LicenceLicense)