Line::getX and Line::getY return index when it is determined that every step is going to move forward along their axis.
That would be fine if it was consistent, but at the moment you are using both relative and absolute coordinates. If, as an example, the player is at (2,2) and you draw a line to (2,6), then using getX for each point returns 0, 1, 2, 3 and 4. On the other hand, in this example getY always returns the actual y coordinate of the player, 2. This is a problem because in Body::visionLine you use the sum "line.getY(i) + getLocation().getY()" so you end up drawing at twice the Y value you expect, but you get the expected results when you calculate X.
If you want to observe this for yourself, replace Body::getVision with this simplified version. The only two lines are a working diagonal line, and a broken horizontal line. The diagonal line uses index exclusively, but the horizontal line only uses index for x.
CharRaster Body::getVision(int width, int height)
{
CharRaster vision(width, height);
visionLine(vision, Line(location, location.getX() - getSightRange(), location.getY() - 4));
visionLine(vision, Line(location, location.getX() - getSightRange(), location.getY()));
vision.setCharAttr(getLocation().getX(), getLocation().getY(), getCharAttr(), getSymbol());
return vision;
}