[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]