ftp.nice.ch/pub/next/science/mathematics/HippoDraw.2.0.s.tar.gz#/HippoDraw/Hippo.bproj/hippoplotamus/hplotUP.c

This is hplotUP.c in view mode; [Download] [Up]

/*
 * hippowrapsUP.cc -- Graphics end for Hippo histogramming package.
 * $Id: hplotUP.c,v 5.0 1993/08/17 21:56:00 rensing Exp $
 *
 * Copyright (C)  1991  The Board of Trustees of The Leland Stanford
 * Junior University.  All Rights Reserved.
 *
 * Provides the equivalent of:
 * hippowraps.psw - histogramming package postscript wraps. 
 *      by william shipley, at SLAC, august 1990
 *	
 *      modified/maintained by mike gravina.
 *
 * updated to match new psw - Apr 30, 1991 Paul Rensing
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include "hplotUP.h"

const char hippoplotUP_c_rcsid[] = "$Id: hplotUP.c,v 5.0 1993/08/17 21:56:00 rensing Exp $";
const char hippoplotUP_h_rcsid[] = HIPPOPLOTUP_H_RCSID;



#define WIND_SIZE 3120   /* for 4014 terminal */
#define TICKHEIGHT 40
#define LABELPAD 10

static struct {
     float xScale;
     float yScale;
     float xMarg;
     float yMarg;
     float xOrig;
     float yOrig;
     float xMax;
     float yMax;
} data, window;


#define XData(x) ( (int) (((x)-data.xOrig)*data.xScale)+data.xMarg )
#define YData(y) ( (int) (((y)-data.yOrig)*data.yScale)+data.yMarg )

#define XWind(x) ( (int) ((((x)-window.xOrig)*window.xScale)+window.xMarg) )
#define YWind(y) ( (int) ((((y)-window.yOrig)*window.yScale)+window.yMarg) )

static FILE *outfile = stdout;
static FILE stdout_save;


int initDrvr_UP( FILE *file )
{
     outfile = file;
     
     return 0;
}


int initPlot_UP( rectangle *draw, rectangle *margin, rectangle *user)
{
     if (outfile != stdout)
     {
	  memcpy(&stdout_save,stdout,sizeof(FILE));
	  memcpy(stdout,outfile,sizeof(FILE));
     }
     
	  
     openpl();
     
     space(0,0,WIND_SIZE,WIND_SIZE);
     erase();
     
     window.xScale = WIND_SIZE/draw->size.width;
     window.yScale = WIND_SIZE/draw->size.height;
     window.xMarg = 0.0;
     window.yMarg = 0.0;
     window.xOrig = 0.0;
     window.yOrig = 0.0;
     window.xMax = draw->size.width;
     window.yMax = draw->size.height;
          
     data.xScale = margin->size.width/
	  user->size.width*window.xScale;
     data.yScale = margin->size.height/
	  user->size.height*window.yScale;
     data.xMarg = margin->origin.x*window.xScale;
     data.yMarg = margin->origin.y*window.yScale;
     data.xOrig = user->origin.x;
     data.yOrig = user->origin.y;
     data.xMax = user->origin.x + user->size.width;
     data.yMax = user->origin.y + user->size.height;

     return 0;
}

int endPlot_UP(void )
{
     if (outfile != stdout)
     {
	  memcpy(stdout,&stdout_save,sizeof(FILE));
     }
     
     return 0;
}


/*
 * Put text at the specified point
 */
int drawText_UP(char *message, float x, float y, float fontSize,
		float rotation, char xAlign, char yAlign )
{
     int x1 = XWind(x);
     int y1 = YWind(y);
     
     move( x1, y1 );
     
     /*     fontsize( (int) (fontSize*0.62) );*/
     
     if (isupper(xAlign)) xAlign = tolower(xAlign);
     if (isupper(yAlign)) yAlign = tolower(yAlign);
     
     rotate(x1,x1,(int)rotation);	/* first 2 args are junk */
     
     alabel(xAlign,yAlign,message);
     
     rotate(x1,x1,0);
     
     return 0;
}


