[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{
From: yliu@morgan.ucs.mun.ca (Yuan Liu)
: I have a question for drawing a graphic. I have a set of data.
: I want to read these data and plot them in the XY axes. Does anyone
: know how to caculate the data to fit the X axis. I am using TP 7.0.
When converting from HP Pascal, which provides a nice subset of the
device-independent graphics kernal and allows plotting in the virtual world
(so the window and viewport can be set in the virtual world), I wrote
several procedures to simulate virtual world plotting. The following is
part of a unit Plotbase I created.
The function you needed is set_window; the boolean pagefit controls
whether you just want your plot to fit in the whole window or there's a concern
about the isotropy of the plot. I didn't bother to write a virtual
world set_viewport as I can live without it.
}
UNIT PLOTBASE; {******************* Stored in 'PLOTBASE' ******************}
{* Basic procedures for graphical manipulations. *}
{* Created in 1983. Updated 17/05/94 10:00 a.m. By LIU Yuan *}
{**************************************************************************}
interface USES Graph;
procedure set_window(left, right, up, down: extended; pagefit: boolean);
{Sets a mapping of virtual window on the current viewport;
use isotropic scaling if not pagefit.}
function vToX(x: extended): integer;
function vToY(y: extended): integer;
{Map x, y in the virtual world onto real world}
function XtoV(X: integer): extended;
function YtoV(Y: integer): extended;
{Maps X, Y in the real world onto virtual world}
use isotropic scaling if not pagefit.
procedure vMove(x, y: extended);
{Moves the current position to (x,y) in the virtual world}
procedure vMoveRel(Dx, Dy: extended);
{Moves the current position a relative distance in the virtual world}
procedure vLine(x1, y1, x2, y2: extended);
{Draws a line from (x1,y1) to (x2,y2) in the virtual world}
procedure vLineTo(x, y: extended);
{Draws a line from current position to (x,y) in the virtual world}
function str_width(str: string): extended; {string width in the virtual world}
function str_height(str: string): extended; {string height in the virtual
world}
implementation {************************** PLOTBASE *************************}
var Text: string[20];
xasp, yasp, xbase, ybase: extended;
{convert from virtual world to display}
procedure set_window(left, right, up, down: extended; pagefit: boolean);
{Sets a mapping of virtual window on the current viewport;
use isotropic scaling if not pagefit.
Side effects: xasp, yasp, xbase, ybase.}
var view: ViewPortType;
begin xbase:=left; ybase:=down; right:=right-left; up:=up-down;
GetViewSettings(view);
right:=(view.x2-view.x1)/right;
up:=(view.y2-view.y1)/up;
if pagefit then begin xasp:=right; yasp:=up end
else if right<up then begin yasp:=right; xasp:=right; end
else begin xasp:=up; yasp:=up end
end; {set_window}
function vToX(x: extended): integer;begin vToX:=round((x-xbase)*xasp) end;
{Maps x in the virtual world onto real world}
function vToY(y: extended): integer;begin vToY:=round((y-ybase)*yasp) end;
{Maps x in the virtual world onto real world}
function XtoV(X: integer): extended; begin XtoV:=X/xasp+xbase end; {XtoV}
{Maps X in the real world onto virtual world}
function YtoV(Y: integer): extended; begin YtoV:=Y/yasp+ybase end; {YtoV}
{Maps Y in the real world onto virtual world}
procedure vMove(x, y: extended);
{Moves the current position to (x,y) in the virtual world}
begin MoveTo(round((x-xbase)*xasp),round((y-ybase)*yasp)) end; {vMove}
procedure vMoveRel(Dx, Dy: extended);
{Moves the current position a relative distance in the virtual world}
begin MoveRel(round(Dx*xasp),round(Dy*yasp)) end; {vMoveRel}
procedure vLine(x1, y1, x2, y2: extended);
{Draws a line from (x1,y1) to (x2,y2) in the virtual world}
begin line(round((x1-xbase)*xasp),round((y1-ybase)*yasp),
round((x2-xbase)*xasp),round((y2-ybase)*yasp)) end; {vLine}
procedure vLineTo(x, y: extended);
{Draws a line from current position to (x,y) in the virtual world}
begin LineTo(round((x-xbase)*xasp),round((y-ybase)*yasp)) end; {vLineTo}
function str_width(str: string): extended; {string width in the virtual world}
begin str_width:=TextWidth(str)/xasp end; {str_width}
function str_height(str: string): extended; {string height in the virtual
world}
begin str_height:=TextHeight(str)/yasp end; {str_height}
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]