This is BezierORShape.m in view mode; [Download] [Up]
#import "BezierORShape.h" #define NU 13 #define F .5522847 static const float coeff[NU][2] = { { 1, 0 }, { 1, F }, { F, 1 }, { 0, 1 }, {-F, 1 }, {-1, F }, {-1, 0 }, {-1,-F }, {-F,-1 }, { 0,-1 }, { F,-1 }, { 1,-F }, { 1, 0} }; static const char eveEnd[] = "} ;\nendShape\n"; static void calculateMesh(const NSPoint *points,int npoints, RtPoint *mesh, RtBound boundingBox, float *r1,float *z1,float *r2,float *z2) { int u, v; float a = 1.0,x,y; for(v = 0; v < npoints; v++){ if(ABS(points[v].x) > a) a = ABS(points[v].x); if(ABS(points[v].y) > a) a = ABS(points[v].y); } boundingBox[0] = 1.0; boundingBox[1] = 1.0; boundingBox[2] = 1.0; boundingBox[3] = 1.0; boundingBox[4] = 1.0; boundingBox[5] = 1.0; for(v = 0; v < npoints; v++){ x = points[v].x / a; y = points[v].y / a; for(u = 0; u < NU; u++){ mesh[v * NU + u][0] = x * coeff[u][0]; mesh[v * NU + u][1] = x * coeff[u][1]; mesh[v * NU + u][2] = y; } if(x > boundingBox[1]){ boundingBox[0] = -x; boundingBox[1] = x; boundingBox[2] = -x; boundingBox[3] = x; } if(y > boundingBox[5]){ boundingBox[5] = y; *r1 = x; *z1 = y; } if(y < boundingBox[4]){ boundingBox[4] = y; *r2 = x; *z2 = y; } } } @implementation BezierORShape + shapeWithPoints:(const NSPoint *)thePoints :(int)theN { return [[[self alloc] initWithPoints:thePoints :theN] autorelease]; } - initWithPoints:(const NSPoint *)thePoints :(int)theN { [super init]; mesh = NSZoneMalloc([self zone], sizeof(RtPoint) * theN * NU); calculateMesh(thePoints, theN, mesh, boundingBox,&r1,&z1,&r2,&z2); numberOfPoints = theN; return self; } - (void)dealloc { NSZoneFree([self zone],mesh); return [super dealloc]; } - (NSData *)eveData { char buffer[500]; int u,v; NSMutableData *resultData; sprintf(buffer,"\tPatchMesh bicubic %d nonperiodic %d nonperiodic {P} { \n", NU, numberOfPoints); resultData = [NSMutableData dataWithBytes:buffer length:strlen(buffer)]; for(v = 0; v < numberOfPoints; v++) for(u = 0; u < NU; u++){ sprintf(buffer,"\t\t%f %f %f\n", mesh[v * NU + u][0], mesh[v * NU + u][1],mesh[v * NU + u][2]); [resultData appendBytes:buffer length:strlen(buffer)]; } [resultData appendBytes:eveEnd length:strlen(eveEnd)]; return resultData; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.