| #ifndef _GEOMETRY_H_ |
| #define _GEOMETRY_H_ 1 |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif |
| |
| |
| AUTOLIB(geometry) |
| |
| typedef double Matrix[4][4]; |
| typedef struct Point3 Point3; |
| typedef struct Quaternion Quaternion; |
| typedef struct Space Space; |
| struct Point3{ |
| double x, y, z, w; |
| }; |
| struct Quaternion{ |
| double r, i, j, k; |
| }; |
| struct Space{ |
| Matrix t; |
| Matrix tinv; |
| Space *next; |
| }; |
| /* |
| * 3-d point arithmetic |
| */ |
| Point3 add3(Point3 a, Point3 b); |
| Point3 sub3(Point3 a, Point3 b); |
| Point3 neg3(Point3 a); |
| Point3 div3(Point3 a, double b); |
| Point3 mul3(Point3 a, double b); |
| int eqpt3(Point3 p, Point3 q); |
| int closept3(Point3 p, Point3 q, double eps); |
| double dot3(Point3 p, Point3 q); |
| Point3 cross3(Point3 p, Point3 q); |
| double len3(Point3 p); |
| double dist3(Point3 p, Point3 q); |
| Point3 unit3(Point3 p); |
| Point3 midpt3(Point3 p, Point3 q); |
| Point3 lerp3(Point3 p, Point3 q, double alpha); |
| Point3 reflect3(Point3 p, Point3 p0, Point3 p1); |
| Point3 nearseg3(Point3 p0, Point3 p1, Point3 testp); |
| double pldist3(Point3 p, Point3 p0, Point3 p1); |
| double vdiv3(Point3 a, Point3 b); |
| Point3 vrem3(Point3 a, Point3 b); |
| Point3 pn2f3(Point3 p, Point3 n); |
| Point3 ppp2f3(Point3 p0, Point3 p1, Point3 p2); |
| Point3 fff2p3(Point3 f0, Point3 f1, Point3 f2); |
| Point3 pdiv4(Point3 a); |
| Point3 add4(Point3 a, Point3 b); |
| Point3 sub4(Point3 a, Point3 b); |
| /* |
| * Quaternion arithmetic |
| */ |
| void qtom(Matrix, Quaternion); |
| Quaternion mtoq(Matrix); |
| Quaternion qadd(Quaternion, Quaternion); |
| Quaternion qsub(Quaternion, Quaternion); |
| Quaternion qneg(Quaternion); |
| Quaternion qmul(Quaternion, Quaternion); |
| Quaternion p9qdiv(Quaternion, Quaternion); |
| Quaternion qunit(Quaternion); |
| Quaternion qinv(Quaternion); |
| double qlen(Quaternion); |
| Quaternion slerp(Quaternion, Quaternion, double); |
| Quaternion qmid(Quaternion, Quaternion); |
| Quaternion qsqrt(Quaternion); |
| void qball(Rectangle, Mouse *, Quaternion *, void (*)(void), Quaternion *); |
| /* |
| * Matrix arithmetic |
| */ |
| void ident(Matrix); |
| void matmul(Matrix, Matrix); |
| void matmulr(Matrix, Matrix); |
| double determinant(Matrix); |
| void adjoint(Matrix, Matrix); |
| double invertmat(Matrix, Matrix); |
| /* |
| * Space stack routines |
| */ |
| Space *pushmat(Space *); |
| Space *popmat(Space *); |
| void rot(Space *, double, int); |
| void qrot(Space *, Quaternion); |
| void scale(Space *, double, double, double); |
| void move(Space *, double, double, double); |
| void xform(Space *, Matrix); |
| void ixform(Space *, Matrix, Matrix); |
| void look(Space *, Point3, Point3, Point3); |
| int persp(Space *, double, double, double); |
| void viewport(Space *, Rectangle, double); |
| Point3 xformpoint(Point3, Space *, Space *); |
| Point3 xformpointd(Point3, Space *, Space *); |
| Point3 xformplane(Point3, Space *, Space *); |
| #define radians(d) ((d)*.01745329251994329572) |
| |
| #ifndef NOPLAN9DEFINES |
| #define qdiv p9qdiv /* for NetBSD */ |
| #endif |
| |
| #if defined(__cplusplus) |
| } |
| #endif |
| #endif |