This is GloveView.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "GloveView.h"
#import <math.h>
#import <dpsclient/psops.h>
#import <dpsclient/wraps.h>
void convertToScreen( double x, double y, double z, double *newX, double *newY);
void PS3Dlineto( double x, double y, double z);
void PS3Dmoveto( double x, double y, double z);
void PS4Dlineto( double x, double y, double z, double theta);
void PS4Dmoveto( double x, double y, double z, double theta);
@implementation GloveView
+ newFrame: (const NXRect *) frameRect
{
self = [super newFrame: frameRect];
x = y = z = 0.0;
length = 15;
width = 15.0;
height = 6.0;
return self;
}
void convertToScreen( double x, double y, double z, double *newX, double *newY)
{
// *newX = x;
// *newY = y;
*newX = x - z * cos( M_PI / 4.0 );
*newY = y - z * sin( M_PI / 4.0 );
#ifdef DEBUG2
fprintf(stderr,"Converting from %2f, %2f, %2f to %2f %2f.\n",
x, y, z, *newX, *newY );
#endif
return;
}
void PS3Dlineto( double x, double y, double z)
{
double newX, newY;
convertToScreen( x, y , z, &newX, &newY);
PSlineto( newX, newY);
return;
}
void PS3Dmoveto( double x, double y, double z)
{
double newX, newY;
convertToScreen( x, y , z, &newX, &newY);
PSmoveto( newX, newY);
return;
}
void PS4Dlineto( double x, double y, double z, double theta)
{
double newX, newY;
convertToScreen( x * cos( theta) + x * sin(theta),
y * cos(theta) - y * sin(theta),
z, &newX, &newY);
PSlineto( newX, newY);
return;
}
void PS4Dmoveto( double x, double y, double z, double theta)
{
double newX, newY;
convertToScreen( x * cos( theta) + x * sin(theta),
y * cos(theta) - y * sin(theta),
z, &newX, &newY);
PSmoveto( newX, newY);
return;
}
- drawSelf: (const NXRect *) rects : (int) rectCount
{
[self lockFocus];
PSsetgray (NX_BLACK);
NXRectFill (&bounds);
PSscale( 1.8, 1.8);
PStranslate( 140.0, 140.0);
PSsetgray( NX_DKGRAY);
PSsetlinewidth( 2.0 );
// Draw Z origin
PSsetgray( NX_DKGRAY);
PS3Dmoveto( 0.0, 0.0, -128.0);
PS3Dlineto( 0.0, 0.0, 0.0 );
PSstroke();
PSsetgray( NX_LTGRAY);
PS3Dmoveto( 0.0, 0.0, 0.0 );
PS3Dlineto( 0.0, 0.0, 128.0 );
PSstroke();
// Draw X origin
PSsetgray( NX_DKGRAY );
PS3Dmoveto( -128.0, 0.0, 0.0 );
PS3Dlineto( 0.0, 0.0, 0.0 );
PSstroke();
PSsetgray( NX_LTGRAY );
PS3Dmoveto( 0.0, 0.0, 0.0 );
PS3Dlineto( 128.0, 0.0, 0.0 );
PSstroke();
// Draw Y origin
PSsetgray( NX_DKGRAY);
PS3Dmoveto( 0.0, -128.0, 0.0 );
PS3Dlineto( 0.0, 0.0, 0.0 );
PSstroke();
PSsetgray( NX_LTGRAY);
PS3Dmoveto( 0.0, 0.0, 0.0 );
PS3Dlineto( 0.0, 128.0, 0.0 );
PSstroke();
[self unlockFocus];
return self;
}
- setX: (int) ax y: (int) ay z: (int) az roll: (int) aroll
{
double dxx, dxy, dyx, dyy, dz, theta;
x = ax;
y = ay;
z = az;
roll = aroll;
[self lockFocus];
PSscale( 1.8, 1.8);
PStranslate( 140.0, 140.0);
PSsetinstance( YES );
PSnewinstance();
// Draw false looking "depth cues"
// X depth cue
PSsetgray( (x > 0) ? NX_WHITE: NX_LTGRAY);
PS3Dmoveto( x, - 2.0, 0.0 );
PS3Dlineto( x, 2.0, 0.0 );
PSstroke();
// Y depth cue
PSsetgray( (y > 0) ? NX_WHITE : NX_LTGRAY);
PS3Dmoveto( -2.0, y, 0.0 );
PS3Dlineto( 2.0, y, 0.0 );
PSstroke();
// Z depth cue
PSsetgray( (z > 0) ? NX_WHITE : NX_LTGRAY);
PS3Dmoveto( 1.4, - 1.4, z );
PS3Dlineto( - 1.4, 1.4, z );
PSstroke();
// Draw "glove"
//
theta = roll * (M_PI / 6);
dxx = (width / 2.0) * cos( theta);
dxy = height * sin(theta);
dyx = - (width / 2.0) * sin(theta);
dyy = height * cos( theta);
dz = length;
PSsetgray( NX_WHITE);
PSsetlinewidth( 1.0 );
PS3Dmoveto( x - dxx, y - dyx, z ); // -1, 0, 0
PS3Dlineto( x + dxx, y + dyx, z ); // 1, 0, 0
PS3Dlineto( x + dxx, y + dyx, z + dz ); // 1, 0, 1
PS3Dlineto( x - dxx, y - dyx, z + dz ); // -1, 0, 1
PS3Dlineto( x - dxx, y - dyx, z ); // -1, 0, 0
PSstroke();
PS3Dmoveto( x -dxx-dxy, y - dyx - dyy, z ); // -1,-1, 0
PS3Dlineto( x +dxx-dxy, y + dyx - dyy, z ); // 1,-1, 0
PS3Dlineto( x +dxx-dxy, y + dyx - dyy, z + dz ); // 1,-1, 1
PS3Dlineto( x -dxx-dxy, y - dyx - dyy, z + dz ); // -1,-1, 1
PS3Dlineto( x -dxx-dxy, y - dyx - dyy, z ); // -1,-1, 0
PSstroke();
PS3Dmoveto( x - dxx, y - dyx, z ); // -1, 0, 0
PS3Dlineto( x -dxx-dxy, y - dyx - dyy, z ); // -1,-1, 0
PS3Dmoveto( x + dxx, y + dyx, z ); // 1, 0, 0
PS3Dlineto( x +dxx-dxy, y + dyx - dyy, z ); // 1,-1, 0
PS3Dmoveto( x + dxx, y + dyx, z + dz ); // 1, 0, 1
PS3Dlineto( x +dxx-dxy, y + dyx - dyy, z + dz ); // 1,-1, 1
PS3Dmoveto( x - dxx, y - dyx, z + dz); // -1, 0, 1
PS3Dlineto( x -dxx-dxy, y - dyx - dyy, z + dz); // -1,-1, 1
PSstroke();
PSsetinstance( NO );
[self unlockFocus];
return self;
}
- setLength: (int) al height: (int) ah width: (int) aw
{
length = al;
height = ah;
width = aw;
[self display];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.