Converting+graphics+coordinates

//by Richard Russell, January 2007//

If your program outputs its graphics using only BBC BASIC graphics statements then all the coordinates need to be supplied in BBC BASIC units, that is (0,0) is at the bottom left-hand corner of the graphics viewport and each pixel corresponds to //two// graphics units. Positive X is to the right and positive Y is upwards, as is conventional for graphs.

If your program outputs its graphics using only Windows API (GDI) functions then all the coordinates need to be supplied in Windows units, that is (0,0) is at the top left-hand corner of your window's **client area** and each pixel corresponds to to one unit. Positive X is to the right and positive Y is //downwards//.

If you mix BBC BASIC graphics statements with Windows API functions then you will need to convert between these coordinate systems. The procedures below perform the conversion taking into account the current window size and graphics origin:

code format="bb4w" DEF PROCconvertBBCtoGDI(RETURN X%,RETURN Y%) X%=(X%+@vdu%!0)DIV2:Y%=@vdu%!212-1-(Y%+@vdu%!4)DIV2 ENDPROC

DEF PROCconvertGDItoBBC(RETURN X%,RETURN Y%) X%=X%*2-@vdu%!0:Y%=(@vdu%!212-1-Y%)*2-@vdu%!4 ENDPROC code For consistent results you should ensure that the BBC BASIC graphics coordinates (and the ORIGIN coordinates) are //even// numbers.

An alternative approach to converting BBC BASIC units to Windows units, if you don't mind moving the current 'graphics position', is as follows:

code format="bb4w" MOVE xBBC%,yBBC% xGDI% = @vdu.l.x%     yGDI% = @vdu.l.y% code

Note that these routines are appropriate for use with GDI functions which take integer (pixel) coordinates. They should not be used with **GDI Plus** antialiased graphics, which can take non-integer coordinates. The [|GDIPLIB library] contains its own conversion routine from BBC BASIC coordinates to Windows coordinates.