ftp.nice.ch/pub/next/tools/screen/backspace/old/Lorenz.N.bs.tar.gz#/Lorenz/LorenzViewPart.m

This is LorenzViewPart.m in view mode; [Download] [Up]

#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
{
  // 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   
#ifdef ROTATE     
  xdot = S * (Y[p] - X[p]);
  ydot = (R * X[p]) - Y[p] - (X[p] * Z[p]);
  zdot = (X[p] * Y[p]) - (B * Z[p]);
  X[n] = X[p] + xdot * delta_T;
  Y[n] = Y[p] + ydot * delta_T;
  Z[n] = Z[p] + zdot * delta_T;
#else
  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;

#endif

  // Draw the black stuff 

  PSsetrgbcolor(0.0,0.0,0.0);
  PSmoveto(xc[n], yc[n]);
  PSlineto(xc[n], yc[n]);
  PSstroke();

  //Convert to screen coordinates Update
#ifdef ROTATE
  xc[n] = (( X[n] - Xmin)/ Xrange )* urx; 
  yc[n] = (( Y[n] - Ymin )/ Yrange )* ury;
#else
  xc[n] = (( X - Xmin)/ Xrange )* urx; 
  yc[n] = (( Y - Ymin )/ Yrange )* ury;
#endif

  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];
	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.