2D innaccuracy

I am writing some 2D commands, and need to draw pixel-perfect lines, points, and rectangles.

Let’s say the client area is 400x300, and I want to draw a line (0,0,400,0), across the very top of the viewport.

  1. I set glViewport to 0,0,400,300.

  2. I set glOrtho to -200,200,-150,150.

  3. I draw a line ((Ax-200),(300-Ay-150),(Bx-200),(300-By-150)) or ((0-200),(300-0-150),(400-200),(300-0-150)).

The line is one pixel too high, and lies offscreen. If I make a line across the very bottom, it lies right on the bottom edge. What is the correct mathematical change I need to make so that I can draw an arbitrary size window and get pixel-perfect results?


hmmm…This seems to work:

-Add 0.5 to each value.
-Subtract 1.0 from y component.
-Subtract 1.0 from x component (polys only)
-Draw lines both ways, like this, to draw that last pixel:

Instead of this:
glBegin GL_LINES
glvertex2f Ax,Ay
glvertex2f Bx,By

Use this:
glvertex2f Ax,Ay
glvertex2f Bx,By
glvertex2f Ax,Ay