ref: 738f91837bffa7e3ff9ac9323dd91cf9453cde77
parent: a39951d8f69209cfea2b7051832b851914e662ef
author: rodri <[email protected]>
date: Mon Jun 19 10:22:32 EDT 2023
rframe tester.
--- /dev/null
+++ b/rframes.c
@@ -1,0 +1,85 @@
+#include <u.h>
+#include <libc.h>
+#include <geometry.h>
+
+void
+printm(Matrix m)
+{
+ int i, j;
+
+ for(i = 0; i < 3; i++){
+ for(j = 0; j < 3; j++)
+ print("\t%g", m[i][j]);
+ print("\n");
+ }
+}
+
+Point2
+rfxform(Point2 p, RFrame rf)
+{
+ Matrix m = {
+ rf.bx.x, rf.by.x, 0,
+ rf.bx.y, rf.by.y, 0,
+ 0, 0, 1
+ };
+ invm(m);
+// printm(m);
+ return xform(subpt2(p, rf.p), m);
+}
+
+Point2
+invrfxform(Point2 p, RFrame rf)
+{
+ Matrix m = {
+ rf.bx.x, rf.by.x, 0,
+ rf.bx.y, rf.by.y, 0,
+ 0, 0, 1
+ };
+// printm(m);
+ return addpt2(xform(p, m), rf.p);
+}
+
+void
+usage(void)
+{
+ fprint(2, "usage: %s srcp srcbx srcby dstp dstbx dstby p\n", argv0);
+ exits("usage");
+}
+
+void
+main(int argc, char *argv[])
+{
+ char *s;
+ RFrame src, dst;
+ Point2 p;
+
+ GEOMfmtinstall();
+ ARGBEGIN{
+ default: usage();
+ }ARGEND;
+ if(argc != 7)
+ usage();
+
+ s = argv[0]; src.p.x = strtod(s, &s); src.p.y = strtod(s, &s); src.p.w = strtod(s, &s);
+ s = argv[1]; src.bx.x = strtod(s, &s); src.bx.y = strtod(s, &s); src.bx.w = 0;
+ s = argv[2]; src.by.x = strtod(s, &s); src.by.y = strtod(s, &s); src.by.w = 0;
+
+ s = argv[3]; dst.p.x = strtod(s, &s); dst.p.y = strtod(s, &s); dst.p.w = strtod(s, &s);
+ s = argv[4]; dst.bx.x = strtod(s, &s); dst.bx.y = strtod(s, &s); dst.bx.w = 0;
+ s = argv[5]; dst.by.x = strtod(s, &s); dst.by.y = strtod(s, &s); dst.by.w = 0;
+
+ s = argv[6]; p.x = strtod(s, &s); p.y = strtod(s, &s); p.w = strtod(s, &s);
+
+ print("src\n\tp %v\n\tbx %v\n\tby %v\n", src.p, src.bx, src.by);
+ print("dst\n\tp %v\n\tbx %v\n\tby %v\n", dst.p, dst.bx, dst.by);
+ print("p %v\n", p);
+ print("p' %v\n", rframexform(invrframexform(p, src), dst));
+// print("S→D %v\n", rfxform(invrfxform(p, src), dst));
+// print("D→S %v\n", rfxform(invrfxform(p, dst), src));
+// print("S→ %v\n", invrfxform(p, src));
+// print("→S %v\n", rfxform(p, src));
+// print("D→ %v\n", invrfxform(p, dst));
+// print("→D %v\n", rfxform(p, dst));
+
+ exits(nil);
+}