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.