This is ART_VektorView.m in view mode; [Download] [Up]
/* ART_VektorView.hm The VectorView is a simple customView object for rough presantation of vectors produced by ART2 for animation. - simple line graph for real arrays - simple 2D plot of the inputarray with grayshading mag - simple bar graph to demonstrate the choice */ #import <appkit/appkit.h> #import <appkit/View.h> #import "ART_VektorView.h" @implementation ART_VektorView:View /* float *points,*merks; int numPoints,numMerks; float bbox[4]; char *ops; float *gshades; float lineGray; float backgroundGray; int vec_mode; int bar_sel; */ - initFrame:(NXRect *)aRect { [super initFrame:aRect]; lineGray = NX_BLACK; backgroundGray = NX_LTGRAY; vec_mode =1; return self; } - free { NXZoneFree([self zone], points); NXZoneFree([self zone], ops); NXZoneFree([self zone], merks); NXZoneFree([self zone], gshades); return [super free]; } // num is numbers of Vec max is the maximum magnitude - setVector:(int)num Vec:(float *)Vec max:(float)max { float *f; int i; char *op; NXZone *zone; int segPoints; vec_mode=1; zone = [self zone]; NXZoneFree(zone, points); NXZoneFree(zone, ops); numPoints = num; points = NXZoneMalloc(zone, 2 * num * sizeof(float)); ops = NXZoneMalloc(zone, num * sizeof(char)); numPoints = 0; segPoints = 0; for (f = points, op = ops, i = 0; i<num; i++ ) { if ( *Vec > max ) { if (segPoints == 1) { *f++ = f[-2]; *f++ = f[-2]; *op++ = dps_lineto; numPoints++; } segPoints = 0; Vec++; } else { *f++ = (float)i; *f++ = *Vec++; if (segPoints == 0) *op++ = dps_moveto; else *op++ = dps_lineto; segPoints++; numPoints++; } } bbox[0] = 0; bbox[2] = num-1; bbox[1] = -0.0001; bbox[3] = max; return self; } // num is numbers of Vec max is the maximum magnitude - setPattern:(float *)Vec row:(int)row col:(int)col { NXRect *f; int r,c; float *gs,maxgray=0.0; NXZone *zone; NXRect rect; vec_mode=0; zone = [self zone]; NXZoneFree(zone, merks); NXZoneFree(zone, gshades); numMerks = row*col; merks = NXZoneMalloc(zone, numMerks * sizeof(NXRect)); gshades = NXZoneMalloc(zone, numMerks * sizeof(float)); f=merks; gs=gshades; for (r=numMerks;r--;) maxgray=( Vec[r]>maxgray) ? Vec[r]:maxgray; maxgray=(maxgray==0.0) ? 1.0:maxgray; rect.size.width=rect.size.height=0.975; for (r=row;r--;) { rect.origin.y=(float)(r); for (c=0;c<col;c++) { rect.origin.x=(float)c; *f++=rect; *gs++=1-*Vec++/maxgray; } } bbox[0] = 0; bbox[2] = col; bbox[1] = 0; bbox[3] = row; return self; } - setBar:(int)num Vec:(float *)Vec max:(float)max select:(int)s { float *f; int i; char *op; NXZone *zone; int segPoints; vec_mode=3; zone = [self zone]; // bar_sel=s; NXZoneFree(zone, points); NXZoneFree(zone, ops); numPoints = 2*num; points = NXZoneMalloc(zone, 4 * num * sizeof(float)); ops = NXZoneMalloc(zone, 2*num * sizeof(char)); numPoints = 0; segPoints = 0; for (f = points, op = ops, i = 0; i<num; i++ ) { *f++ = (float)i; *f++ = 0.0; *op++ = dps_moveto; *f++ = (float)i; *f++ = *Vec++; *op++ = dps_lineto; } bbox[0] = 0; bbox[2] = num+1; bbox[1] = -0.0001; bbox[3] = max; return self; } - sizeTo:(NXCoord)width :(NXCoord)height { NXPoint center; center.x = NX_X(&bounds) + NX_WIDTH(&bounds) / 2; center.y = NX_Y(&bounds) + NX_HEIGHT(&bounds) / 2; [super sizeTo:width :height]; [self setDrawOrigin:center.x - NX_WIDTH(&bounds) / 2 :center.y - NX_HEIGHT(&bounds) / 2]; [self scaleToFit]; return self; } - scaleToFit { float scaleX,scaleY; float bbWidth = bbox[2] - bbox[0]; float bbHeight = bbox[3] - bbox[1]; if (vec_mode) { scaleY = NX_HEIGHT(&frame) / bbHeight * 0.95; scaleX = NX_WIDTH(&frame) / bbWidth * 0.95; } else { scaleY=scaleX=MIN(NX_HEIGHT(&frame)/bbHeight, NX_WIDTH(&frame)/bbWidth)*0.95; } [self setDrawSize:NX_WIDTH(&frame)/scaleX :NX_HEIGHT(&frame)/scaleY]; [self setDrawOrigin:bbox[0]-(NX_WIDTH(&bounds)-bbWidth)/2 :bbox[1]-(NX_HEIGHT(&bounds)-bbHeight)/2]; return self; } - drawSelf:(const NXRect *)rects :(int)rectCount { int i; NXRect *R; float *gs; switch (vec_mode) { case 1: PSsetgray(backgroundGray); NXRectFill(&bounds); if (points && numPoints > 0) { PSnewpath(); PSsetlinewidth(NXDrawingStatus == NX_DRAWING ? 0.0 : 1.0); PSsetgray(lineGray); if (NXDrawingStatus == NX_DRAWING) /* stroke the userpath */ DPSDoUserPath(points, numPoints * 2, dps_float, ops, numPoints, bbox, dps_ustroke); else /* append the userpath to the current path, but dont stroke yet */ DPSDoUserPath(points, numPoints * 2, dps_float, ops, numPoints, bbox, dps_uappend); } break; case 0: PSsetgray(backgroundGray); NXRectFill(&bounds); if (merks && numMerks > 0) for (i=numMerks,R=merks,gs=gshades;i--;) { PSsetgray(*gs++); NXRectFill(R++); } break; case 2: PSsetgray(backgroundGray); NXRectFill(&bounds); if (points && numPoints > 0) { PSnewpath(); PSsetlinewidth(NXDrawingStatus == NX_DRAWING ? 0.0 : 1.0); PSsetgray(lineGray); if (NXDrawingStatus == NX_DRAWING) /* stroke the userpath */ DPSDoUserPath(points, numPoints * 2, dps_float, ops, numPoints, bbox, dps_ustroke); else /* append the userpath to the current path, but dont stroke yet */ DPSDoUserPath(points, numPoints * 2, dps_float, ops, numPoints, bbox, dps_uappend); } break; } return self; } - setBackgroundGray:(float)gray { backgroundGray = gray; return self; } - setLineGray:(float)gray { lineGray = gray; return self; } - (float)lineGray { return lineGray; } - (float)backgroundGray { return backgroundGray; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.