#include #include #include #include Rot2 irot2 = {{1.0, 0.0}, {0.0, 1.0}}; void rinv2(Rot2 d, Rot2 s) { Rot2 r; r[0][0] = s[0][0]; r[1][1] = s[1][1]; r[1][0] = s[0][1]; r[0][1] = s[1][0]; memmove(d, r, sizeof(r)); } Point2 rmap2(Rot2 r, Point2 p) { Point2 p2; p2.x = r[0][0]*p.x + r[0][1]*p.y; p2.y = r[1][0]*p.x + r[1][1]*p.y; return p2; } void rmul2(Rot2 d, Rot2 s1, Rot2 s2) { Rot2 r; int i; for (i = 0; i < 2; ++i) { r[i][0] = s1[i][0]*s2[0][0] + s1[i][1]*s2[1][0]; r[i][1] = s1[i][0]*s2[0][1] + s1[i][1]*s2[1][1]; } memcpy(d, r, sizeof(Rot2)); } void rrot2(Rot2 d, double t) { double c, s; c = cos(t); s = sin(t); d[0][0] = d[1][1] = c; d[1][0] = s; d[0][1] = -s; } void rrand2(Rot2 r) { rrot2(r, frand()*2*MYPI); }