summaryrefslogtreecommitdiff
path: root/libgeometry/rframe.c
diff options
context:
space:
mode:
authorrgl <devnull@localhost>2020-02-03 22:42:28 +0100
committerrgl <devnull@localhost>2020-02-03 22:42:28 +0100
commit0373255087377122eeb10e006ffb8aa1b57e611c (patch)
tree33a4fafa4996fc2efa205b2973622c3fbd27f368 /libgeometry/rframe.c
download3dee-0373255087377122eeb10e006ffb8aa1b57e611c.tar.gz
3dee-0373255087377122eeb10e006ffb8aa1b57e611c.tar.bz2
3dee-0373255087377122eeb10e006ffb8aa1b57e611c.zip
after a year or so of work, i dare create a proper repo.
Diffstat (limited to 'libgeometry/rframe.c')
-rw-r--r--libgeometry/rframe.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/libgeometry/rframe.c b/libgeometry/rframe.c
new file mode 100644
index 0000000..06d63f2
--- /dev/null
+++ b/libgeometry/rframe.c
@@ -0,0 +1,51 @@
+#include <u.h>
+#include <libc.h>
+#include "../geometry.h"
+
+Point2
+rframexform(Point2 p, RFrame rf)
+{
+ Matrix m = {
+ rf.bx.x, rf.bx.y, -dotvec2(rf.bx, rf.p),
+ rf.by.x, rf.by.y, -dotvec2(rf.by, rf.p),
+ 0, 0, 1,
+ };
+ return xform(p, m);
+}
+
+Point3
+rframexform3(Point3 p, RFrame3 rf)
+{
+ Matrix3 m = {
+ rf.bx.x, rf.bx.y, rf.bx.z, -dotvec3(rf.bx, rf.p),
+ rf.by.x, rf.by.y, rf.by.z, -dotvec3(rf.by, rf.p),
+ rf.bz.x, rf.bz.y, rf.bz.z, -dotvec3(rf.bz, rf.p),
+ 0, 0, 0, 1,
+ };
+ return xform3(p, m);
+}
+
+Point2
+invrframexform(Point2 p, RFrame rf)
+{
+ Matrix m = {
+ rf.bx.x, rf.bx.y, -dotvec2(rf.bx, rf.p),
+ rf.by.x, rf.by.y, -dotvec2(rf.by, rf.p),
+ 0, 0, 1,
+ };
+ invm(m);
+ return xform(p, m);
+}
+
+Point3
+invrframexform3(Point3 p, RFrame3 rf)
+{
+ Matrix3 m = {
+ rf.bx.x, rf.bx.y, rf.bx.z, -dotvec3(rf.bx, rf.p),
+ rf.by.x, rf.by.y, rf.by.z, -dotvec3(rf.by, rf.p),
+ rf.bz.x, rf.bz.y, rf.bz.z, -dotvec3(rf.bz, rf.p),
+ 0, 0, 0, 1,
+ };
+ invm3(m);
+ return xform3(p, m);
+}