LibJuno 0.42.0
LibJuno is a lightweight C99 library designed specifically for embedded systems.
Loading...
Searching...
No Matches
juno_vec.h
Go to the documentation of this file.
1/*
2 MIT License
3
4 Copyright (c) 2025 Robin A. Onsay
5
6 Permission is hereby granted, free of charge, to any person obtaining
7 a copy of this software and associated documentation files
8 (the "Software"), to deal in the Software without restriction,
9 including without limitation the rights to use, copy, modify, merge,
10 publish, distribute, sublicense, and/or sell copies of the Software,
11 and to permit persons to whom the Software is furnished to do so,
12 subject to the following conditions:
13
14 The above copyright notice and this permission notice shall be
15 included in all copies or substantial portions of the Software.
16*/
17
22#ifndef JUNO_VEC_H
23#define JUNO_VEC_H
24
26#include "juno_math_types.h"
27#include <stdint.h>
28#include <math.h>
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
34#define Juno_Pow2(d) (d*d)
35#define Juno_Pow3(d) (d*d*d)
36#define Juno_Pow4(d) (d*d*d*d)
37
42{
43 tVec0.arr[0] += tVec1.arr[0];
44 tVec0.arr[1] += tVec1.arr[1];
45 return tVec0;
46}
47
48
55{
56 tVec0.arr[0] -= tVec1.arr[0];
57 tVec0.arr[1] -= tVec1.arr[1];
58 return tVec0;
59}
60
64static inline JUNO_VEC2_F64_T Juno_Vec2_F64_Mult(JUNO_VEC2_F64_T tVec0, double dScalar)
65{
66 tVec0.arr[0] *= dScalar;
67 tVec0.arr[1] *= dScalar;
68 return tVec0;
69}
70
74static inline double Juno_Vec2_F64_Dot(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
75{
76 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1];
77}
78
83static inline double Juno_Vec2_F64_Cross(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
84{
85 return tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0];
86}
87
91static inline double Juno_Vec2_F64_L2Norm(JUNO_VEC2_F64_T tVec0)
92{
93
94 return sqrt(Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]));
95}
96
101{
102 tVec0.arr[0] += tVec1.arr[0];
103 tVec0.arr[1] += tVec1.arr[1];
104 return tVec0;
105}
106
107
114{
115 tVec0.arr[0] -= tVec1.arr[0];
116 tVec0.arr[1] -= tVec1.arr[1];
117 return tVec0;
118}
119
123static inline JUNO_VEC2_F32_T Juno_Vec2_F32_Mult(JUNO_VEC2_F32_T tVec0, float dScalar)
124{
125 tVec0.arr[0] *= dScalar;
126 tVec0.arr[1] *= dScalar;
127 return tVec0;
128}
129
133static inline float Juno_Vec2_F32_Dot(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
134{
135 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1];
136}
137
142static inline float Juno_Vec2_F32_Cross(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
143{
144 return tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0];
145}
146
150static inline float Juno_Vec2_F32_L2Norm(JUNO_VEC2_F32_T tVec0)
151{
152
153 return sqrtf(Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]));
154}
155
158{
159 tVec0.arr[0] += tVec1.arr[0];
160 tVec0.arr[1] += tVec1.arr[1];
161 return tVec0;
162}
163
164
171{
172 tVec0.arr[0] -= tVec1.arr[0];
173 tVec0.arr[1] -= tVec1.arr[1];
174 return tVec0;
175}
176
180static inline JUNO_VEC2_I32_T Juno_Vec2_I32_Mult(JUNO_VEC2_I32_T tVec0, int32_t dScalar)
181{
182 tVec0.arr[0] *= dScalar;
183 tVec0.arr[1] *= dScalar;
184 return tVec0;
185}
186
190static inline int32_t Juno_Vec2_I32_Dot(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
191{
192 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1];
193}
194
199static inline int32_t Juno_Vec2_I32_Cross(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
200{
201 return tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0];
202}
203
207static inline float Juno_Vec2_I32_L2Norm(JUNO_VEC2_I32_T tVec0)
208{
209
210 return sqrtf(Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]));
211}
212
217{
218 tVec0.arr[0] += tVec1.arr[0];
219 tVec0.arr[1] += tVec1.arr[1];
220 tVec0.arr[2] += tVec1.arr[2];
221 return tVec0;
222}
223
224
231{
232 tVec0.arr[0] -= tVec1.arr[0];
233 tVec0.arr[1] -= tVec1.arr[1];
234 tVec0.arr[2] -= tVec1.arr[2];
235 return tVec0;
236}
237
241static inline JUNO_VEC3_F64_T Juno_Vec3_F64_Mult(JUNO_VEC3_F64_T tVec0, double dScalar)
242{
243 tVec0.arr[0] *= dScalar;
244 tVec0.arr[1] *= dScalar;
245 tVec0.arr[2] *= dScalar;
246 return tVec0;
247}
248
252static inline double Juno_Vec3_F64_Dot(JUNO_VEC3_F64_T tVec0, JUNO_VEC3_F64_T tVec1)
253{
254 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1] + tVec0.arr[2] * tVec1.arr[2];
255}
256
262{
263 JUNO_VEC3_F64_T tRes = {{
264 tRes.arr[0] = tVec0.arr[1] * tVec1.arr[2] - tVec0.arr[2] * tVec1.arr[1],
265 tRes.arr[1] = tVec0.arr[2] * tVec1.arr[0] - tVec0.arr[0] * tVec1.arr[2],
266 tRes.arr[2] = tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0]
267 }};
268 return tRes;
269}
270
274static inline double Juno_Vec3_F64_L2Norm(JUNO_VEC3_F64_T tVec0)
275{
276
277 return sqrtf(Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]) + Juno_Pow2(tVec0.arr[2]));
278}
279
284{
285 tVec0.arr[0] += tVec1.arr[0];
286 tVec0.arr[1] += tVec1.arr[1];
287 tVec0.arr[2] += tVec1.arr[2];
288 return tVec0;
289}
290
291
298{
299 tVec0.arr[0] -= tVec1.arr[0];
300 tVec0.arr[1] -= tVec1.arr[1];
301 tVec0.arr[2] -= tVec1.arr[2];
302 return tVec0;
303}
304
308static inline JUNO_VEC3_F32_T Juno_Vec3_F32_Mult(JUNO_VEC3_F32_T tVec0, float dScalar)
309{
310 tVec0.arr[0] *= dScalar;
311 tVec0.arr[1] *= dScalar;
312 tVec0.arr[2] *= dScalar;
313 return tVec0;
314}
315
319static inline float Juno_Vec3_F32_Dot(JUNO_VEC3_F32_T tVec0, JUNO_VEC3_F32_T tVec1)
320{
321 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1] + tVec0.arr[2] * tVec1.arr[2];
322}
323
329{
330 JUNO_VEC3_F32_T tRes = {{
331 tRes.arr[0] = tVec0.arr[1] * tVec1.arr[2] - tVec0.arr[2] * tVec1.arr[1],
332 tRes.arr[1] = tVec0.arr[2] * tVec1.arr[0] - tVec0.arr[0] * tVec1.arr[2],
333 tRes.arr[2] = tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0]
334 }};
335 return tRes;
336}
337
341static inline float Juno_Vec3_F32_L2Norm(JUNO_VEC3_F32_T tVec0)
342{
343
344 return sqrtf(Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]) + Juno_Pow2(tVec0.arr[2]));
345}
346
349{
350 tVec0.arr[0] += tVec1.arr[0];
351 tVec0.arr[1] += tVec1.arr[1];
352 tVec0.arr[2] += tVec1.arr[2];
353 return tVec0;
354}
355
356
363{
364 tVec0.arr[0] -= tVec1.arr[0];
365 tVec0.arr[1] -= tVec1.arr[1];
366 tVec0.arr[2] -= tVec1.arr[2];
367 return tVec0;
368}
369
373static inline JUNO_VEC3_I32_T Juno_Vec3_I32_Mult(JUNO_VEC3_I32_T tVec0, int32_t dScalar)
374{
375 tVec0.arr[0] *= dScalar;
376 tVec0.arr[1] *= dScalar;
377 tVec0.arr[2] *= dScalar;
378 return tVec0;
379}
380
384static inline int32_t Juno_Vec3_I32_Dot(JUNO_VEC3_I32_T tVec0, JUNO_VEC3_I32_T tVec1)
385{
386 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1] + tVec0.arr[2] * tVec1.arr[2];
387}
388
394{
395 JUNO_VEC3_I32_T tRes = {{
396 tVec0.arr[1] * tVec1.arr[2] - tVec0.arr[2] * tVec1.arr[1],
397 tVec0.arr[2] * tVec1.arr[0] - tVec0.arr[0] * tVec1.arr[2],
398 tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0]
399 }};
400 return tRes;
401}
402
406static inline float Juno_Vec3_I32_L2Norm(JUNO_VEC3_I32_T tVec0)
407{
408
409 return sqrtf(Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]) + Juno_Pow2(tVec0.arr[2]));
410}
411
414{
415 q0.arr[0] += q1.arr[0];
416 q0.arr[1] += q1.arr[1];
417 q0.arr[2] += q1.arr[2];
418 q0.arr[3] += q1.arr[3];
419 return q0;
420}
421
422
429{
430 q0.arr[0] -= q1.arr[0];
431 q0.arr[1] -= q1.arr[1];
432 q0.arr[2] -= q1.arr[2];
433 q0.arr[3] -= q1.arr[3];
434 return q0;
435}
436
441{
442 q0.arr[0] *= dScalar;
443 q0.arr[1] *= dScalar;
444 q0.arr[2] *= dScalar;
445 q0.arr[3] *= dScalar;
446 return q0;
447}
448
453{
454 JUNO_RQUAT_F64_T tRes = {{
455 q0.tQuat.s * q1.tQuat.s + q0.tQuat.i * q1.tQuat.i + q0.tQuat.j * q1.tQuat.j + q0.tQuat.k * q1.tQuat.k,
456 q0.tQuat.s * q1.tQuat.i + q0.tQuat.i * q1.tQuat.s + q0.tQuat.j * q1.tQuat.k + q0.tQuat.k * q1.tQuat.i,
457 q0.tQuat.s * q1.tQuat.j + q0.tQuat.i * q1.tQuat.k + q0.tQuat.j * q1.tQuat.s + q0.tQuat.k * q1.tQuat.j,
458 q0.tQuat.s * q1.tQuat.k + q0.tQuat.i * q1.tQuat.j + q0.tQuat.j * q1.tQuat.j + q0.tQuat.k * q1.tQuat.s
459 }};
460 return tRes;
461}
462
467{
468 q0.tQuat.i = -q0.tQuat.i;
469 q0.tQuat.j = -q0.tQuat.j;
470 q0.tQuat.k = -q0.tQuat.k;
471 return q0;
472}
473
475{
476 return Juno_Pow2(q0.arr[0]) + Juno_Pow2(q0.arr[1]) + Juno_Pow2(q0.arr[2]) + Juno_Pow2(q0.arr[3]);
477}
478
483{
484
485 return sqrt(Juno_RQuat_F64_L2Norm2(q0));
486}
487
495
503
504#ifdef __cplusplus
505}
506#endif
507#endif
static JUNO_VEC2_F64_T Juno_Vec2_F64_Sub(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
Definition juno_vec.h:54
static double Juno_Vec2_F64_L2Norm(JUNO_VEC2_F64_T tVec0)
Definition juno_vec.h:91
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Normalize(JUNO_RQUAT_F64_T q0)
Definition juno_vec.h:491
static double Juno_RQuat_F64_L2Norm(JUNO_RQUAT_F64_T q0)
Definition juno_vec.h:482
static JUNO_VEC3_I32_T Juno_Vec3_I32_Cross(JUNO_VEC3_I32_T tVec0, JUNO_VEC3_I32_T tVec1)
Definition juno_vec.h:393
static float Juno_Vec3_I32_L2Norm(JUNO_VEC3_I32_T tVec0)
Definition juno_vec.h:406
static double Juno_Vec3_F64_Dot(JUNO_VEC3_F64_T tVec0, JUNO_VEC3_F64_T tVec1)
Definition juno_vec.h:252
static JUNO_VEC2_F32_T Juno_Vec2_F32_Mult(JUNO_VEC2_F32_T tVec0, float dScalar)
Definition juno_vec.h:123
static JUNO_VEC2_F64_T Juno_Vec2_F64_Mult(JUNO_VEC2_F64_T tVec0, double dScalar)
Definition juno_vec.h:64
static JUNO_VEC3_I32_T Juno_Vec3_I32_Add(JUNO_VEC3_I32_T tVec0, JUNO_VEC3_I32_T tVec1)
Add two vec2i's.
Definition juno_vec.h:348
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Recip(JUNO_RQUAT_F64_T q0)
Definition juno_vec.h:499
static float Juno_Vec2_F32_L2Norm(JUNO_VEC2_F32_T tVec0)
Definition juno_vec.h:150
static float Juno_Vec2_F32_Dot(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
Definition juno_vec.h:133
static double Juno_Vec2_F64_Cross(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
Definition juno_vec.h:83
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Add(JUNO_RQUAT_F64_T q0, JUNO_RQUAT_F64_T q1)
Add two rquaternions.
Definition juno_vec.h:413
static double Juno_RQuat_F64_L2Norm2(JUNO_RQUAT_F64_T q0)
Definition juno_vec.h:474
static float Juno_Vec2_I32_L2Norm(JUNO_VEC2_I32_T tVec0)
Definition juno_vec.h:207
static JUNO_VEC2_I32_T Juno_Vec2_I32_Sub(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
Definition juno_vec.h:170
static JUNO_VEC3_F32_T Juno_Vec3_F32_Add(JUNO_VEC3_F32_T tVec0, JUNO_VEC3_F32_T tVec1)
Definition juno_vec.h:283
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Sub(JUNO_RQUAT_F64_T q0, JUNO_RQUAT_F64_T q1)
Definition juno_vec.h:428
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Conj(JUNO_RQUAT_F64_T q0)
Definition juno_vec.h:466
static double Juno_Vec2_F64_Dot(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
Definition juno_vec.h:74
static JUNO_VEC3_F32_T Juno_Vec3_F32_Mult(JUNO_VEC3_F32_T tVec0, float dScalar)
Definition juno_vec.h:308
static JUNO_VEC2_F64_T Juno_Vec2_F64_Add(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
Definition juno_vec.h:41
static JUNO_VEC3_F64_T Juno_Vec3_F64_Sub(JUNO_VEC3_F64_T tVec0, JUNO_VEC3_F64_T tVec1)
Definition juno_vec.h:230
static JUNO_VEC2_I32_T Juno_Vec2_I32_Mult(JUNO_VEC2_I32_T tVec0, int32_t dScalar)
Definition juno_vec.h:180
static JUNO_VEC2_F32_T Juno_Vec2_F32_Add(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
Definition juno_vec.h:100
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Mult(JUNO_RQUAT_F64_T q0, double dScalar)
Definition juno_vec.h:440
static JUNO_RQUAT_F64_T Juno_RQuat_F64_HamProd(JUNO_RQUAT_F64_T q0, JUNO_RQUAT_F64_T q1)
Definition juno_vec.h:452
static JUNO_VEC2_F32_T Juno_Vec2_F32_Sub(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
Definition juno_vec.h:113
static float Juno_Vec2_F32_Cross(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
Definition juno_vec.h:142
static JUNO_VEC3_I32_T Juno_Vec3_I32_Mult(JUNO_VEC3_I32_T tVec0, int32_t dScalar)
Definition juno_vec.h:373
static float Juno_Vec3_F32_L2Norm(JUNO_VEC3_F32_T tVec0)
Definition juno_vec.h:341
static JUNO_VEC3_F32_T Juno_Vec3_F32_Cross(JUNO_VEC3_F32_T tVec0, JUNO_VEC3_F32_T tVec1)
Definition juno_vec.h:328
static int32_t Juno_Vec3_I32_Dot(JUNO_VEC3_I32_T tVec0, JUNO_VEC3_I32_T tVec1)
Definition juno_vec.h:384
#define Juno_Pow2(d)
Definition juno_vec.h:34
static double Juno_Vec3_F64_L2Norm(JUNO_VEC3_F64_T tVec0)
Definition juno_vec.h:274
static JUNO_VEC2_I32_T Juno_Vec2_I32_Add(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
Add two vec2i's.
Definition juno_vec.h:157
static JUNO_VEC3_F32_T Juno_Vec3_F32_Sub(JUNO_VEC3_F32_T tVec0, JUNO_VEC3_F32_T tVec1)
Definition juno_vec.h:297
static JUNO_VEC3_I32_T Juno_Vec3_I32_Sub(JUNO_VEC3_I32_T tVec0, JUNO_VEC3_I32_T tVec1)
Definition juno_vec.h:362
static JUNO_VEC3_F64_T Juno_Vec3_F64_Mult(JUNO_VEC3_F64_T tVec0, double dScalar)
Definition juno_vec.h:241
static JUNO_VEC3_F64_T Juno_Vec3_F64_Cross(JUNO_VEC3_F64_T tVec0, JUNO_VEC3_F64_T tVec1)
Definition juno_vec.h:261
static int32_t Juno_Vec2_I32_Dot(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
Definition juno_vec.h:190
static JUNO_VEC3_F64_T Juno_Vec3_F64_Add(JUNO_VEC3_F64_T tVec0, JUNO_VEC3_F64_T tVec1)
Definition juno_vec.h:216
static float Juno_Vec3_F32_Dot(JUNO_VEC3_F32_T tVec0, JUNO_VEC3_F32_T tVec1)
Definition juno_vec.h:319
static int32_t Juno_Vec2_I32_Cross(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
Definition juno_vec.h:199
Right-handed quaternion (double precision).
Definition juno_vec_types.h:651
double arr[4]
Definition juno_vec_types.h:658
double k
Definition juno_vec_types.h:656
struct JUNO_RQUAT_F64_TAG::@0 tQuat
double j
Definition juno_vec_types.h:655
double s
Definition juno_vec_types.h:653
double i
Definition juno_vec_types.h:654
Definition juno_vec_types.h:125
float arr[2]
Definition juno_vec_types.h:128
2D vector union supporting Cartesian, polar, and array access (double precision).
Definition juno_vec_types.h:68
double arr[2]
Definition juno_vec_types.h:71
2D vector union supporting Cartesian, polar, and array access (32-bit integer).
Definition juno_vec_types.h:182
int32_t arr[2]
Definition juno_vec_types.h:185
3D vector union supporting Cartesian, spherical, and array access (float32 precision).
Definition juno_vec_types.h:300
float arr[3]
Definition juno_vec_types.h:303
3D vector union supporting Cartesian, spherical, and array access (double precision).
Definition juno_vec_types.h:241
double arr[3]
Definition juno_vec_types.h:244
3D vector union supporting Cartesian, spherical, and array access (32-bit integer).
Definition juno_vec_types.h:359
int32_t arr[3]
Definition juno_vec_types.h:362