aboutsummaryrefslogtreecommitdiff
path: root/geometry.h
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2020-04-12 23:52:43 +0000
committerrodri <rgl@antares-labs.eu>2020-04-12 23:52:43 +0000
commitfc201ec63c3a98b34bf8abb1b9e72e1551e81d55 (patch)
tree5f0cdf6d186b86df1724c6f8d2bd775ef6ebbe8a /geometry.h
downloadlibgeometry-fc201ec63c3a98b34bf8abb1b9e72e1551e81d55.tar.gz
libgeometry-fc201ec63c3a98b34bf8abb1b9e72e1551e81d55.tar.bz2
libgeometry-fc201ec63c3a98b34bf8abb1b9e72e1551e81d55.zip
standalone version release.
Diffstat (limited to 'geometry.h')
-rw-r--r--geometry.h110
1 files changed, 110 insertions, 0 deletions
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);