summaryrefslogtreecommitdiff
path: root/rframes.c
blob: cfb1158045da56b90a3bb89428ef5dd6f48886b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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);
}