transform.c (1995B)
1 /* 2 * The following routines transform points and planes from one space 3 * to another. Points and planes are represented by their 4 * homogeneous coordinates, stored in variables of type Point3. 5 */ 6 #include <u.h> 7 #include <libc.h> 8 #include <draw.h> 9 #include <geometry.h> 10 /* 11 * Transform point p. 12 */ 13 Point3 xformpoint(Point3 p, Space *to, Space *from){ 14 Point3 q, r; 15 register double *m; 16 if(from){ 17 m=&from->t[0][0]; 18 q.x=*m++*p.x; q.x+=*m++*p.y; q.x+=*m++*p.z; q.x+=*m++*p.w; 19 q.y=*m++*p.x; q.y+=*m++*p.y; q.y+=*m++*p.z; q.y+=*m++*p.w; 20 q.z=*m++*p.x; q.z+=*m++*p.y; q.z+=*m++*p.z; q.z+=*m++*p.w; 21 q.w=*m++*p.x; q.w+=*m++*p.y; q.w+=*m++*p.z; q.w+=*m *p.w; 22 } 23 else 24 q=p; 25 if(to){ 26 m=&to->tinv[0][0]; 27 r.x=*m++*q.x; r.x+=*m++*q.y; r.x+=*m++*q.z; r.x+=*m++*q.w; 28 r.y=*m++*q.x; r.y+=*m++*q.y; r.y+=*m++*q.z; r.y+=*m++*q.w; 29 r.z=*m++*q.x; r.z+=*m++*q.y; r.z+=*m++*q.z; r.z+=*m++*q.w; 30 r.w=*m++*q.x; r.w+=*m++*q.y; r.w+=*m++*q.z; r.w+=*m *q.w; 31 } 32 else 33 r=q; 34 return r; 35 } 36 /* 37 * Transform point p with perspective division. 38 */ 39 Point3 xformpointd(Point3 p, Space *to, Space *from){ 40 p=xformpoint(p, to, from); 41 if(p.w!=0){ 42 p.x/=p.w; 43 p.y/=p.w; 44 p.z/=p.w; 45 p.w=1; 46 } 47 return p; 48 } 49 /* 50 * Transform plane p -- same as xformpoint, except multiply on the 51 * other side by the inverse matrix. 52 */ 53 Point3 xformplane(Point3 p, Space *to, Space *from){ 54 Point3 q, r; 55 register double *m; 56 if(from){ 57 m=&from->tinv[0][0]; 58 q.x =*m++*p.x; q.y =*m++*p.x; q.z =*m++*p.x; q.w =*m++*p.x; 59 q.x+=*m++*p.y; q.y+=*m++*p.y; q.z+=*m++*p.y; q.w+=*m++*p.y; 60 q.x+=*m++*p.z; q.y+=*m++*p.z; q.z+=*m++*p.z; q.w+=*m++*p.z; 61 q.x+=*m++*p.w; q.y+=*m++*p.w; q.z+=*m++*p.w; q.w+=*m *p.w; 62 } 63 else 64 q=p; 65 if(to){ 66 m=&to->t[0][0]; 67 r.x =*m++*q.x; r.y =*m++*q.x; r.z =*m++*q.x; r.w =*m++*q.x; 68 r.x+=*m++*q.y; r.y+=*m++*q.y; r.z+=*m++*q.y; r.w+=*m++*q.y; 69 r.x+=*m++*q.z; r.y+=*m++*q.z; r.z+=*m++*q.z; r.w+=*m++*q.z; 70 r.x+=*m++*q.w; r.y+=*m++*q.w; r.z+=*m++*q.w; r.w+=*m *q.w; 71 } 72 else 73 r=q; 74 return r; 75 }