LibJuno 1.0.1
LibJuno is a lightweight C11 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
29#ifndef JUNO_VEC_H
30#define JUNO_VEC_H
31
33#include <stdint.h>
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
45#define Juno_Pow2(d) (d*d)
52#define Juno_Pow3(d) (d*d*d)
59#define Juno_Pow4(d) (d*d*d*d)
60
68{
69 tVec0.arr[0] += tVec1.arr[0];
70 tVec0.arr[1] += tVec1.arr[1];
71 return tVec0;
72}
73
74
82{
83 tVec0.arr[0] -= tVec1.arr[0];
84 tVec0.arr[1] -= tVec1.arr[1];
85 return tVec0;
86}
87
94static inline JUNO_VEC2_F64_T Juno_Vec2_F64_Mult(JUNO_VEC2_F64_T tVec0, double dScalar)
95{
96 tVec0.arr[0] *= dScalar;
97 tVec0.arr[1] *= dScalar;
98 return tVec0;
99}
100
105static inline double Juno_Vec2_F64_Dot(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
106{
107 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1];
108}
109
115static inline double Juno_Vec2_F64_Cross(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
116{
117 return tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0];
118}
119
124static inline double Juno_Vec2_F64_L2Norm2(JUNO_VEC2_F64_T tVec0)
125{
126
127 return Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]);
128}
129
134{
135 tVec0.arr[0] += tVec1.arr[0];
136 tVec0.arr[1] += tVec1.arr[1];
137 return tVec0;
138}
139
140
145{
146 tVec0.arr[0] -= tVec1.arr[0];
147 tVec0.arr[1] -= tVec1.arr[1];
148 return tVec0;
149}
150
154static inline JUNO_VEC2_F32_T Juno_Vec2_F32_Mult(JUNO_VEC2_F32_T tVec0, float dScalar)
155{
156 tVec0.arr[0] *= dScalar;
157 tVec0.arr[1] *= dScalar;
158 return tVec0;
159}
160
164static inline float Juno_Vec2_F32_Dot(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
165{
166 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1];
167}
168
172static inline float Juno_Vec2_F32_Cross(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
173{
174 return tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0];
175}
176
180static inline float Juno_Vec2_F32_L2Norm2(JUNO_VEC2_F32_T tVec0)
181{
182
183 return Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]);
184}
185
190{
191 tVec0.arr[0] += tVec1.arr[0];
192 tVec0.arr[1] += tVec1.arr[1];
193 return tVec0;
194}
195
196
201{
202 tVec0.arr[0] -= tVec1.arr[0];
203 tVec0.arr[1] -= tVec1.arr[1];
204 return tVec0;
205}
206
210static inline JUNO_VEC2_I32_T Juno_Vec2_I32_Mult(JUNO_VEC2_I32_T tVec0, int32_t dScalar)
211{
212 tVec0.arr[0] *= dScalar;
213 tVec0.arr[1] *= dScalar;
214 return tVec0;
215}
216
220static inline int32_t Juno_Vec2_I32_Dot(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
221{
222 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1];
223}
224
228static inline int32_t Juno_Vec2_I32_Cross(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
229{
230 return tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0];
231}
232
237static inline float Juno_Vec2_I32_L2Norm2(JUNO_VEC2_I32_T tVec0)
238{
239
240 return Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]);
241}
242
247{
248 tVec0.arr[0] += tVec1.arr[0];
249 tVec0.arr[1] += tVec1.arr[1];
250 tVec0.arr[2] += tVec1.arr[2];
251 return tVec0;
252}
253
254
259{
260 tVec0.arr[0] -= tVec1.arr[0];
261 tVec0.arr[1] -= tVec1.arr[1];
262 tVec0.arr[2] -= tVec1.arr[2];
263 return tVec0;
264}
265
269static inline JUNO_VEC3_F64_T Juno_Vec3_F64_Mult(JUNO_VEC3_F64_T tVec0, double dScalar)
270{
271 tVec0.arr[0] *= dScalar;
272 tVec0.arr[1] *= dScalar;
273 tVec0.arr[2] *= dScalar;
274 return tVec0;
275}
276
280static inline double Juno_Vec3_F64_Dot(JUNO_VEC3_F64_T tVec0, JUNO_VEC3_F64_T tVec1)
281{
282 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1] + tVec0.arr[2] * tVec1.arr[2];
283}
284
290{
291 JUNO_VEC3_F64_T tRes = {{
292 tVec0.arr[1] * tVec1.arr[2] - tVec0.arr[2] * tVec1.arr[1],
293 tVec0.arr[2] * tVec1.arr[0] - tVec0.arr[0] * tVec1.arr[2],
294 tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0]
295 }};
296 return tRes;
297}
298
302static inline double Juno_Vec3_F64_L2Norm2(JUNO_VEC3_F64_T tVec0)
303{
304
305 return Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]) + Juno_Pow2(tVec0.arr[2]);
306}
307
312{
313 tVec0.arr[0] += tVec1.arr[0];
314 tVec0.arr[1] += tVec1.arr[1];
315 tVec0.arr[2] += tVec1.arr[2];
316 return tVec0;
317}
318
319
324{
325 tVec0.arr[0] -= tVec1.arr[0];
326 tVec0.arr[1] -= tVec1.arr[1];
327 tVec0.arr[2] -= tVec1.arr[2];
328 return tVec0;
329}
330
334static inline JUNO_VEC3_F32_T Juno_Vec3_F32_Mult(JUNO_VEC3_F32_T tVec0, float dScalar)
335{
336 tVec0.arr[0] *= dScalar;
337 tVec0.arr[1] *= dScalar;
338 tVec0.arr[2] *= dScalar;
339 return tVec0;
340}
341
345static inline float Juno_Vec3_F32_Dot(JUNO_VEC3_F32_T tVec0, JUNO_VEC3_F32_T tVec1)
346{
347 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1] + tVec0.arr[2] * tVec1.arr[2];
348}
349
354{
355 JUNO_VEC3_F32_T tRes = {{
356 tVec0.arr[1] * tVec1.arr[2] - tVec0.arr[2] * tVec1.arr[1],
357 tVec0.arr[2] * tVec1.arr[0] - tVec0.arr[0] * tVec1.arr[2],
358 tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0]
359 }};
360 return tRes;
361}
362
366static inline float Juno_Vec3_F32_L2Norm2(JUNO_VEC3_F32_T tVec0)
367{
368
369 return (Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]) + Juno_Pow2(tVec0.arr[2]));
370}
371
376{
377 tVec0.arr[0] += tVec1.arr[0];
378 tVec0.arr[1] += tVec1.arr[1];
379 tVec0.arr[2] += tVec1.arr[2];
380 return tVec0;
381}
382
383
388{
389 tVec0.arr[0] -= tVec1.arr[0];
390 tVec0.arr[1] -= tVec1.arr[1];
391 tVec0.arr[2] -= tVec1.arr[2];
392 return tVec0;
393}
394
398static inline JUNO_VEC3_I32_T Juno_Vec3_I32_Mult(JUNO_VEC3_I32_T tVec0, int32_t dScalar)
399{
400 tVec0.arr[0] *= dScalar;
401 tVec0.arr[1] *= dScalar;
402 tVec0.arr[2] *= dScalar;
403 return tVec0;
404}
405
409static inline int32_t Juno_Vec3_I32_Dot(JUNO_VEC3_I32_T tVec0, JUNO_VEC3_I32_T tVec1)
410{
411 return tVec0.arr[0] * tVec1.arr[0] + tVec0.arr[1] * tVec1.arr[1] + tVec0.arr[2] * tVec1.arr[2];
412}
413
418{
419 JUNO_VEC3_I32_T tRes = {{
420 tVec0.arr[1] * tVec1.arr[2] - tVec0.arr[2] * tVec1.arr[1],
421 tVec0.arr[2] * tVec1.arr[0] - tVec0.arr[0] * tVec1.arr[2],
422 tVec0.arr[0] * tVec1.arr[1] - tVec0.arr[1] * tVec1.arr[0]
423 }};
424 return tRes;
425}
426
430static inline float Juno_Vec3_I32_L2Norm2(JUNO_VEC3_I32_T tVec0)
431{
432
433 return (Juno_Pow2(tVec0.arr[0]) + Juno_Pow2(tVec0.arr[1]) + Juno_Pow2(tVec0.arr[2]));
434}
435
441{
442 q0.arr[0] += q1.arr[0];
443 q0.arr[1] += q1.arr[1];
444 q0.arr[2] += q1.arr[2];
445 q0.arr[3] += q1.arr[3];
446 return q0;
447}
448
449
454{
455 q0.arr[0] -= q1.arr[0];
456 q0.arr[1] -= q1.arr[1];
457 q0.arr[2] -= q1.arr[2];
458 q0.arr[3] -= q1.arr[3];
459 return q0;
460}
461
466{
467 q0.arr[0] *= dScalar;
468 q0.arr[1] *= dScalar;
469 q0.arr[2] *= dScalar;
470 q0.arr[3] *= dScalar;
471 return q0;
472}
473
485{
486 JUNO_RQUAT_F64_T tRes = {{
487 q0.tQuat.s * q1.tQuat.s - q0.tQuat.i * q1.tQuat.i - q0.tQuat.j * q1.tQuat.j - q0.tQuat.k * q1.tQuat.k,
488 q0.tQuat.s * q1.tQuat.i + q0.tQuat.i * q1.tQuat.s + q0.tQuat.j * q1.tQuat.k - q0.tQuat.k * q1.tQuat.j,
489 q0.tQuat.s * q1.tQuat.j - q0.tQuat.i * q1.tQuat.k + q0.tQuat.j * q1.tQuat.s + q0.tQuat.k * q1.tQuat.i,
490 q0.tQuat.s * q1.tQuat.k + q0.tQuat.i * q1.tQuat.j - q0.tQuat.j * q1.tQuat.i + q0.tQuat.k * q1.tQuat.s
491 }};
492 return tRes;
493}
494
500{
501 q0.tQuat.i = -q0.tQuat.i;
502 q0.tQuat.j = -q0.tQuat.j;
503 q0.tQuat.k = -q0.tQuat.k;
504 return q0;
505}
506
511{
512 return Juno_Pow2(q0.arr[0]) + Juno_Pow2(q0.arr[1]) + Juno_Pow2(q0.arr[2]) + Juno_Pow2(q0.arr[3]);
513}
514
515
524
525#ifdef __cplusplus
526}
527#endif
528#endif
static JUNO_VEC2_F64_T Juno_Vec2_F64_Sub(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
Subtract two 2D vectors (double).
Definition juno_vec.h:81
static JUNO_VEC3_I32_T Juno_Vec3_I32_Cross(JUNO_VEC3_I32_T tVec0, JUNO_VEC3_I32_T tVec1)
3D cross product (int32).
Definition juno_vec.h:417
static float Juno_Vec2_F32_L2Norm2(JUNO_VEC2_F32_T tVec0)
Squared L2 norm of a 2D vector (float).
Definition juno_vec.h:180
static double Juno_Vec3_F64_Dot(JUNO_VEC3_F64_T tVec0, JUNO_VEC3_F64_T tVec1)
Dot product of two 3D vectors (double).
Definition juno_vec.h:280
static JUNO_VEC2_F32_T Juno_Vec2_F32_Mult(JUNO_VEC2_F32_T tVec0, float dScalar)
Scale a 2D vector by a scalar (float).
Definition juno_vec.h:154
static JUNO_VEC2_F64_T Juno_Vec2_F64_Mult(JUNO_VEC2_F64_T tVec0, double dScalar)
Scale a 2D vector by a scalar (double).
Definition juno_vec.h:94
static JUNO_VEC3_I32_T Juno_Vec3_I32_Add(JUNO_VEC3_I32_T tVec0, JUNO_VEC3_I32_T tVec1)
Add two 3D vectors (int32).
Definition juno_vec.h:375
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Recip(JUNO_RQUAT_F64_T q0)
Multiplicative inverse (reciprocal) of a quaternion (double).
Definition juno_vec.h:520
static float Juno_Vec2_F32_Dot(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
Dot product of two 2D vectors (float).
Definition juno_vec.h:164
static double Juno_Vec2_F64_Cross(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
2D cross product (double).
Definition juno_vec.h:115
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Add(JUNO_RQUAT_F64_T q0, JUNO_RQUAT_F64_T q1)
Add two real quaternions (double).
Definition juno_vec.h:440
static float Juno_Vec3_F32_L2Norm2(JUNO_VEC3_F32_T tVec0)
Squared L2 norm of a 3D vector (float).
Definition juno_vec.h:366
static double Juno_RQuat_F64_L2Norm2(JUNO_RQUAT_F64_T q0)
Squared L2 norm of a quaternion (double).
Definition juno_vec.h:510
static double Juno_Vec2_F64_L2Norm2(JUNO_VEC2_F64_T tVec0)
Squared L2 norm of a 2D vector (double).
Definition juno_vec.h:124
static float Juno_Vec2_I32_L2Norm2(JUNO_VEC2_I32_T tVec0)
Squared L2 norm of a 2D vector (int32 inputs; float return).
Definition juno_vec.h:237
static float Juno_Vec3_I32_L2Norm2(JUNO_VEC3_I32_T tVec0)
Squared L2 norm of a 3D vector (int32 inputs; float return).
Definition juno_vec.h:430
static JUNO_VEC2_I32_T Juno_Vec2_I32_Sub(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
Subtract two 2D vectors (int32).
Definition juno_vec.h:200
static JUNO_VEC3_F32_T Juno_Vec3_F32_Add(JUNO_VEC3_F32_T tVec0, JUNO_VEC3_F32_T tVec1)
Add two 3D vectors (float).
Definition juno_vec.h:311
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Sub(JUNO_RQUAT_F64_T q0, JUNO_RQUAT_F64_T q1)
Subtract two real quaternions (double).
Definition juno_vec.h:453
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Conj(JUNO_RQUAT_F64_T q0)
Conjugate of a right-handed real quaternion (double).
Definition juno_vec.h:499
static double Juno_Vec2_F64_Dot(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
Dot product of two 2D vectors (double).
Definition juno_vec.h:105
static JUNO_VEC3_F32_T Juno_Vec3_F32_Mult(JUNO_VEC3_F32_T tVec0, float dScalar)
Scale a 3D vector by a scalar (float).
Definition juno_vec.h:334
static JUNO_VEC2_F64_T Juno_Vec2_F64_Add(JUNO_VEC2_F64_T tVec0, JUNO_VEC2_F64_T tVec1)
Add two 2D vectors (double).
Definition juno_vec.h:67
static JUNO_VEC3_F64_T Juno_Vec3_F64_Sub(JUNO_VEC3_F64_T tVec0, JUNO_VEC3_F64_T tVec1)
Subtract two 3D vectors (double).
Definition juno_vec.h:258
static JUNO_VEC2_I32_T Juno_Vec2_I32_Mult(JUNO_VEC2_I32_T tVec0, int32_t dScalar)
Scale a 2D vector by a scalar (int32).
Definition juno_vec.h:210
static JUNO_VEC2_F32_T Juno_Vec2_F32_Add(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
Add two 2D vectors (float).
Definition juno_vec.h:133
static JUNO_RQUAT_F64_T Juno_RQuat_F64_Mult(JUNO_RQUAT_F64_T q0, double dScalar)
Scale a real quaternion by a scalar (double).
Definition juno_vec.h:465
static JUNO_RQUAT_F64_T Juno_RQuat_F64_HamProd(JUNO_RQUAT_F64_T q0, JUNO_RQUAT_F64_T q1)
Hamilton product of two right-handed real quaternions (double).
Definition juno_vec.h:484
static JUNO_VEC2_F32_T Juno_Vec2_F32_Sub(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
Subtract two 2D vectors (float).
Definition juno_vec.h:144
static float Juno_Vec2_F32_Cross(JUNO_VEC2_F32_T tVec0, JUNO_VEC2_F32_T tVec1)
2D cross product (float); returns pseudoscalar z-component.
Definition juno_vec.h:172
static JUNO_VEC3_I32_T Juno_Vec3_I32_Mult(JUNO_VEC3_I32_T tVec0, int32_t dScalar)
Scale a 3D vector by a scalar (int32).
Definition juno_vec.h:398
static JUNO_VEC3_F32_T Juno_Vec3_F32_Cross(JUNO_VEC3_F32_T tVec0, JUNO_VEC3_F32_T tVec1)
3D cross product (float).
Definition juno_vec.h:353
static int32_t Juno_Vec3_I32_Dot(JUNO_VEC3_I32_T tVec0, JUNO_VEC3_I32_T tVec1)
Dot product of two 3D vectors (int32).
Definition juno_vec.h:409
#define Juno_Pow2(d)
Square of a value.
Definition juno_vec.h:45
static JUNO_VEC2_I32_T Juno_Vec2_I32_Add(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
Add two 2D vectors (int32).
Definition juno_vec.h:189
static JUNO_VEC3_F32_T Juno_Vec3_F32_Sub(JUNO_VEC3_F32_T tVec0, JUNO_VEC3_F32_T tVec1)
Subtract two 3D vectors (float).
Definition juno_vec.h:323
static JUNO_VEC3_I32_T Juno_Vec3_I32_Sub(JUNO_VEC3_I32_T tVec0, JUNO_VEC3_I32_T tVec1)
Subtract two 3D vectors (int32).
Definition juno_vec.h:387
static JUNO_VEC3_F64_T Juno_Vec3_F64_Mult(JUNO_VEC3_F64_T tVec0, double dScalar)
Scale a 3D vector by a scalar (double).
Definition juno_vec.h:269
static JUNO_VEC3_F64_T Juno_Vec3_F64_Cross(JUNO_VEC3_F64_T tVec0, JUNO_VEC3_F64_T tVec1)
3D cross product (double).
Definition juno_vec.h:289
static int32_t Juno_Vec2_I32_Dot(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
Dot product of two 2D vectors (int32).
Definition juno_vec.h:220
static JUNO_VEC3_F64_T Juno_Vec3_F64_Add(JUNO_VEC3_F64_T tVec0, JUNO_VEC3_F64_T tVec1)
Add two 3D vectors (double).
Definition juno_vec.h:246
static float Juno_Vec3_F32_Dot(JUNO_VEC3_F32_T tVec0, JUNO_VEC3_F32_T tVec1)
Dot product of two 3D vectors (float).
Definition juno_vec.h:345
static int32_t Juno_Vec2_I32_Cross(JUNO_VEC2_I32_T tVec0, JUNO_VEC2_I32_T tVec1)
2D cross product (int32); returns pseudoscalar z-component.
Definition juno_vec.h:228
static double Juno_Vec3_F64_L2Norm2(JUNO_VEC3_F64_T tVec0)
Squared L2 norm of a 3D vector (double).
Definition juno_vec.h:302
Vector, matrix, and quaternion types and common result aliases.
Right-handed quaternion (double precision).
Definition juno_vec_types.h:674
double arr[4]
Definition juno_vec_types.h:681
double k
Definition juno_vec_types.h:679
struct JUNO_RQUAT_F64_TAG::@0 tQuat
double j
Definition juno_vec_types.h:678
double s
Definition juno_vec_types.h:676
double i
Definition juno_vec_types.h:677
2D vector union supporting Cartesian, polar, and array access (float32 precision).
Definition juno_vec_types.h:148
float arr[2]
Definition juno_vec_types.h:151
2D vector union supporting Cartesian, polar, and array access (double precision).
Definition juno_vec_types.h:91
double arr[2]
Definition juno_vec_types.h:94
2D vector union supporting Cartesian, polar, and array access (32-bit integer).
Definition juno_vec_types.h:205
int32_t arr[2]
Definition juno_vec_types.h:208
3D vector union supporting Cartesian, spherical, and array access (float32 precision).
Definition juno_vec_types.h:323
float arr[3]
Definition juno_vec_types.h:326
3D vector union supporting Cartesian, spherical, and array access (double precision).
Definition juno_vec_types.h:264
double arr[3]
Definition juno_vec_types.h:267
3D vector union supporting Cartesian, spherical, and array access (32-bit integer).
Definition juno_vec_types.h:382
int32_t arr[3]
Definition juno_vec_types.h:385