]> git.lizzy.rs Git - nothing.git/blob - src/point.c
(#110) Turn seen goals into checkpoints
[nothing.git] / src / point.c
1 #include <assert.h>
2 #include <math.h>
3 #include "./point.h"
4
5 vec_t vec(float x, float y)
6 {
7     vec_t result = {
8         .x = x,
9         .y = y
10     };
11     return result;
12 }
13
14 vec_t vec_from_polar(float arg, float mag)
15 {
16     return vec_scala_mult(
17         vec(cosf(arg), sinf(arg)),
18         mag);
19 }
20
21 vec_t vec_from_ps(point_t p1, point_t p2)
22 {
23     vec_t result = {
24         .x = p2.x - p1.x,
25         .y = p2.y - p1.y
26     };
27     return result;
28 }
29
30 float vec_arg(vec_t v)
31 {
32     return atan2f(v.y, v.x);
33 }
34
35 float vec_mag(vec_t v)
36 {
37     return sqrtf(v.x * v.x + v.y * v.y);
38 }
39
40 vec_t vec_sum(vec_t v1, vec_t v2)
41 {
42     vec_t result = {
43         .x = v1.x + v2.x,
44         .y = v1.y + v2.y
45     };
46     return result;
47 }
48
49 vec_t vec_neg(vec_t v)
50 {
51     vec_t result = {
52         .x = -v.x,
53         .y = -v.y
54     };
55
56     return result;
57 }
58
59 float vec_length(vec_t v)
60 {
61     return sqrtf(v.x * v.x + v.y * v.y);
62 }
63
64 void vec_add(vec_t *v1, vec_t v2)
65 {
66     v1->x += v2.x;
67     v1->y += v2.y;
68 }
69
70 vec_t vec_scala_mult(vec_t v, float scalar)
71 {
72     vec_t result = {
73         .x = v.x * scalar,
74         .y = v.y * scalar
75     };
76     return result;
77 }
78
79 vec_t vec_entry_mult(vec_t v1, vec_t v2)
80 {
81     vec_t result = {
82         .x = v1.x * v2.x,
83         .y = v1.y * v2.y
84     };
85
86     return result;
87 }
88
89 vec_t vec_entry_div(vec_t v1, vec_t v2)
90 {
91     vec_t result = {
92         .x = v1.x / v2.x,
93         .y = v1.y / v2.y
94     };
95
96     return result;
97 }
98
99 float rad_to_deg(float a)
100 {
101     return 180 / PI * a;
102 }
103
104 point_t point_mat3x3_product(point_t p, mat3x3 m)
105 {
106     /* Convert p to Homogeneous coordinates */
107     const float homo_p[3] = {p.x, p.y, 1};
108
109     /* Transform p with matrix m */
110     const float trans_p[3] = {
111         homo_p[0] * m.M[0][0] + homo_p[1] * m.M[0][1] + homo_p[2] * m.M[0][2],
112         homo_p[0] * m.M[1][0] + homo_p[1] * m.M[1][1] + homo_p[2] * m.M[1][2],
113         homo_p[0] * m.M[2][0] + homo_p[1] * m.M[2][1] + homo_p[2] * m.M[2][2]
114     };
115
116     /* Convert p back to Cartesian coordinates */
117     const point_t result_p = {
118         .x = trans_p[0] / trans_p[2],
119         .y = trans_p[1] / trans_p[2]
120     };
121
122     return result_p;
123 }