89 lines · 2.6 KB · C
RawDownload
#pragma lib "libgeometry.a"#pragma src "/sys/src/libgeometry"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 qdiv(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)