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