Vecmat 0.2.3
C math and linear algebra library for 2D/3D graphics, physics, and science.
Loading...
Searching...
No Matches
vector3i.c
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025-2026 Igal Alkon
2// SPDX-FileCopyrightText: 2026 ALKONTEK <git@alkontek.com>
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include <vecmat.h>
6
13{
14 return (vector3i){.x = 0, .y = 0, .z = 0};
15}
16
23{
24 return (vector3i){.x = 1, .y = 1, .z = 1};
25}
26
34{
35 return (vector3i){.x = x, .y = 0, .z = 0};
36}
37
45{
46 return (vector3i){.x = 0, .y = y, .z = 0};
47}
48
56{
57 return (vector3i){.x = 0, .y = 0, .z = z};
58}
59
67{
68 return (vector3i){.x = x, .y = 1, .z = 1};
69}
70
78{
79 return (vector3i){.x = 1, .y = y, .z = 1};
80}
81
89{
90 return (vector3i){.x = 1, .y = 1, .z = z};
91}
92
103{
104 vector3i res;
105 vec3i_add_ptr(&res, &a, &b);
106 return res;
107}
108
119{
120 vector3i res;
121 vec3i_sub_ptr(&res, &a, &b);
122 return res;
123}
124
135{
136 vector3i res;
137 vec3i_mul_scalar_ptr(&res, &v, s);
138 return res;
139}
140
151{
152 vector3i res;
153 vec3i_div_scalar_ptr(&res, &v, s);
154 return res;
155}
156
167{
168 vector3i res;
169 vec3i_mul_ptr(&res, &a, &b);
170 return res;
171}
172
182{
183 vector3i res;
184 vec3i_neg_ptr(&res, &v);
185 return res;
186}
187
197{
198 vector3i res;
199 vec3i_abs_ptr(&res, &v);
200 return res;
201}
202
213{
214 vector3i res;
215 vec3i_cross_ptr(&res, &a, &b);
216 return res;
217}
218
228{
229 vector3i res;
230 vec3i_normalize_ptr(&res, &v);
231 return res;
232}
233
244{
245 vector3i res;
246 vec3i_min_ptr(&res, &a, &b);
247 return res;
248}
249
260{
261 vector3i res;
262 vec3i_max_ptr(&res, &a, &b);
263 return res;
264}
265
275{
276 vector3i res;
277 vec3i_sign_ptr(&res, &v);
278 return res;
279}
280
292{
293 vector3i res;
294 vec3i_lerp_ptr(&res, &a, &b, t);
295 return res;
296}
297
308vector3i vec3i_clamp(const vector3i v, const vector3i min, const vector3i max)
309{
310 vector3i res;
311 vec3i_clamp_ptr(&res, &v, &min, &max);
312 return res;
313}
314
323{
324 return a.x * b.x + a.y * b.y + a.z * b.z;
325}
326
334 return VECMAT_SQRT(vec3i_dot(v, v));
335}
336
345{
346 return vec3i_length(vec3i_sub(a, b));
347}
348
357{
358 const vm_float_t dot = vec3i_dot(a, b);
359 const vm_float_t len_a = vec3i_length(a);
360 const vm_float_t len_b = vec3i_length(b);
361 if (len_a == 0.0f || len_b == 0.0f) return 0.0f;
362 return VECMAT_ACOS(dot / (len_a * len_b));
363}
364
375{
376 vector3i res;
377 vec3i_div_ptr(&res, &a, &b);
378 return res;
379}
380
391{
392 vector3i res;
393 vec3i_add_scalar_ptr(&res, &v, s);
394 return res;
395}
396
407{
408 vector3i res;
409 vec3i_sub_scalar_ptr(&res, &v, s);
410 return res;
411}
412
423{
424 vector3i res;
425 vec3i_mod_ptr(&res, &a, &b);
426 return res;
427}
428
439{
440 vector3i res;
441 vec3i_div_floor_ptr(&res, &a, &b);
442 return res;
443}
444
454vector3i vec3i_wrap(const vector3i v, const vector3i period)
455{
456 vector3i res;
457 vec3i_wrap_ptr(&res, &v, &period);
458 return res;
459}
460
470{
471 return (vector3i){.x = s, .y = s, .z = s};
472}
473
484{
485 vector3i res;
486 vec3i_from_vec2i_ptr(&res, &v, z);
487 return res;
488}
489
499{
500 vector2i res;
501 vec3i_xy_ptr(&res, &v);
502 return res;
503}
504
514{
515 vector3 res;
517 return res;
518}
519
527{
528 return vec3i_dot(v, v);
529}
530
539{
540 const vm_int_t dx = a.x - b.x;
541 const vm_int_t dy = a.y - b.y;
542 const vm_int_t dz = a.z - b.z;
543 return dx * dx + dy * dy + dz * dz;
544}
545
553{
554 const vm_int_t ax = v.x < 0 ? -v.x : v.x;
555 const vm_int_t ay = v.y < 0 ? -v.y : v.y;
556 const vm_int_t az = v.z < 0 ? -v.z : v.z;
557 return ax + ay + az;
558}
559
567{
568 const vm_int_t ax = v.x < 0 ? -v.x : v.x;
569 const vm_int_t ay = v.y < 0 ? -v.y : v.y;
570 const vm_int_t az = v.z < 0 ? -v.z : v.z;
571 const vm_int_t m = ax > ay ? ax : ay;
572 return m > az ? m : az;
573}
574
582{
583 const vm_int_t m = v.x < v.y ? v.x : v.y;
584 return m < v.z ? m : v.z;
585}
586
594{
595 const vm_int_t m = v.x > v.y ? v.x : v.y;
596 return m > v.z ? m : v.z;
597}
598
606{
607 return v.x + v.y + v.z;
608}
609
617{
618 return v.x == 0 && v.y == 0 && v.z == 0;
619}
vm_int_t x
Definition vecmat.h:174
vm_int_t y
Definition vecmat.h:175
vm_int_t z
Definition vecmat.h:176
void vec3i_cross_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the cross-product of two vector3i.
void vec3i_wrap_ptr(vector3i *res, const vector3i *v, const vector3i *period)
Wraps each component of v into [0, period).
void vec3i_clamp_ptr(vector3i *res, const vector3i *v, const vector3i *min, const vector3i *max)
Clamps each component of a vector3i between corresponding min and max values.
void vec3i_mod_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Component-wise floor modulo of a by b.
void vec3i_add_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the component-wise sum of two vector3i.
void vec3i_sign_ptr(vector3i *res, const vector3i *v)
Computes the sign of each component of a vector3i (-1, 0, or 1).
void vec3i_normalize_ptr(vector3i *res, const vector3i *v)
Normalizes a vector3i to approximate unit length.
void vec3i_max_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the component-wise maximum of two vector3i.
void vec3i_div_floor_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Component-wise floored division of a by b.
void vec3i_abs_ptr(vector3i *res, const vector3i *v)
Computes the absolute value of each component of a vector3i.
#define VECMAT_ACOS(x)
Definition vecmat.h:419
void vec3i_div_scalar_ptr(vector3i *res, const vector3i *v, vm_int_t s)
Scales a vector3i by the inverse of an integer scalar.
void vec3i_from_vec2i_ptr(vector3i *res, const vector2i *v, vm_int_t z)
Builds a vector3i from a vector2i and z.
void vec3i_mul_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the component-wise product (Hadamard) of two vector3i.
void vec3i_xy_ptr(vector2i *res, const vector3i *v)
Returns the x and y components as a 2D vector.
void vec3i_add_scalar_ptr(vector3i *res, const vector3i *v, vm_int_t s)
Adds a scalar to each component.
void vec3i_div_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Divides two vectors component-wise.
void vec3i_mul_scalar_ptr(vector3i *res, const vector3i *v, vm_int_t s)
Scales a vector3i by an integer scalar.
double vm_float_t
Definition vecmat.h:79
#define VECMAT_SQRT(x)
Definition vecmat.h:414
void vec3i_lerp_ptr(vector3i *res, const vector3i *a, const vector3i *b, vm_float_t t)
Performs linear interpolation between two vector3i.
void vec3i_min_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the component-wise minimum of two vector3i.
void vec3i_neg_ptr(vector3i *res, const vector3i *v)
Negates a vector3i (multiplies by -1).
void vec3i_sub_scalar_ptr(vector3i *res, const vector3i *v, vm_int_t s)
Subtracts a scalar from each component.
int8_t vm_int_t
Definition vecmat.h:103
void vec3i_sub_ptr(vector3i *res, const vector3i *a, const vector3i *b)
Computes the component-wise difference of two vector3i (a minus b).
void vec3i_normalize_to_vec3_ptr(vector3 *res, const vector3i *v)
Converts to a unit-length vector3.
vector3i vec3i_y_axis(const vm_int_t y)
Returns a vector3i along the y-axis.
Definition vector3i.c:44
vector3i vec3i_normalize(const vector3i v)
Normalizes a vector3i to unit length.
Definition vector3i.c:227
vector3i vec3i_lerp(const vector3i a, const vector3i b, const vm_float_t t)
Linearly interpolates between two vector3i.
Definition vector3i.c:291
vector3i vec3i_one(void)
Returns a vector3i with all components set to 1.
Definition vector3i.c:22
vector3 vec3i_normalize_to_vec3(const vector3i v)
Converts to a unit-length vector3.
Definition vector3i.c:513
vector3i vec3i_cross(const vector3i a, const vector3i b)
Computes the cross-product of two vector3i.
Definition vector3i.c:212
vector3i vec3i_sub(const vector3i a, const vector3i b)
Component-wise subtraction of two vectors.
Definition vector3i.c:118
bool vec3i_is_zero(const vector3i v)
Returns true if every component is zero.
Definition vector3i.c:616
vector3i vec3i_sub_scalar(const vector3i v, const vm_int_t s)
Subtracts a scalar from each component.
Definition vector3i.c:406
vector3i vec3i_max(const vector3i a, const vector3i b)
Computes the component-wise maximum of two vector3i.
Definition vector3i.c:259
vector3i vec3i_y_scale(const vm_int_t y)
Returns a vector3i for scaling along the y-axis.
Definition vector3i.c:77
vm_int_t vec3i_length_squared(const vector3i v)
Returns the squared Euclidean length.
Definition vector3i.c:526
vm_int_t vec3i_dot(const vector3i a, const vector3i b)
Computes the dot product of two vector3i.
Definition vector3i.c:322
vector3i vec3i_div_scalar(const vector3i v, const vm_int_t s)
Component-wise division of vector by scalar.
Definition vector3i.c:150
vm_float_t vec3i_angle(const vector3i a, const vector3i b)
Computes the angle between two non-zero vector3i in radians.
Definition vector3i.c:356
vector3i vec3i_div_floor(const vector3i a, const vector3i b)
Component-wise floored division of a by b.
Definition vector3i.c:438
vector3i vec3i_neg(const vector3i v)
Negation of a vector.
Definition vector3i.c:181
vector3i vec3i_clamp(const vector3i v, const vector3i min, const vector3i max)
Clamps a vector3i between min and max per component.
Definition vector3i.c:308
vector3i vec3i_min(const vector3i a, const vector3i b)
Computes the component-wise minimum of two vector3i.
Definition vector3i.c:243
vm_int_t vec3i_length_manhattan(const vector3i v)
Returns the Manhattan (L1) length.
Definition vector3i.c:552
vm_int_t vec3i_min_component(const vector3i v)
Returns the smallest component.
Definition vector3i.c:581
vector3i vec3i_x_scale(const vm_int_t x)
Returns a vector3i for scaling along the x-axis.
Definition vector3i.c:66
vector3i vec3i_zero(void)
Returns a zero-initialized vector3i.
Definition vector3i.c:12
vector3i vec3i_z_axis(const vm_int_t z)
Returns a vector3i along the z-axis.
Definition vector3i.c:55
vector3i vec3i_div(const vector3i a, const vector3i b)
Divides two vectors component-wise.
Definition vector3i.c:374
vm_int_t vec3i_max_component(const vector3i v)
Returns the largest component.
Definition vector3i.c:593
vm_int_t vec3i_distance_squared(const vector3i a, const vector3i b)
Returns the squared Euclidean distance between a and b.
Definition vector3i.c:538
vector3i vec3i_wrap(const vector3i v, const vector3i period)
Wraps each component of v into [0, period).
Definition vector3i.c:454
vector3i vec3i_add_scalar(const vector3i v, const vm_int_t s)
Adds a scalar to each component.
Definition vector3i.c:390
vector3i vec3i_mul_scalar(const vector3i v, const vm_int_t s)
Component-wise multiplication of vector by scalar.
Definition vector3i.c:134
vector3i vec3i_x_axis(const vm_int_t x)
Returns a vector3i along the x-axis.
Definition vector3i.c:33
vector3i vec3i_z_scale(const vm_int_t z)
Returns a vector3i for scaling along the z-axis.
Definition vector3i.c:88
vector3i vec3i_abs(const vector3i v)
Computes the absolute value per component of a vector3i.
Definition vector3i.c:196
vector3i vec3i_from_vec2i(const vector2i v, const vm_int_t z)
Builds a vector3i from a vector2i and z.
Definition vector3i.c:483
vector3i vec3i_mod(const vector3i a, const vector3i b)
Component-wise floor modulo of a by b.
Definition vector3i.c:422
vector3i vec3i_sign(const vector3i v)
Computes the sign per component of a vector3i (-1, 0, or 1).
Definition vector3i.c:274
vm_int_t vec3i_sum(const vector3i v)
Returns the sum of all components.
Definition vector3i.c:605
vector3i vec3i_mul(const vector3i a, const vector3i b)
Component-wise multiplication of two vectors.
Definition vector3i.c:166
vm_float_t vec3i_distance(const vector3i a, const vector3i b)
Computes the Euclidean distance between two vector3i.
Definition vector3i.c:344
vm_int_t vec3i_length_chebyshev(const vector3i v)
Returns the Chebyshev (L-inf) length.
Definition vector3i.c:566
vector3i vec3i_splat(const vm_int_t s)
Returns a vector with every component set to s.
Definition vector3i.c:469
vector3i vec3i_add(const vector3i a, const vector3i b)
Component-wise addition of two vectors.
Definition vector3i.c:102
vector2i vec3i_xy(const vector3i v)
Returns the x and y components as a 2D vector.
Definition vector3i.c:498
vm_float_t vec3i_length(const vector3i v)
Computes the length (magnitude) of a vector3i.
Definition vector3i.c:333