int drawXTicks_UP(float *x, int nticks, float tickWidth, int side )
{
     int i;
     int tickw = tickWidth*window.xScale;
     int ticklow;
     int x2;
     
     if (side == 0) 
	  ticklow = data.yMarg;
     else
	  ticklow = YData(data.yMax) - tickw;
     
     for (i=0; i<nticks; i++)
     {
	  x2 = XData(x[i]);
	  line(x2, ticklow, x2, ticklow+tickw);
     }
     
     return 0;
}


int drawYTicks_UP( float *y, int nt, float tickwidth, int side )
{
     int i;
     int tickw = tickwidth*window.xScale;
     int ticklow;
     int y1;

     if (side == 0)
	  ticklow = data.xMarg;
     else
	  ticklow = XData(data.xMax)-tickw;
     
     for (i=0; i<nt; i++)
     {
	  y1 = YData(y[i]);
	  line(ticklow, y1, ticklow+tickw, y1);
     }
     
     return 0;
}

int drawMag_UP( float x, float y, int mag, float fontSize )
{
     char str[10];
     
     move( XWind(x), YWind(y) );
     sprintf(str,"x10^%d",mag);
     alabel('l','b',str);
     
     return 0;
}


int drawPoints_UP(float *xy, int npts, int symbol, float ptsize)
{
     int i;
     int x1, y1;
     int sz;
     
     sz = ptsize*window.xScale;
     
     if (sz > 0)
     {
	  for (i=0; i<npts; i++) 
	  {
	       x1 = XData(*xy++);
	       y1 = YData(*xy++);
	       circle( x1, y1, sz/2 );
	  }
     }
     else
     {
	  for (i=0; i<npts; i++) 
	  {
	       x1 = XData(*xy++);
	       y1 = YData(*xy++);
	       point( x1, y1 );
	  }
     }
     
     return 0;
}


int drawLine_UP(float *xy, int npts, linestyle_t ls)
{
     int i;
     int x,y;
     
     switch (ls)
     {
     default:
     case SOLID:
	  linemod("solid");
	  break;
     case DASH:
	  linemod("longdashed");
	  break;
     case DOT:
	  linemod("dotted");
	  break;
     case DOTDASH:
	  linemod("dotdashed");
	  break;
     }
     
     x = XData(*xy++);
     y = YData(*xy++);
     move(x, y );
     
     for ( i=1; i<npts; i++) 
     {	
	  x = XData(*xy++);
	  y = YData(*xy++);
	  cont(x, y );
	  
     }
     
     return 0;
}


int drawYError_UP(float *xy, float *err, int npts)
{
#define CAPWIDTH 10.0
     float halfCapWidth = CAPWIDTH/2.0 / data.xScale;
     int i;
     int y1,y2,x1;
     
     for ( i=0; i<npts; i++) 
     {
	  x1 = XData(*xy++);
	  xy++;
	  
	  y1 = YData(*err++);
	  y2 = YData(*err++);
	  
	  line( x1, y1, x1, y2 );
	  line( x1-halfCapWidth, y1, (x1+halfCapWidth), y1 );
	  line( (x1-halfCapWidth), y2, (x1+halfCapWidth), y2 );
     }
     
     return 0;
}

int drawXError_UP(float *xy, float *err, int npts)
{
     float halfCapWidth = CAPWIDTH/2.0 / data.yScale;
     int i;
     int y1,x2,x1;
     
     for ( i=0; i<npts; i++) 
     {
	  xy++;
	  y1 = XData(*xy++);
	  
	  x1 = YData(*err++);
	  x2 = YData(*err++);
	  
	  line( x1, y1, x2, y1 );
	  line( x1, (y1-halfCapWidth), x1, (y1+halfCapWidth) );
	  line( x2, (y1+halfCapWidth), x2, (y1+halfCapWidth) );
     }
     
     return 0;
}


int drawColor2D_UP(int nXBins, int nYBins, float binMin, float binMax, 
		   float *data, int useColor )
{
     move(WIND_SIZE/2.0,WIND_SIZE/2.0);
     alabel('c','c',"GrayScales Not Implemented");
     return 0;
}

int drawLego2D_UP(display disp)
{
     move(WIND_SIZE/2.0,WIND_SIZE/2.0);
     alabel('c','c',"2D Lego Not Implemented");
     return 0;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.