This is Krinkle.m in view mode; [Download] [Up]
// Krinkle.m --
#import "math.h"
#import <appkit/NXBitmapImageRep.h>
#import "Krinkle.h"
@implementation Krinkle
long random(),
force();
#define YMAX 200
#define XMAX 320
#define YMAX1 50
#define XMAX1 50
#define SCALE 256
#define LSCALE 8
#define SCmax 32767
#define SCmin -32768
typedef char char_image[YMAX1][XMAX1];
Krinkle *Self;
- init
{ [super init];
# define FC(x) ((int)((x)*SCALE)) /* all f24.8*/
// user interface:
krinkle = FC(15.);
bump = FC(8.);
spring = FC(2.);
damping = FC(.1);
//damping = 0.1;
agc = 0x10000;
agv = 0;
Xf = &z1; Xt = &z2;
Vf = &v1; Vt = &v2;
return [self Randomize :nil];
}
- Randomize :sender;
{ int i, j;
for (i=0; i<c_yh; i++)
for (j=0; j<c_xw; j++)
z1[i][j] = random() % (10); //?? n?
return self;
}
- (void)compute
{ register int Iold;
register long f, v, p;
register int_image *pXf, *pVf;
int pmax, pmin;
int_image *pXt, *pVt;
int x, y;
int_image *tmp;
screen_image *pS;
Self = self;
pmax = -0xffff; pmin = 0xffff;
for (y=1; y<c_yh-1; y++)
{ pXf = (int_image *)&(*Xf)[y][1];
pXt = (int_image *)&(*Xt)[y][1];
pVf = (int_image *)&(*Vf)[y][1];
pVt = (int_image *)&(*Vt)[y][1];
pS = (screen_image *)&image[y][1];
for (x=1; x<c_xw-1; x++)
{ Iold = (*pXf)[0][0];
f = (force((*pXf)[-1][0],Iold,(*pXf)[1][0])
+ force((*pXf)[0][-1],Iold,(*pXf)[0][1])
- (long)damping * (*pVf)[0][0] ) >>LSCALE;
(*pVt)[0][0] = v = (*pVf)[0][0] + f;
(*pXt)[0][0] = p=(*pXf)[0][0] + (v>>LSCALE);/**/
/* (*pXt)[0][0] = p=((*pXf)[0][0] + v)>>LSCALE;/**/
if (p > SCmax) p = SCmax;
if (p < SCmin) p = SCmin;
if (p > pmax) pmax = p;
if (p < pmin) pmin = p;
// (*pS)[0][0][0] = ((Iold-agv) * agc) >>8;
ADD BACK!!!
pXt = (int_image *)&(*pXt)[0][1];
pXf = (int_image *)&(*pXf)[0][1];
pVt = (int_image *)&(*pVt)[0][1];
pVf = (int_image *)&(*pVf)[0][1];
pS = (screen_image *)&(*pS) [0][1];
} }
agc = 0x10000 / (pmax-pmin+1);
agv = pmin;
tmp = Xf; Xf = Xt; Xt = tmp;
tmp = Vf; Vf = Vt; Vt = tmp;
}
#define randm(x) (( ((int)random()) % (2*x-1) )-x)
#define bumpy(x) (x < -SCALE)? 0:\
(x<0)? -SCALE-x:\
(x==0)? randm(SCALE):\
(x< SCALE)? SCALE-d:\
0
long
force(a,b,c)
register int a, /* lesser index point */
b, /* this index point */
c; /* next index point */
/* all i12.4 */
{ register int d, e;
d = b - a; /* this is the bump that causes all the problems: */
e = c - b;
d = bumpy(d); /*__ |\__*/
e = bumpy(e); /* \| */
return ( Self->krinkle * (a-2*b+c) /* 2'nd derivative */
+ Self->bump * (d - e) /* 1'st derivative */
- Self->spring * b ); /* position */
}
- drawSelf:(const NXRect *)rects :(int)rectCount
{ //k2 = (float)[Healthy2Ill floatValue];
if (bitmap == 0)
{ bitmap = [[NXBitmapImageRep alloc] initData:(unsigned char *)image
pixelsWide :c_xw pixelsHigh :(int)c_yh
bitsPerSample :8 samplesPerPixel :Ncolors
hasAlpha :NO isPlanar :NO
colorSpace:Ncolors>1? NX_RGBColorSpace:NX_OneIsWhiteColorSpace
bytesPerRow :0 bitsPerPixel :0];
[self setOpaque:YES];
[self compute];
[self start :nil];
}
[bitmap drawIn :&bounds];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.