PRB: Circle Aspect Ratio Unaffected by User-Defined ScaleMode
ID: Q129893
|
The information in this article applies to:
-
Microsoft Visual Basic Standard, Professional, and Enterprise Editions, 16-bit and 32-bit, for Windows, version 4.0
-
Microsoft Visual Basic Standard and Professional Editions for Windows, version 3.0
SYMPTOMS
Lines (using the line method) drawn inside of a circle (using the Circle
method) may have different aspect ratios. Therefore, lines that should have
been an exact radius may be longer or shorter than the radius of the drawn
circle.
CAUSE
The Circle method always draws a perfect circle. It measures the radius in
the X direction. User-defined ScaleModes may have a defined unit in the X
direction that is not equal to the defined unit in the Y direction. This
causes the line lengths to be changed based on the User-defined
Scalemode, but it does not affect the circle.
RESOLUTION
This is not a problem with Visual Basic. The circle always draws a perfect
circle. It measures the radius in the X direction. The line method draws
the segments the correct length in both directions. To fix this issue, you
have to scale the Y coordinate or pick a better user-defined coordinate
system where units in the X and Y directions are equivalent. The following
shows the correct way to handle ScaleMode.
Replace the code shown in the "Steps to Reproduce Behavior" section of this
article with this code:
Sub Form_Click ()
Dim X As Integer, Y As Integer, N As Integer
N = 5
X = 0
Y = 0
yscale = Form1.ScaleWidth / Form1.ScaleHeight 'added:
Form1.ScaleMode = 0
Form1.ScaleHeight = -3
Form1.ScaleWidth = 3
Form1.ScaleLeft = -1.5
Form1.ScaleTop = 1.5
Circle (x, y), 1, QBColor(n)
Line (x, y)-(1, 0), QBColor(n)
Line (x, y)-(0, 1 * yscale), QBColor(n) 'modified: added * yscale
Line (x, y)-(-1, 0), QBColor(n)
Line (x, y)-(0, -1 * yscale), QBColor(n) 'modified: added * yscale
End Sub
STATUS
This behavior is by design.
MORE INFORMATIONSteps to Reproduce Behavior
- Start a new project in Visual Basic. Form1 is created by default.
- Add two Command buttons (Command1 and Command2) to Form1.
- Add the following code to the Click events for the command buttons:
Sub Command1_Click ()
Form1.ScaleMode = 5 'Inches
Form1.ScaleLeft = 0
Form1.ScaleTop = 0
Dim N As Integer, X As Integer, Y As Integer
N = 5
X = 1
Y = 1
Circle (x, y), 1, QBColor(n)
Line (x, y)-(2, 1), QBColor(n)
Line (x, y)-(1, 2), QBColor(n)
Line (x, y)-(-2, 1), QBColor(n)
Line (x, y)-(1, -2), QBColor(n)
End Sub
Sub Command2_Click()
'** Note: depending on what screen resolution you are running
'the aspect ratio difference may differ. At 1024x768 resolution,
'the 2nd and 4th Line statement generate lines which go outside
'of the circle).
Dim N As Integer, X As Integer, Y As Integer
N = 5
X = 0
Y = 0
Form1.ScaleMode = 0 'User
Form1.ScaleHeight = -3
Form1.ScaleWidth = 3
Form1.ScaleLeft = -1.5
Form1.ScaleTop = 1.5
Circle (x, y), 1, QBColor(n)
Line (x, y)-(1, 0), QBColor(n)
Line (x, y)-(0, 1), QBColor(n) '** line 2
Line (x, y)-(-1, 0), QBColor(n)
Line (x, y)-(0, -1), QBColor(n) '** line 4
End Sub
- Start the program by choosing Start from the Run menu or by pressing
the F5 key.
- Click the Command1 button. Then click the Command2 button. Note that the
lines in the circle generated by the Command1 click event exactly equal
the radius, but the lines in the circle generated by the Command2 click
event do not.
Additional query words:
4.00 vb4win vb4all
Keywords :
Version : WINDOWS:3.0,4.0
Platform : WINDOWS
Issue type :
|