This is LorenzViewPart.m in view mode; [Download] [Up]
//This code is the work of Booker C. Bense (benseb@next.sdsc.edu)
// You are free to change/distribute this code provided this notice
// remains intact in all versions.
#import "LorenzViewPart.h"
#import "Thinker.h"
#import <appkit/NXImage.h>
#import <appkit/Panel.h> // for NXRunAlertPanel()
#import <dpsclient/wraps.h>
#import <libc.h>
#import <math.h>
@implementation LorenzView
- oneStep
{
float xx,yy,zz,ctheta,stheta,cphi,sphi;
float mouse_x,mouse_y;
// Cycle indices
p=n;
points[0] = n;
// points[0] is never actually used other than as a start point in
// this loop
for( i = 1 ; i < CHASERS ; i++ )
{
points[i] = (NUMPOINTS/(CHASERS)+points[i-1])%(NUMPOINTS);
}
n=(n+1)%(NUMPOINTS);
// take an euler step
xdot = S * (Y - X);
ydot = (R * X) - Y - (X * Z);
zdot = (X * Y) - (B * Z);
X = X + xdot * delta_T;
Y = Y + ydot * delta_T;
Z = Z + zdot * delta_T;
// Draw the black stuff
PSsetrgbcolor(0.0,0.0,0.0);
PSmoveto(xc[n], yc[n]);
PSlineto(xc[n], yc[n]);
PSstroke();
//find out where the mouse is.
PScurrentmouse(winNum,&mouse_x,&mouse_y);
theta = (mouse_y/ury)*2.0*PI;
phi = (mouse_x/urx)*2.0*PI;
ctheta = cos(theta);
cphi = cos(phi);
stheta = sin(theta);
sphi = sin(phi);
//Convert to screen coordinates Update
xx = (( X - Xmin)/ Xrange) - 0.5;
yy = (( Y - Ymin )/ Yrange) -0.5;
zz = (( Z - Zmin )/ Zrange) -0.5;
xc[n] = (xx*cphi + zz*sphi)* urx + midx;
yc[n] = (ctheta*yy+stheta*zz )*ury + midy ;
if ( [self shouldDrawColor ] )
{
red_shift = (CHASERS*4)/3;
blue_shift = (CHASERS*2)/3;
clut = cl_clut;
}
else
{
red_shift = 0;
blue_shift = 0;
clut = twobit_clut;
}
for ( i = 1; i < CHASERS ; i++)
{
PSsetrgbcolor(clut[(i+red_shift)%CHASERS],clut[i],clut[(i+blue_shift)%CHASERS]);
PSmoveto(xc[points[i]], yc[points[i]]);
PSlineto(xc[points[i]], yc[points[i]]);
PSstroke();
}
// Draw the White stuff
PSsetrgbcolor(1.0, 1.0, 1.0);
PSmoveto(xc[n], yc[n]); PSlineto(xc[n], yc[n]);
PSstroke();
return self;
}
- initFrame:(NXRect *)frameRect
{
[super initFrame:frameRect];
[self newSize];
winNum=[[self window] windowNum];
return self;
}
- sizeTo:(NXCoord)width :(NXCoord)height
{
[super sizeTo:width :height];
[self newSize];
return self;
}
- newSize
{
urx=bounds.size.width;
ury=bounds.size.height;
midx=urx/2;
midy=ury/2;
n = 0;
// t = 0;
// Starting points
#ifdef ROTATE
X[0] = 0.1;
Y[0] = 0.1;
Z[0] = 0.1;
#else
X = 0.1;
Y = 0.1;
Z = 0.1;
#endif
for(i=0; i< NUMPOINTS; i++)
{
xc[i] = midx;
yc[i] = midy;
}
//this will probably look really ugly in color ????
for(i=0; i < CHASERS ; i++ )
{ cos_arg = ((float)i)/((float)CHASERS)*PI;
cl_clut[i] = (cos(cos_arg)+1.0)/2.0;
twobit_clut[i] = (float)(i%4)/3.0;
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.