From fc201ec63c3a98b34bf8abb1b9e72e1551e81d55 Mon Sep 17 00:00:00 2001 From: rodri Date: Sun, 12 Apr 2020 23:52:43 +0000 Subject: standalone version release. --- geometry.h | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 geometry.h (limited to 'geometry.h') diff --git a/geometry.h b/geometry.h new file mode 100644 index 0000000..0e4f748 --- /dev/null +++ b/geometry.h @@ -0,0 +1,110 @@ +#define DEG 0.01745329251994330 /* π/180 */ + +typedef struct Point2 Point2; +typedef struct Point3 Point3; +typedef double Matrix[3][3]; +typedef double Matrix3[4][4]; +typedef struct Quaternion Quaternion; +typedef struct RFrame RFrame; +typedef struct RFrame3 RFrame3; +typedef struct Triangle3 Triangle3; + +struct Point2 { + double x, y, w; +}; + +struct Point3 { + double x, y, z, w; +}; + +struct Quaternion { + double r, i, j, k; +}; + +struct RFrame { + Point2 p; + Point2 bx, by; +}; + +struct RFrame3 { + Point3 p; + Point3 bx, by, bz; +}; + +struct Triangle3 { + Point3 p0, p1, p2; +}; + +/* Point2 */ +Point2 Pt2(double, double, double); +Point2 Vec2(double, double); +Point2 addpt2(Point2, Point2); +Point2 subpt2(Point2, Point2); +Point2 mulpt2(Point2, double); +Point2 divpt2(Point2, double); +Point2 lerp2(Point2, Point2, double); +double dotvec2(Point2, Point2); +double vec2len(Point2); +Point2 normvec2(Point2); + +/* Point3 */ +Point3 Pt3(double, double, double, double); +Point3 Vec3(double, double, double); +Point3 addpt3(Point3, Point3); +Point3 subpt3(Point3, Point3); +Point3 mulpt3(Point3, double); +Point3 divpt3(Point3, double); +Point3 lerp3(Point3, Point3, double); +double dotvec3(Point3, Point3); +Point3 crossvec3(Point3, Point3); +double vec3len(Point3); +Point3 normvec3(Point3); + +/* Matrix */ +void identity(Matrix); +void addm(Matrix, Matrix); +void subm(Matrix, Matrix); +void mulm(Matrix, Matrix); +void smulm(Matrix, double); +void transposem(Matrix); +double detm(Matrix); +double tracem(Matrix); +void adjm(Matrix); +void invm(Matrix); +Point2 xform(Point2, Matrix); + +/* Matrix3 */ +void identity3(Matrix3); +void addm3(Matrix3, Matrix3); +void subm3(Matrix3, Matrix3); +void mulm3(Matrix3, Matrix3); +void smulm3(Matrix3, double); +void transposem3(Matrix3); +double detm3(Matrix3); +double tracem3(Matrix3); +void adjm3(Matrix3); +void invm3(Matrix3); +Point3 xform3(Point3, Matrix3); + +/* Quaternion */ +Quaternion Quat(double, double, double, double); +Quaternion Quatvec(double, Point3); +Quaternion addq(Quaternion, Quaternion); +Quaternion subq(Quaternion, Quaternion); +Quaternion mulq(Quaternion, Quaternion); +Quaternion smulq(Quaternion, double); +Quaternion sdivq(Quaternion, double); +double dotq(Quaternion, Quaternion); +Quaternion invq(Quaternion); +double qlen(Quaternion); +Quaternion normq(Quaternion); +Point3 qrotate(Point3, Point3, double); + +/* RFrame */ +Point2 rframexform(Point2, RFrame); +Point3 rframexform3(Point3, RFrame3); +Point2 invrframexform(Point2, RFrame); +Point3 invrframexform3(Point3, RFrame3); + +/* Triangle3 */ +Point3 centroid(Triangle3); -- cgit v1.2.3