This is LineView.m in view mode; [Download] [Up]
//
// Copyright 1995 (c) Icebox Software Manufactory, Inc. All Rights Reserved.
//
#import "LineView.h"
#define STEPFACTOR ( 12 )
#define BORDER ( 3 )
@implementation LineView
float frandom();
float randBetween(float a, float b);
void moveIt (DPSTimedEntry te, double now, void *self)
{
[(id)self _moveIt];
// do not return a value
}
- _moveIt
{
int index;
// Move the line by moving the point components
// by the value in each delta.
pt1.x += dx1;
pt1.y += dy1;
pt2.x += dx2;
pt2.y += dy2;
// If the point has move out of the view bounds, then limit
// the sucker and change the direction and assign a new delta value.
if (pt1.x > NX_WIDTH(&bounds) || pt1.x < 0.0) {
dx1 = randBetween(1.0, NX_WIDTH(&bounds) / STEPFACTOR) * ((dx1 > 0.0) ? -1 : 1);
pt1.x = ((pt1.x < 0.0) ? 0.0 : NX_WIDTH(&bounds));
}
if (pt1.y > NX_HEIGHT(&bounds) || pt1.y < 0.0) {
dy1 = randBetween(1.0, NX_HEIGHT(&bounds) / STEPFACTOR) * ((dy1 > 0.0) ? -1 : 1);
pt1.y = ((pt1.y < 0.0) ? 0.0 : NX_HEIGHT(&bounds));
}
if (pt2.x > NX_WIDTH(&bounds) || pt2.x < 0.0) {
dx2 = randBetween(1.0, NX_WIDTH(&bounds) / STEPFACTOR) * ((dx2 > 0.0) ? -1 : 1);
pt2.x = ((pt2.x < 0.0) ? 0.0 : NX_WIDTH(&bounds));
}
if (pt2.y > NX_HEIGHT(&bounds) || pt2.y < 0.0) {
dy2 = randBetween(1.0, NX_HEIGHT(&bounds) / STEPFACTOR) * ((dy2 > 0.0) ? -1 : 1);
pt2.y = ((pt2.y < 0.0) ? 0.0 : NX_HEIGHT(&bounds));
}
// Now move the lines in the array down ...
for ( index = MAXLINES - 1; index >= 1; index-- ) {
lines[index].begin = lines[index - 1].begin;
lines[index].end = lines[index - 1].end;
}
// ... and then fill in the 'new' line with our calculated values.
lines[0].begin = pt1;
lines[0].end = pt2;
[self display];
return ( self );
}
- initFrame:(const NXRect *)newFrame
{
// Make sure this view's other ivars are set up.
[super initFrame:newFrame];
// Randomize the point locations.
pt1.x = randBetween(BORDER, NX_WIDTH(newFrame));
pt1.y = randBetween(BORDER, NX_HEIGHT(newFrame));
pt2.x = randBetween(BORDER, NX_WIDTH(newFrame));
pt2.y = randBetween(BORDER, NX_HEIGHT(newFrame));
// Randomize the delta values, and
dx1 = randBetween(BORDER, NX_WIDTH(newFrame) / STEPFACTOR) * ((randBetween(-1.0, 1.0) >= 0) ? -1 : 1);
dy1 = randBetween(BORDER, NX_HEIGHT(newFrame) / STEPFACTOR) * ((randBetween(-1.0, 1.0) >= 0) ? -1 : 1);
dx2 = randBetween(BORDER, NX_WIDTH(newFrame) / STEPFACTOR) * ((randBetween(-1.0, 1.0) >= 0) ? -1 : 1);
dy2 = randBetween(BORDER, NX_HEIGHT(newFrame) / STEPFACTOR) * ((randBetween(-1.0, 1.0) >= 0) ? -1 : 1);
return ( self );
}
- drawSelf:(const NXRect *)rects :(int)rectCount
{
int index;
// Erase the backing with the backing color ...
(void) PSsetrgbcolor(backingRed, backingGreen, backingBlue);
(void) NXRectFill(rects);
// ... and then draw the line(s) with the line color.
(void) PSsetrgbcolor(lineRed, lineGreen, lineBlue);
(void) PSsetlinewidth(lineWidth);
for ( index = numberOfLines - 1; index >= 0; index-- ) {
(void) PSmoveto(lines[index].begin.x, lines[index].begin.y);
(void) PSlineto(lines[index].end.x, lines[index].end.y);
}
(void) PSstroke();
return ( self );
}
- clear
{
(void) PSsetrgbcolor(backingRed, backingGreen, backingBlue);
(void) NXRectFill(&bounds);
return ( self );
}
- start
{
if ( myTE == NULL ) {
myTE = DPSAddTimedEntry(speed, &moveIt, self, NX_BASETHRESHOLD);
}
return ( self );
}
- stop
{
if ( myTE ) {
DPSRemoveTimedEntry(myTE);
myTE = (DPSTimedEntry)0;
}
return ( self );
}
- lineColor:(NXColor)newColor
{
(void) NXConvertColorToRGBA(newColor, &lineRed, &lineGreen, &lineBlue, &lineAlpha);
return ( self );
}
- backingColor:(NXColor)newColor
{
(void) NXConvertColorToRGBA(newColor, &backingRed, &backingGreen, &backingBlue, &backingAlpha);
return ( self );
}
- lineWidth:(float)newLineWidth
{
lineWidth = newLineWidth;
return ( self );
}
- speed:(float)newSpeed
{
speed = newSpeed;
[self stop];
[self start];
return ( self );
}
- numberOfLines:(float)newNumberOfLines
{
numberOfLines = newNumberOfLines;
return ( self );
}
// This should return a float between 0 and 1.
// Stolen from NeXT and the Thinker.m class by Sam Streeper.
///
float frandom()
{
float val = (random() & 0x7fffffff);
val /= 0x7fffffff;
return val;
}
float randBetween(float a, float b)
{
float val, scale, t;
if (a > b)
{ t = a; a = b; b = t;
}
scale = (b-a);
val = scale * frandom();
return (a + val);
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.