geometry.h (2792B)
1 #ifndef _GEOMETRY_H_ 2 #define _GEOMETRY_H_ 1 3 #if defined(__cplusplus) 4 extern "C" { 5 #endif 6 7 8 AUTOLIB(geometry) 9 10 typedef double Matrix[4][4]; 11 typedef struct Point3 Point3; 12 typedef struct Quaternion Quaternion; 13 typedef struct Space Space; 14 struct Point3{ 15 double x, y, z, w; 16 }; 17 struct Quaternion{ 18 double r, i, j, k; 19 }; 20 struct Space{ 21 Matrix t; 22 Matrix tinv; 23 Space *next; 24 }; 25 /* 26 * 3-d point arithmetic 27 */ 28 Point3 add3(Point3 a, Point3 b); 29 Point3 sub3(Point3 a, Point3 b); 30 Point3 neg3(Point3 a); 31 Point3 div3(Point3 a, double b); 32 Point3 mul3(Point3 a, double b); 33 int eqpt3(Point3 p, Point3 q); 34 int closept3(Point3 p, Point3 q, double eps); 35 double dot3(Point3 p, Point3 q); 36 Point3 cross3(Point3 p, Point3 q); 37 double len3(Point3 p); 38 double dist3(Point3 p, Point3 q); 39 Point3 unit3(Point3 p); 40 Point3 midpt3(Point3 p, Point3 q); 41 Point3 lerp3(Point3 p, Point3 q, double alpha); 42 Point3 reflect3(Point3 p, Point3 p0, Point3 p1); 43 Point3 nearseg3(Point3 p0, Point3 p1, Point3 testp); 44 double pldist3(Point3 p, Point3 p0, Point3 p1); 45 double vdiv3(Point3 a, Point3 b); 46 Point3 vrem3(Point3 a, Point3 b); 47 Point3 pn2f3(Point3 p, Point3 n); 48 Point3 ppp2f3(Point3 p0, Point3 p1, Point3 p2); 49 Point3 fff2p3(Point3 f0, Point3 f1, Point3 f2); 50 Point3 pdiv4(Point3 a); 51 Point3 add4(Point3 a, Point3 b); 52 Point3 sub4(Point3 a, Point3 b); 53 /* 54 * Quaternion arithmetic 55 */ 56 void qtom(Matrix, Quaternion); 57 Quaternion mtoq(Matrix); 58 Quaternion qadd(Quaternion, Quaternion); 59 Quaternion qsub(Quaternion, Quaternion); 60 Quaternion qneg(Quaternion); 61 Quaternion qmul(Quaternion, Quaternion); 62 Quaternion p9qdiv(Quaternion, Quaternion); 63 Quaternion qunit(Quaternion); 64 Quaternion qinv(Quaternion); 65 double qlen(Quaternion); 66 Quaternion slerp(Quaternion, Quaternion, double); 67 Quaternion qmid(Quaternion, Quaternion); 68 Quaternion qsqrt(Quaternion); 69 void qball(Rectangle, Mouse *, Quaternion *, void (*)(void), Quaternion *); 70 /* 71 * Matrix arithmetic 72 */ 73 void ident(Matrix); 74 void matmul(Matrix, Matrix); 75 void matmulr(Matrix, Matrix); 76 double determinant(Matrix); 77 void adjoint(Matrix, Matrix); 78 double invertmat(Matrix, Matrix); 79 /* 80 * Space stack routines 81 */ 82 Space *pushmat(Space *); 83 Space *popmat(Space *); 84 void rot(Space *, double, int); 85 void qrot(Space *, Quaternion); 86 void scale(Space *, double, double, double); 87 void move(Space *, double, double, double); 88 void xform(Space *, Matrix); 89 void ixform(Space *, Matrix, Matrix); 90 void look(Space *, Point3, Point3, Point3); 91 int persp(Space *, double, double, double); 92 void viewport(Space *, Rectangle, double); 93 Point3 xformpoint(Point3, Space *, Space *); 94 Point3 xformpointd(Point3, Space *, Space *); 95 Point3 xformplane(Point3, Space *, Space *); 96 #define radians(d) ((d)*.01745329251994329572) 97 98 #ifndef NOPLAN9DEFINES 99 #define qdiv p9qdiv /* for NetBSD */ 100 #endif 101 102 #if defined(__cplusplus) 103 } 104 #endif 105 #endif