#include "hp2graph.h"
#include "output.h"
#include "format.h"
static double* x; /* x and y values */
static double* y;
static double* py; /* previous y values */
void curvesInit(void)
{
int i;
double sf;
x = (double*) xmalloc(samplesize * sizeof(double));
y = (double*) xmalloc(samplesize * sizeof(double));
py = (double*) xmalloc(samplesize * sizeof(double));
sf = graphwidth / xrange;
for (i = 0; i < samplesize; i++) {
x [ i ] = sampledata[ i ] * sf;
y [ i ] = 0;
py[ i ] = 0;
}
}
/*
* Map virtual x coord to physical x coord
*/
double xpage(double x)
{
return (x + graphx0);
}
/*
* Map virtual y coord to physical y coord
*/
double ypage(double y)
{
return (y + graphy0);
}
static void PlotCurveLeftToRight(double *x, double *y)
{
int i;
output->PathLineTo(xpage(0), ypage(0));
for (i = 0; i < samplesize; i++)
output->PathLineTo(xpage(x[i]), ypage(y[i]));
}
static void PlotCurveRightToLeft(double *x, double *y)
{
int i;
for (i = samplesize - 1; i >= 0; i-- )
output->PathLineTo(xpage(x[i]), ypage(y[i]));
output->PathLineTo(xpage(0), ypage(0));
}
/*
* Save the curve coordinates stored in y[] in py[].
*/
static void SaveCurve(double* y, double* py)
{
int i;
for (i = 0; i < samplesize; i++)
py[i] = y[i];
}
static void TopCurve(double* y, double* py)
{
int i;
double m = 0.0;
for (i = 0; i < samplesize; i++)
m = max(m,y[i]);
for (i = 0; i < samplesize; i++)
y[i] = py[i] = m;
}
static void ShadeCurve(int no, double *x, double *y, double *py)
{
output->PathNew(Closed,2*samplesize);
output->PathFill(no);
output->PathWidth(0.1);
output->PathMoveTo(xpage(x[0]), ypage(py[0]));
PlotCurveLeftToRight(x, py);
output->PathLineTo(xpage(x[samplesize - 1]), ypage(y[samplesize - 1]));
PlotCurveRightToLeft(x, y);
output->PathStroke();
if (showExploded)
TopCurve(y, py);
else
SaveCurve(y, py);
}
/*
* Curve() -- Draw a curve, and fill the area that is below it and above
* the previous curve.
*/
static void Curve(int no,Entry *ep)
{
Value *vp;
double sf = graphheight / yrange;
for (vp = ep->value; vp; vp = vp->next)
y[vp->census] += sf*(double)vp->size;
ShadeCurve(no,x, y, py);
}
/*
* Draw vertical line at sample points
*/
static void SampleLine(double x, double y1, double y2)
{
outputLineTo(xpage(x),ypage(y1),xpage(x),ypage(y2));
}
void Samples(void)
{
int i;
for (i = 0; i < samplesize; i++) {
SampleLine(x[i],py[i],graphheight);
}
}
void curves(void)
{
int i;
for (i = entrysize-1; i>=0; i--) {
Curve(i,entrydata[i]);
}
if (showSample) Samples();
}
/******************/
void comments(void)
{
int i;
double m;
for (i = 0; i < commentsize; i++) {
m = (commentdata[i].time / xrange) * graphwidth;
SampleLine(m,0.0,graphheight);
output->Text(JustifyVertical,xpage(m),ypage(0.0)+graphheight,SCALE_FONT,commentdata[i].comment);
}
}
void marks(void)
{
int i;
double m;
for (i = 0; i < marksize; i++) {
m = ((double)markdata[i] / xrange) * graphwidth;
/* Possible bugfix for the line above if the x-axis does not start at 0 */
/* m = ((double)(markdata[i] - sampledata[0]) / xrange) * graphwidth; */
outputCaret(xpage(m), ypage(0.0), 4.0);
}
}
|