home *** CD-ROM | disk | FTP | other *** search
/ Altsys Virtuoso 2.0K / virtuoso_20k.iso / DemoApps / Graphics / 2D_3D / Tester3D / Source / Linear3D.m < prev    next >
Encoding:
Text File  |  1990-07-07  |  4.0 KB  |  187 lines

  1. /* Linear3D.m */
  2.  
  3. #import "Linear3D.h"
  4. #import <math.h>
  5.  
  6. @implementation Linear3D
  7.  
  8. +new
  9. {
  10.     int ctr1,ctr2;
  11.     self=[super new];
  12.     for(ctr1=0;ctr1<4;++ctr1) {
  13.         for(ctr2=0;ctr2<4;++ctr2) {    
  14.             coeff[ctr1][ctr2]=0.0;
  15.         }
  16.     }
  17.     coeff[0][0]=1.0;
  18.     coeff[1][1]=1.0;
  19.     coeff[2][2]=1.0;    
  20.     return self;
  21. }
  22.  
  23. - operateOn:(vector3D *)theVect
  24. {
  25.     vector3D temp;
  26.     temp.x=theVect->x*coeff[0][0]+theVect->y*coeff[1][0]+
  27.         theVect->z*coeff[2][0]+coeff[3][0];
  28.     temp.y=theVect->x*coeff[0][1]+theVect->y*coeff[1][1]+
  29.         theVect->z*coeff[2][1]+coeff[3][1];
  30.     temp.z=theVect->x*coeff[0][2]+theVect->y*coeff[1][2]+
  31.         theVect->z*coeff[2][2]+coeff[3][2];
  32.     *theVect=temp;
  33.     return self;
  34. }
  35.     
  36. - operateOn:(vector3D *)theVects howMany:(int)count;
  37. {
  38.     vector3D temp;
  39.     int ctr;
  40.     for(ctr=0;ctr<count;++ctr){
  41.         temp.x=theVects[ctr].x*coeff[0][0]+theVects[ctr].y*coeff[1][0]+
  42.             theVects[ctr].z*coeff[2][0]+coeff[3][0];
  43.         temp.y=theVects[ctr].x*coeff[0][1]+theVects[ctr].y*coeff[1][1]+
  44.             theVects[ctr].z*coeff[2][1]+coeff[3][1];
  45.         temp.z=theVects[ctr].x*coeff[0][2]+theVects[ctr].y*coeff[1][2]+
  46.             theVects[ctr].z*coeff[2][2]+coeff[3][2];
  47.         theVects[ctr]=temp;
  48.     }
  49.     return self;
  50. }
  51.  
  52. - concatBefore:aLinear
  53. {
  54.     int ctrRow,ctrColumn,ctr;
  55.     float temp[4][3];
  56.     if([aLinear isKindOf:[Linear3D class]]) {
  57.         for(ctrRow=0;ctrRow<3;++ctrRow) {
  58.             for(ctrColumn=0;ctrColumn<3;++ctrColumn) {
  59.                 temp[ctrRow][ctrColumn]=0.0;
  60.                 for(ctr=0;ctr<3;++ctr)
  61.                     temp[ctrRow][ctrColumn] += 
  62.                         coeff[ctrRow][ctr]*
  63.                         [aLinear coefficient:ctr column:ctrColumn];
  64.             }
  65.         }
  66.         for(ctr=0;ctr<3;++ctr)
  67.             temp[3][ctr]=coeff[3][0]*[aLinear coefficient:0 column:ctr]+
  68.                 coeff[3][1]*[aLinear coefficient:1 column:ctr]+
  69.                 coeff[3][2]*[aLinear coefficient:2 column:ctr]+
  70.                 [aLinear coefficient:3 column:ctr];
  71.                 
  72.         for(ctrRow=0;ctrRow<4;++ctrRow)
  73.             for(ctrColumn=0;ctrColumn<3;++ctrColumn)
  74.                 coeff[ctrRow][ctrColumn]=temp[ctrRow][ctrColumn];
  75.         return self;
  76.     }
  77.     return nil;
  78. }
  79.  
  80. - concatAfter:aLinear
  81. {
  82.     int ctrRow,ctrColumn,ctr;
  83.     float temp[4][3];
  84.     if([aLinear isKindOf:[Linear3D class]]) {
  85.         for(ctrRow=0;ctrRow<3;++ctrRow) {
  86.             for(ctrColumn=0;ctrColumn<3;++ctrColumn) {
  87.                 temp[ctrRow][ctrColumn]=0.0;
  88.                 for(ctr=0;ctr<3;++ctr)
  89.                     temp[ctrRow][ctrColumn] += 
  90.                         coeff[ctr][ctrColumn]*
  91.                         [aLinear coefficient:ctrRow column:ctr];
  92.             }
  93.         }
  94.         for(ctr=0;ctr<3;++ctr)
  95.             temp[3][ctr]=coeff[0][ctr]*[aLinear coefficient:3 column:0]+
  96.                 coeff[1][ctr]*[aLinear coefficient:3 column:1]+
  97.                 coeff[2][ctr]*[aLinear coefficient:3 column:2]+
  98.                 coeff[3][ctr];
  99.                 
  100.         for(ctrRow=0;ctrRow<4;++ctrRow)
  101.             for(ctrColumn=0;ctrColumn<3;++ctrColumn)
  102.                 coeff[ctrRow][ctrColumn]=temp[ctrRow][ctrColumn];
  103.         return self;
  104.     }
  105.     return nil;
  106. }
  107.  
  108. - rotation:(int)axis:(float)angle
  109. {
  110.     int ctrRow,ctrColumn;
  111.     
  112.     angle *= 3.14159/180.0;
  113.     
  114.     for(ctrRow=0;ctrRow<4;++ctrRow)
  115.         for(ctrColumn=0;ctrColumn<3;++ctrColumn)
  116.             coeff[ctrRow][ctrColumn]=0.0;
  117.  
  118.     coeff[0][0]=1.0;
  119.     coeff[1][1]=1.0;
  120.     coeff[2][2]=1.0;
  121.  
  122.     switch(axis) {
  123.         case L3D_X_AXIS:
  124.             coeff[1][1]=cos(angle);
  125.             coeff[2][2]=cos(angle);
  126.             coeff[1][2]=sin(angle);
  127.             coeff[2][1]=-sin(angle);
  128.             break;
  129.         case L3D_Y_AXIS:
  130.             coeff[0][0]=cos(angle);
  131.             coeff[2][2]=cos(angle);
  132.             coeff[0][2]=-sin(angle);
  133.             coeff[2][0]=sin(angle);
  134.             break;
  135.         case L3D_Z_AXIS:
  136.             coeff[0][0]=cos(angle);
  137.             coeff[1][1]=cos(angle);
  138.             coeff[0][1]=sin(angle);
  139.             coeff[1][0]=-sin(angle);
  140.             break;
  141.     }
  142.     return self;
  143. }        
  144.  
  145. - scaling:(float)x:(float)y:(float)z
  146. {
  147.     int ctrRow,ctrColumn;
  148.     
  149.     for(ctrRow=0;ctrRow<4;++ctrRow)
  150.         for(ctrColumn=0;ctrColumn<3;++ctrColumn)
  151.             coeff[ctrRow][ctrColumn]=0.0;
  152.  
  153.     coeff[0][0]=x;
  154.     coeff[1][1]=y;
  155.     coeff[2][2]=z;
  156.             
  157.     return self;
  158. }
  159.  
  160. - translation:(float)x:(float)y:(float)z
  161. {
  162.     int ctrRow,ctrColumn;
  163.     
  164.     for(ctrRow=0;ctrRow<4;++ctrRow)
  165.         for(ctrColumn=0;ctrColumn<3;++ctrColumn)
  166.             coeff[ctrRow][ctrColumn]=0.0;
  167.  
  168.     coeff[0][0]=1.0;
  169.     coeff[1][1]=1.0;
  170.     coeff[2][2]=1.0;
  171.  
  172.     coeff[3][0]=x;
  173.     coeff[3][1]=y;
  174.     coeff[3][2]=z;
  175.             
  176.     return self;
  177. }
  178.  
  179. - (float)coefficient:(int)row column:(int)column
  180. {
  181.     if(row > 3 || column > 2 || row < 0 || column < 0) return 0.0;
  182.     return coeff[row][column];
  183. }
  184.  
  185.  
  186. @end
  187.