This is Tesselmeer.m in view mode; [Download] [Up]
/* Tesselmeer.m - Tesselated plane model.
* Copyright (C) 1993 Corona Design, Inc. All rights reserved.
*
* Abstract
* Creates a hexagon tesselated with colored equilateral triangles.
*
* RCS path:
* $Source: /Users/pkron/Projects/voxel/Pyramid/RCS/Tesselmeer.m,v $
* Modified: $Date: 93/09/15 12:35:21 $ by $Author: pkron $
* Current State: $State: Exp $ locked by $Locker: $
*/
#import "Tesselmeer.h"
#define SQRT3 1.732051
static void subdivideTriangle( struct _meer *, int index, int depth);
@implementation Tesselmeer
- init
{
int depth = 2;
[super init];
// define initial hexagon
// six triangles
meer3D.count = 6;
meer3D.triangles[0].apex[0] = -.5;
meer3D.triangles[0].apex[1] = SQRT3/2;
meer3D.triangles[0].height = -SQRT3/2;
meer3D.triangles[0].color = G;
meer3D.triangles[1].apex[0] = 0;
meer3D.triangles[1].apex[1] = 0;
meer3D.triangles[1].height = SQRT3/2;
meer3D.triangles[1].color = Y;
meer3D.triangles[2].apex[0] = .5;
meer3D.triangles[2].apex[1] = SQRT3/2;
meer3D.triangles[2].height = -SQRT3/2;
meer3D.triangles[2].color = B;
meer3D.triangles[3].apex[0] = -.5;
meer3D.triangles[3].apex[1] = -SQRT3/2;
meer3D.triangles[3].height = SQRT3/2;
meer3D.triangles[3].color = B;
meer3D.triangles[4].apex[0] = 0;
meer3D.triangles[4].apex[1] = 0;
meer3D.triangles[4].height = -SQRT3/2;
meer3D.triangles[4].color = Y;
meer3D.triangles[5].apex[0] = .5;
meer3D.triangles[5].apex[1] = -SQRT3/2;
meer3D.triangles[5].height = SQRT3/2;
meer3D.triangles[5].color = G;
// recursively divide triangles
if ( depth GT 0 )
{
subdivideTriangle( &meer3D, 0, depth);
subdivideTriangle( &meer3D, 1, depth);
subdivideTriangle( &meer3D, 2, depth);
subdivideTriangle( &meer3D, 3, depth);
subdivideTriangle( &meer3D, 4, depth);
subdivideTriangle( &meer3D, 5, depth);
}
return( self);
}
// draw the tesslated plane
- drawModel: (MATRIX)transform : (NXRect *)clip
{
int i;
for ( i=0; i LT meer3D.count; ++i)
{
POINT corners[3];
float height = meer3D.triangles[i].height;
float deltaX = height*(.5/(SQRT3/2));
corners[0][2] = corners[1][2] = corners[2][2] = 0;
corners[0][3] = corners[1][3] = corners[2][3] = 1;
corners[0][0] = meer3D.triangles[i].apex[0];
corners[0][1] = meer3D.triangles[i].apex[1];
// compute corners from apex
corners[1][0] = corners[0][0] - deltaX;
corners[1][1] = corners[0][1] + height;
corners[2][0] = corners[1][0] + 2*deltaX;
corners[2][1] = corners[1][1];
// map and project vertices
map( transform, &corners[0]);
map( transform, &corners[1]);
map( transform, &corners[2]);
project(&corners[0]);
project(&corners[1]);
project(&corners[2]);
// draw
PSmoveto( corners[0][0], corners[0][1]);
PSlineto( corners[1][0], corners[1][1]);
PSlineto( corners[2][0], corners[2][1]);
PSclosepath();
switch( meer3D.triangles[i].color )
{
case R:
PSsetrgbcolor( 1, 0, 0);
break;
case G:
PSsetrgbcolor( 0, 1, 0);
break;
case B:
PSsetrgbcolor( 0, 0, 1);
break;
case Y:
PSsetrgbcolor( 1, 1, 0);
break;
}
PSfill();
}
return( self);
}
@end
// recursively subdivide
static void
subdivideTriangle( struct _meer *meer, int index, int depth)
{
int new;
float apex[2];
float height = meer->triangles[ index].height/2;
// cut this triangle in half and paint tip red
apex[0] = meer->triangles[ index].apex[0];
apex[1] = meer->triangles[ index].apex[1];
meer->triangles[ index].height = height;
meer->triangles[ index].color = R;
// create 3 new triangles to
// subdivide base of original triangle
new = meer->count++;
meer->triangles[ new].apex[0] = apex[0] + (height*.5)/(SQRT3/2);
meer->triangles[ new].apex[1] = apex[1] + height;
meer->triangles[ new].height = height;
meer->triangles[ new].color = G;
new = meer->count++;
meer->triangles[ new].apex[0] = apex[0];
meer->triangles[ new].apex[1] = apex[1] + 2*height;
meer->triangles[ new].height = -height;
meer->triangles[ new].color = Y;
new = meer->count++;
meer->triangles[ new].apex[0] = apex[0] - (height*.5)/(SQRT3/2);
meer->triangles[ new].apex[1] = apex[1] + height;
meer->triangles[ new].height = height;
meer->triangles[ new].color = B;
// recurse
if ( depth GT 1 )
{
subdivideTriangle( meer, index, depth-1);
subdivideTriangle( meer, new--, depth-1);
subdivideTriangle( meer, new--, depth-1);
subdivideTriangle( meer, new--, depth-1);
}
}
#ifdef _LOG
/*
* $Log: Tesselmeer.m,v $
Revision 1.1 93/09/15 12:35:21 pkron
Created.
*/
#endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.