summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjacksonmj <mj-pt@jacksonmj.co.uk>2011-03-18 12:46:06 (GMT)
committer jacksonmj <mj-pt@jacksonmj.co.uk>2011-03-18 19:33:10 (GMT)
commitd924a5554a8fa0ead5d17f69e10d46e14a64b5dc (patch)
tree35b40c904a76d9bd8cdf72e95f551f5b9da22176
parent56f966b4dbff5790c9e61f5a3dbc8b7cec187c4b (diff)
downloadpowder-d924a5554a8fa0ead5d17f69e10d46e14a64b5dc.zip
powder-d924a5554a8fa0ead5d17f69e10d46e14a64b5dc.tar.gz
Matrices and vectors, to make coding next commit more pleasant
-rw-r--r--includes/misc.h23
-rw-r--r--src/misc.c65
2 files changed, 88 insertions, 0 deletions
diff --git a/includes/misc.h b/includes/misc.h
index 4094b39..a929f8c 100644
--- a/includes/misc.h
+++ b/includes/misc.h
@@ -71,4 +71,27 @@ void *file_load(char *fn, int *size);
int cpu_check(void);
+// a b
+// c d
+struct matrix2d {float a,b,c,d;};
+typedef struct matrix2d matrix2d;
+
+// column vector
+struct vector2d {float x,y;};
+typedef struct vector2d vector2d;
+
+matrix2d m2d_multiply_m2d(matrix2d m1, matrix2d m2);
+vector2d m2d_multiply_v2d(matrix2d m, vector2d v);
+matrix2d m2d_multiply_float(matrix2d m, float s);
+vector2d v2d_multiply_float(vector2d v, float s);
+
+vector2d v2d_add(vector2d v1, vector2d v2);
+vector2d v2d_sub(vector2d v1, vector2d v2);
+
+matrix2d m2d_new(float me0, float me1, float me2, float me3);
+vector2d v2d_new(float x, float y);
+
+extern vector2d v2d_zero;
+extern matrix2d m2d_identity;
+
#endif
diff --git a/src/misc.c b/src/misc.c
index c98c5a3..eb54dfb 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -306,3 +306,68 @@ int cpu_check(void)
#endif
return 0;
}
+
+matrix2d m2d_multiply_m2d(matrix2d m1, matrix2d m2)
+{
+ matrix2d result = {
+ m1.a*m2.a+m1.b*m2.c, m1.a*m2.b+m1.b*m2.d,
+ m1.c*m2.a+m1.d*m2.c, m1.c*m2.b+m1.d*m2.d
+ };
+ return result;
+}
+vector2d m2d_multiply_v2d(matrix2d m, vector2d v)
+{
+ vector2d result = {
+ m.a*v.x+m.b*v.y,
+ m.c*v.x+m.d*v.y
+ };
+ return result;
+}
+matrix2d m2d_multiply_float(matrix2d m, float s)
+{
+ matrix2d result = {
+ m.a*s, m.b*s,
+ m.c*s, m.d*s,
+ };
+ return result;
+}
+
+vector2d v2d_multiply_float(vector2d v, float s)
+{
+ vector2d result = {
+ v.x*s,
+ v.y*s
+ };
+ return result;
+}
+
+vector2d v2d_add(vector2d v1, vector2d v2)
+{
+ vector2d result = {
+ v1.x+v2.x,
+ v1.y+v2.y
+ };
+ return result;
+}
+vector2d v2d_sub(vector2d v1, vector2d v2)
+{
+ vector2d result = {
+ v1.x-v2.x,
+ v1.y-v2.y
+ };
+ return result;
+}
+
+matrix2d m2d_new(float me0, float me1, float me2, float me3)
+{
+ matrix2d result = {me0,me1,me2,me3};
+ return result;
+}
+vector2d v2d_new(float x, float y)
+{
+ vector2d result = {x, y};
+ return result;
+}
+
+vector2d v2d_zero = {0,0};
+matrix2d m2d_identity = {1,0,0,1};