This is PlotView.m in view mode; [Download] [Up]
/* Program By Fred Richards, Copyright 1990. */
/* */
/* This software is provided free of charge */
/* and without warranty. The source code may */
/* be distributed freely provided this copyright */
/* notice remains in tact. */
#import "PlotView.h"
#import "Plot.h"
#define SQRT3 1.73205
@implementation PlotView
- setPlotParam:anObject
{
plotParam = anObject;
return self;
}
- initPlot:sender
{
PSsetlinewidth(0.0);
[self setPointSize];
[self setDrawColor:NX_BLACK];
[self clear:sender];
PSrectclip([plotParam xmin:self]-(pointSize.x/100.0),
[plotParam ymin:self]-(pointSize.y/100.0),
[plotParam xmax:self]-[plotParam xmin:self]+(pointSize.x/50.0),
[plotParam ymax:self]-[plotParam ymin:self]+(pointSize.y/50.0));
return self;
}
- clear:sender
{
NXEraseRect(&bounds);
return self;
}
// Draw lines between all the data points given
- drawLines:sender
{
int i,
count = [sender dSize];
NXPoint *data = [sender data];
/* Buffer this so that a single path can */
/* contain up to 512 points. */
PSnewpath();
PSmoveto(data[0].x, data[0].y);
for (i = 1; i < count; i++) {
if ((i % 512) == 0) {
PSstroke();
PSnewpath();
PSmoveto(data[i-1].x, data[i-1].y);
}
PSlineto(data[i].x, data[i].y);
}
PSstroke();
return self;
}
- drawPoints:sender
{
int i,
count = [sender dSize];
NXPoint *data = [sender data];
for (i = 0; i < count; i++)
[self dotAt:data[i]];
return self;
}
- drawCrosses:sender
{
int i,
count = [sender dSize];
NXPoint *data = [sender data];
for (i = 0; i < count; i++)
[self crossAt:data[i]];
return self;
}
- drawXs:sender
{
int i,
count = [sender dSize];
NXPoint *data = [sender data];
for (i = 0; i < count; i++)
[self xAt:data[i]];
return self;
}
- drawBoxes:sender
{
int i,
count = [sender dSize];
NXPoint *data = [sender data];
for (i = 0; i < count; i++)
[self boxAt:data[i]];
return self;
}
- drawTriangles:sender
{
int i,
count = [sender dSize];
NXPoint *data = [sender data];
for (i = 0; i < count; i++)
[self triangleAt:data[i]];
return self;
}
- setDrawColor:(float )color;
{
PSsetgray(color);
return self;
}
- setPointSize
{
pointSize.x = bounds.size.width / 50.0;
pointSize.y = bounds.size.height / 50.0;
pointOffset.x = pointSize.x/2.0;
pointOffset.y = pointSize.y/2.0;
return self;
}
- dotAt:(NXPoint )place
{
PSnewpath();
PSmoveto(place.x, place.y);
PSlineto(place.x, place.y);
PSstroke();
return self;
}
- crossAt:(NXPoint )place
{
PSnewpath();
PSmoveto(place.x-pointOffset.x, place.y);
PSrlineto(pointSize.x, 0.0);
PSmoveto(place.x, place.y-pointOffset.y);
PSrlineto(0.0, pointSize.y);
PSstroke();
return self;
}
- xAt:(NXPoint )place
{
PSnewpath();
PSmoveto(place.x-pointOffset.x, place.y-pointOffset.y);
PSrlineto(pointSize.x, pointSize.y);
PSrmoveto(-pointSize.x, 0.0);
PSrlineto(pointSize.x, -pointSize.y);
PSstroke();
return self;
}
- boxAt:(NXPoint )place
{
PSnewpath();
PSmoveto(place.x-pointOffset.x, place.y-pointOffset.y);
PSrlineto(pointSize.x, 0.0);
PSrlineto(0.0, pointSize.y);
PSrlineto(-pointSize.x, 0.0);
PSclosepath();
PSstroke();
return self;
}
- triangleAt:(NXPoint )place
{
PSnewpath();
PSmoveto(place.x-pointOffset.x, place.y-(pointOffset.y/SQRT3));
PSrlineto(pointSize.x, 0.0);
PSrlineto(-pointOffset.x, pointSize.y);
PSclosepath();
PSstroke();
return self;
}
- border
{
PSnewpath();
PSsetgray(NX_BLACK);
PSsetlinewidth(0.0);
PSmoveto([plotParam xmin:self], [plotParam ymin:self]);
PSlineto([plotParam xmax:self], [plotParam ymin:self]);
PSlineto([plotParam xmax:self], [plotParam ymax:self]);
PSlineto([plotParam xmin:self], [plotParam ymax:self]);
PSclosepath();
PSstroke();
return self;
}
- axes
{
PSnewpath();
PSsetgray(NX_BLACK);
PSsetlinewidth(0.0);
PSmoveto([plotParam xmin:self], 0.0);
PSlineto([plotParam xmax:self], 0.0);
PSmoveto(0.0, [plotParam ymin:self]);
PSlineto(0.0, [plotParam ymax:self]);
PSstroke();
return self;
}
- drawSelf:(const NXRect *)rects :(int )rectCount
{
if (![plotParam data])
return self;
[self initPlot:self];
if ([plotParam border:self])
[self border];
if ([plotParam axes:self])
[self axes];
[[self window] flushWindow];
if ([plotParam lines:self])
[self drawLines:plotParam];
switch ([plotParam style:self]) {
case 0:
if (![plotParam lines:self])
[self drawPoints:plotParam];
break;
case 1:
[self drawCrosses:plotParam];
break;
case 2:
[self drawXs:plotParam];
break;
case 3:
[self drawBoxes:plotParam];
break;
case 4:
[self drawTriangles:plotParam];
break;
}
return self;
}
- savePSCode:(char *)aFile
{
NXStream *psStream;
psStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
if (!psStream) {
return self;
}
[self getBounds:&bounds];
[self copyPSCodeInside:&bounds to:psStream];
NXFlush(psStream);
NXSaveToFile(psStream, aFile);
NXCloseMemory(psStream, NX_FREEBUFFER);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.