[Gambas-user] Drawing Area
Doriano Blengino
doriano.blengino at ...1909...
Thu Feb 25 09:49:13 CET 2010
tobiasboe at ...221... ha scritto:
> Dear Mailing-Liste,
> my name is Tobias and I have the following problem:
> The function y=f(x) shall be displayed with the values x_min <= x <= x_max
> in a drawing area (dwg.ClientW = const = 801, dwg.ClientH = const = 601)
> using the methods Draw.Scale and Draw.Translate.
> My questions:
> *What do these methods do?
> *How do I use them to fix my problem?
> Every tip to use these methods or a source to read is welcome - especially
> with examples.
>
The scale() function multiplies the X and Y coordinates for the values
you specify, respectively in the first and second argument. So, if you
issue a line(0,0,100,100), the normal result would be a diagonal line
"\" starting in the upper-left corner of the drawing area, and going to
the right and down. If a scale(2,2) is in effect, then the line will
have the same appearance, but it will extend to (200;200) because every
single coordinate is first multiplied by the scale() values. If these
values are equal, then the aspect ratio is mantained; if these values
are different an anamorphic transformation takes effect; you can use
this to correct some monitor problem...
Note that the computer graphic conventions say that the Y coordinate
gets bigger going down to the screen, which is exactly the contrary in
the normal world. So you can use draw.scale(..., -1) to flip the
graphics in the correct way.
To fit your function in you drawing area, you should use
ScaleX=801/(x_max-x_min), and OffsetX=-x_min:
draw.begin(...)
draw.scale(801/(x_max-x_min), ???)
draw.translate(-x_min, 0?)
blahblahblah (draw.point(), draw.line()...)
draw.end()
Note that draw.translate() takes coordinates which then get scaled by
scale(): this is why you can use "-x_min" in the draw.translate. If you
invert the order of scale() and translate(), then the coordinates passed
to translate() are no more "world" coordinates, but "device" coordinates.
Anyway, I attach a project: play with the controls to see their effect.
Note that in the drawing routine the order is "scale, translate". Try to
invert this order to see the effect.
Last thing to say: drawingareas can work in two modes - cached and not
cached. In cached mode, you draw on them when you want, and they keep
the data, much like normal paper (so you must erase them to change the
contents). The mode I used is not cached, which is more correct in this
case; when the graphic needs to be displayed, it "asks" your code to
paint the area (using an event) - no image is kept in memory and,
besides, it is possible to optimize a few things. To update the image,
you refresh() the drawingarea, which in turn raises the event; this also
happens when you cover the graphic with another window and later you
unveil it.
Hope this introduction can help: ask for more if you are in need.
Regards,
Doriano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: draw-0.0.1.tar.gz
Type: application/gzip
Size: 8250 bytes
Desc: not available
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20100225/f286c74d/attachment.gz>
More information about the User
mailing list