KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q31160: POINT(0) and POINT(1) Problem after VIEW and WINDOW

Article: Q31160
Product(s): See article
Version(s): 4.00 4.00b
Operating System(s): MS-DOS
Keyword(s): ENDUSER | buglist4.00 buglist4.00b fixlist4.50 B_BasicCom | mspl13_basic
Last Modified: 11-DEC-1989

After a VIEW statement, the graphics functions POINT(0) and POINT(1)
do not yield the expected results if a previous WINDOW statement has
been executed with its x1 (minimum x) argument set to a number that is
not an integral multiple of 0.5.

For example, after executing a statement such as WINDOW
(0.7,12.0)-(0.0,12.0) in any graphics screen mode, the coordinates
returned by the POINT() functions will be relative to the upper-left
corner of the screen, rather than to the viewport, as expected. This
problem is dependent upon only the x1 argument; none of the other
argument values cause this problem. The problem occurs both in the
QB.EXE editor and in compiled EXE programs.

Microsoft has confirmed this to be a problem in QuickBASIC Versions
4.00 and 4.00b, and in Microsoft BASIC Compiler Version 6.00
(buglist6.00) and the QB.EXE mode of Version 6.00b for MS-DOS and OS/2
(buglist6.00b).

This problem was corrected in QuickBASIC Version 4.50 (both compiled
and QB.EXE) and under compiled mode of Microsoft BASIC Compiler
Version 6.00b (fixlist6.00b).

This problem does not exist in QuickBASIC Version 3.00.

The POINT() function works correctly for x1 values that are integral
multiples of 0.5.

To recreate the problem, do the following:

1. Set up a viewport in the center of the screen.

2. Draw a box around the viewport.

3. Define a logical coordinate system using any x and y values.

4. Draw a line to the center of the viewport.

5. Use POINT() functions to get the current physical coordinates.

The following code demonstrates the problem:

SCREEN 9
PXMIN = 200
PXMAX = 400
PYMIN = 100
PYMAX = 200
VIEW (PXMIN, PYMIN)-(PXMAX, PYMAX)
LINE (0, 0)-(PXMAX - PXMIN, PYMAX - PYMIN), , B

XMIN = -.37   '<---(MULTIPLES OF 0.5 HERE YIELD CORRECT RESULTS)
XMAX = 1    '      (OTHER REAL NUMBERS  GIVE DIFFERENT RESULTS)
YMIN = 0
YMAX = 1
WINDOW (XMIN, YMIN)-(XMAX, YMAX)

X = (XMIN + XMAX) / 2
Y = (YMIN + YMAX) / 2
LINE (XMIN, YMIN)-(X, Y)

X = POINT(0)
Y = POINT(1)
LOCATE 20, 25: PRINT "POINT(0)="; X; " POINT(1)="; Y;
LOCATE 21, 25: PRINT "CORRECT = 100            50"

Given the source code above, the following is a workaround for this
problem, using the POINT (2) and POINT(3) functions in place of the
POINT(0) and POINT(1) functions:

X = (POINT(2) - XMIN) * (PXMAX - PXMIN) / (XMAX - XMIN)
Y = (POINT(3) - YMIN) * (PYMAX - PYMIN) / (YMAX - YMIN)
LOCATE 22, 11: PRINT "(WORK AROUND) POINT(0)="; X; " POINT(1)="; Y;

DO: LOOP UNTIL INKEY$ <> ""
SCREEN 0
END

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.