This is Linear3D.m in view mode; [Download] [Up]
/* Linear3D.m */ #import "Linear3D.h" #import <math.h> @implementation Linear3D +new { int ctr1,ctr2; self=[super new]; for(ctr1=0;ctr1<4;++ctr1) { for(ctr2=0;ctr2<4;++ctr2) { coeff[ctr1][ctr2]=0.0; } } coeff[0][0]=1.0; coeff[1][1]=1.0; coeff[2][2]=1.0; return self; } - operateOn:(vector3D *)theVect { vector3D temp; temp.x=theVect->x*coeff[0][0]+theVect->y*coeff[1][0]+ theVect->z*coeff[2][0]+coeff[3][0]; temp.y=theVect->x*coeff[0][1]+theVect->y*coeff[1][1]+ theVect->z*coeff[2][1]+coeff[3][1]; temp.z=theVect->x*coeff[0][2]+theVect->y*coeff[1][2]+ theVect->z*coeff[2][2]+coeff[3][2]; *theVect=temp; return self; } - operateOn:(vector3D *)theVects howMany:(int)count; { vector3D temp; int ctr; for(ctr=0;ctr<count;++ctr){ temp.x=theVects[ctr].x*coeff[0][0]+theVects[ctr].y*coeff[1][0]+ theVects[ctr].z*coeff[2][0]+coeff[3][0]; temp.y=theVects[ctr].x*coeff[0][1]+theVects[ctr].y*coeff[1][1]+ theVects[ctr].z*coeff[2][1]+coeff[3][1]; temp.z=theVects[ctr].x*coeff[0][2]+theVects[ctr].y*coeff[1][2]+ theVects[ctr].z*coeff[2][2]+coeff[3][2]; theVects[ctr]=temp; } return self; } - concatBefore:aLinear { int ctrRow,ctrColumn,ctr; float temp[4][3]; if([aLinear isKindOf:[Linear3D class]]) { for(ctrRow=0;ctrRow<3;++ctrRow) { for(ctrColumn=0;ctrColumn<3;++ctrColumn) { temp[ctrRow][ctrColumn]=0.0; for(ctr=0;ctr<3;++ctr) temp[ctrRow][ctrColumn] += coeff[ctrRow][ctr]* [aLinear coefficient:ctr column:ctrColumn]; } } for(ctr=0;ctr<3;++ctr) temp[3][ctr]=coeff[3][0]*[aLinear coefficient:0 column:ctr]+ coeff[3][1]*[aLinear coefficient:1 column:ctr]+ coeff[3][2]*[aLinear coefficient:2 column:ctr]+ [aLinear coefficient:3 column:ctr]; for(ctrRow=0;ctrRow<4;++ctrRow) for(ctrColumn=0;ctrColumn<3;++ctrColumn) coeff[ctrRow][ctrColumn]=temp[ctrRow][ctrColumn]; return self; } return nil; } - concatAfter:aLinear { int ctrRow,ctrColumn,ctr; float temp[4][3]; if([aLinear isKindOf:[Linear3D class]]) { for(ctrRow=0;ctrRow<3;++ctrRow) { for(ctrColumn=0;ctrColumn<3;++ctrColumn) { temp[ctrRow][ctrColumn]=0.0; for(ctr=0;ctr<3;++ctr) temp[ctrRow][ctrColumn] += coeff[ctr][ctrColumn]* [aLinear coefficient:ctrRow column:ctr]; } } for(ctr=0;ctr<3;++ctr) temp[3][ctr]=coeff[0][ctr]*[aLinear coefficient:3 column:0]+ coeff[1][ctr]*[aLinear coefficient:3 column:1]+ coeff[2][ctr]*[aLinear coefficient:3 column:2]+ coeff[3][ctr]; for(ctrRow=0;ctrRow<4;++ctrRow) for(ctrColumn=0;ctrColumn<3;++ctrColumn) coeff[ctrRow][ctrColumn]=temp[ctrRow][ctrColumn]; return self; } return nil; } - rotation:(int)axis:(float)angle { int ctrRow,ctrColumn; angle *= 3.14159/180.0; for(ctrRow=0;ctrRow<4;++ctrRow) for(ctrColumn=0;ctrColumn<3;++ctrColumn) coeff[ctrRow][ctrColumn]=0.0; coeff[0][0]=1.0; coeff[1][1]=1.0; coeff[2][2]=1.0; switch(axis) { case L3D_X_AXIS: coeff[1][1]=cos(angle); coeff[2][2]=cos(angle); coeff[1][2]=sin(angle); coeff[2][1]=-sin(angle); break; case L3D_Y_AXIS: coeff[0][0]=cos(angle); coeff[2][2]=cos(angle); coeff[0][2]=-sin(angle); coeff[2][0]=sin(angle); break; case L3D_Z_AXIS: coeff[0][0]=cos(angle); coeff[1][1]=cos(angle); coeff[0][1]=sin(angle); coeff[1][0]=-sin(angle); break; } return self; } - scaling:(float)x:(float)y:(float)z { int ctrRow,ctrColumn; for(ctrRow=0;ctrRow<4;++ctrRow) for(ctrColumn=0;ctrColumn<3;++ctrColumn) coeff[ctrRow][ctrColumn]=0.0; coeff[0][0]=x; coeff[1][1]=y; coeff[2][2]=z; return self; } - translation:(float)x:(float)y:(float)z { int ctrRow,ctrColumn; for(ctrRow=0;ctrRow<4;++ctrRow) for(ctrColumn=0;ctrColumn<3;++ctrColumn) coeff[ctrRow][ctrColumn]=0.0; coeff[0][0]=1.0; coeff[1][1]=1.0; coeff[2][2]=1.0; coeff[3][0]=x; coeff[3][1]=y; coeff[3][2]=z; return self; } - (float)coefficient:(int)row column:(int)column { if(row > 3 || column > 2 || row < 0 || column < 0) return 0.0; return coeff[row][column]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.