This is SphereDrawerObject.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "SphereDrawerObject.h"
#import "SphereControl.h"
#import <math.h>
#import <dpsclient/wraps.h>
#import <appkit/appkit.h>
#import "DrawPoly.h"
#define PI (3.14159265)
typedef float vector3D[3];
typedef int boolean;
typedef struct PointThreeD {
float x,y,z;
} PointThreeD;
typedef struct PointTwoD {
float x,y;
} PointTwoD;
boolean clipFlag=FALSE, shadeFlag=FALSE;
float gray, sinTheta, cosTheta, sinPhi, cosPhi, xMiddle=0, yMiddle=0;
int xSize = 400, ySize = 400;
/***************************************************************/
void CrossXYZ(v1, v2, crossProd)
vector3D v1, v2, crossProd;
{
crossProd[0] = v1[1] * v2[2] - v1[2] * v2[1];
crossProd[1] = v1[2] * v2[0] - v1[0] * v2[2];
crossProd[2] = v1[0] * v2[1] - v1[1] * v2[0];
}
/***************************************************************/
boolean PolyVisible(poly)
PointThreeD *poly;
{
vector3D v1, v2, cross;
v1[0] = poly[0].x - poly[1].x;
v1[1] = poly[0].y - poly[1].y;
v1[2] = poly[0].z - poly[1].z;
v2[0] = poly[2].x - poly[1].x;
v2[1] = poly[2].y - poly[1].y;
v2[2] = poly[2].z - poly[1].z;
CrossXYZ(v1, v2, cross);
if (cross[2] < 0) return (TRUE);
else return (FALSE);
}
/***************************************************************/
void CalcLight(poly)
PointThreeD *poly;
{
vector3D v1, v2, cross;
v1[0] = poly[0].x - poly[1].x;
v1[1] = poly[0].y - poly[1].y;
v1[2] = poly[0].z - poly[1].z;
v2[0] = poly[2].x - poly[1].x;
v2[1] = poly[2].y - poly[1].y;
v2[2] = poly[2].z - poly[1].z;
CrossXYZ(v1, v2, cross);
gray = -cross[2] / sqrt(cross[0]*cross[0] + cross[1]*cross[1] + cross[2]*cross[2]);
}
/***************************************************************/
void Rotate(px, py, pz)
float *px, *py, *pz;
{
float xt, yt;
xt = *pz * sinTheta + *px * cosTheta;
*pz = *pz * cosTheta - *px * sinTheta;
*px = xt;
yt = *py * cosPhi - *pz * sinPhi;
*pz = *py * sinTheta + *pz * cosPhi;
*py = yt;
}
/***************************************************************/
void DrawPolygon(curPoly)
PointThreeD curPoly[];
{
boolean drawFlag=FALSE;
if (shadeFlag==TRUE) CalcLight(curPoly);
Rotate(&curPoly[0].x, &curPoly[0].y, &curPoly[0].z);
Rotate(&curPoly[1].x, &curPoly[1].y, &curPoly[1].z);
Rotate(&curPoly[2].x, &curPoly[2].y, &curPoly[2].z);
Rotate(&curPoly[3].x, &curPoly[3].y, &curPoly[3].z);
if (clipFlag==TRUE) drawFlag = PolyVisible(curPoly);
if ((clipFlag && drawFlag) || (clipFlag == FALSE))
{
if (shadeFlag==FALSE)
DrawPoly4(xMiddle + curPoly[0].x, yMiddle + curPoly[0].y,
xMiddle + curPoly[1].x, yMiddle + curPoly[1].y,
xMiddle + curPoly[2].x, yMiddle + curPoly[2].y,
xMiddle + curPoly[3].x, yMiddle + curPoly[3].y);
else
DrawPoly4s(xMiddle + curPoly[0].x, yMiddle + curPoly[0].y,
xMiddle + curPoly[1].x, yMiddle + curPoly[1].y,
xMiddle + curPoly[2].x, yMiddle + curPoly[2].y,
xMiddle + curPoly[3].x, yMiddle + curPoly[3].y,
gray);
}
}
void DrawPolygon3(curPoly)
PointThreeD curPoly[];
{
boolean drawFlag=FALSE;
if (shadeFlag==TRUE) CalcLight(curPoly);
Rotate(&curPoly[0].x, &curPoly[0].y, &curPoly[0].z);
Rotate(&curPoly[1].x, &curPoly[1].y, &curPoly[1].z);
Rotate(&curPoly[2].x, &curPoly[2].y, &curPoly[2].z);
if (clipFlag==TRUE) drawFlag = PolyVisible(curPoly);
if ((clipFlag && drawFlag) || (clipFlag == FALSE))
{
if (shadeFlag==FALSE)
DrawPoly3(xMiddle + curPoly[0].x, yMiddle + curPoly[0].y,
xMiddle + curPoly[1].x, yMiddle + curPoly[1].y,
xMiddle + curPoly[2].x, yMiddle + curPoly[2].y);
else
DrawPoly3s(xMiddle + curPoly[0].x, yMiddle + curPoly[0].y,
xMiddle + curPoly[1].x, yMiddle + curPoly[1].y,
xMiddle + curPoly[2].x, yMiddle + curPoly[2].y,
gray);
}
}
/***************************************************************/
@implementation SphereDrawerObject
- init
{
[super init];
return self;
}
- computeSphere
{
float step1=0, step2=0, count1=0, count2=0, s1=0, s2=0, c1=0, c2=0, ts1=0, ts2=0, tc1=0, tc2=0;
int radius=0;
PointThreeD curPoly[4];
xMiddle = xSize / 2;
yMiddle = ySize / 2;
sinTheta = sin(-[sphereControlPtr readTheta]/180.0*PI);
sinPhi = sin([sphereControlPtr readPhi]/180.0*PI);
cosTheta = cos(-[sphereControlPtr readTheta]/180.0*PI);
cosPhi = cos([sphereControlPtr readPhi]/180.0*PI);
step1 = PI / [sphereControlPtr readLat];
step2 = PI / [sphereControlPtr readLong];
radius = [sphereControlPtr readRadius];
clipFlag=[sphereControlPtr readHideFlag];
shadeFlag=[sphereControlPtr readShadeFlag];
/************ Draw Top Row *******************/
c1 = 1;
s1 = 0;
tc1 = cos(step1);
ts1 = sin(step1);
for (count2 = 0; count2 < PI * 2; count2 = count2 + step2)
{
curPoly[0].x=0;
curPoly[0].y=radius;
curPoly[0].z=0;
c2 = cos(count2);
s2 = sin(count2);
tc2 = cos(count2+step2);
ts2 = sin(count2+step2);
curPoly[1].x = ts1 * tc2 * radius;
curPoly[1].y = tc1 * radius;
curPoly[1].z = ts1 * ts2 * radius;
curPoly[2].x = ts1 * c2 * radius;
curPoly[2].y = tc1 * radius;
curPoly[2].z = ts1 * s2 * radius;
DrawPolygon3(curPoly);
if ([sphereControlPtr readAutoDraw]==FALSE) PSflushgraphics();
}
/************ Draw Body of Sphere *******************/
for (count1 = step1; count1 < (PI-step1); count1 = count1 + step1)
{
c1 = cos(count1);
s1 = sin(count1);
tc1 = cos(count1+step1);
ts1 = sin(count1+step1);
for (count2 = 0; count2 < PI * 2; count2 = count2 + step2)
{
c2 = cos(count2);
s2 = sin(count2);
tc2 = cos(count2+step2);
ts2 = sin(count2+step2);
curPoly[0].x = s1 * c2 * radius;
curPoly[0].y = c1 * radius;
curPoly[0].z = s1 * s2 * radius;
curPoly[1].x = s1 * tc2 * radius;
curPoly[1].y = c1 * radius;
curPoly[1].z = s1 * ts2 * radius;
curPoly[2].x = ts1 * tc2 * radius;
curPoly[2].y = tc1 * radius;
curPoly[2].z = ts1 * ts2 * radius;
curPoly[3].x = ts1 * c2 * radius;
curPoly[3].y = tc1 * radius;
curPoly[3].z = ts1 * s2 * radius;
DrawPolygon(curPoly);
if ([sphereControlPtr readAutoDraw]==FALSE) PSflushgraphics();
}
}
/************ Draw Bottom Row *******************/
c1 = -1;
s1 = 0;
tc1 = cos(PI-step1);
ts1 = sin(PI-step1);
for (count2 = 0; count2 < PI * 2; count2 = count2 + step2)
{
curPoly[0].x=0;
curPoly[0].y=-radius;
curPoly[0].z=0;
c2 = cos(count2);
s2 = sin(count2);
tc2 = cos(count2+step2);
ts2 = sin(count2+step2);
curPoly[1].x = ts1 * c2 * radius;
curPoly[1].y = tc1 * radius;
curPoly[1].z = ts1 * s2 * radius;
curPoly[2].x = ts1 * tc2 * radius;
curPoly[2].y = tc1 * radius;
curPoly[2].z = ts1 * ts2 * radius;
DrawPolygon3(curPoly);
if ([sphereControlPtr readAutoDraw]==FALSE) PSflushgraphics();
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.