Vecmat 0.2.3
C math and linear algebra library for 2D/3D graphics, physics, and science.
Loading...
Searching...
No Matches
vector2i.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 (vector2i){.x = 0, .y = 0};
15}
16
23{
24 return (vector2i){.x = 1, .y = 1};
25}
26
34{
35 return (vector2i){.x = x, .y = 0};
36}
37
45{
46 return (vector2i){.x = 0, .y = y};
47}
48
56{
57 return (vector2i){.x = x, .y = 1};
58}
59
67{
68 return (vector2i){.x = 1, .y = y};
69}
70
81{
82 vector2i res;
83 vec2i_add_ptr(&res, &a, &b);
84 return res;
85}
86
97{
98 vector2i res;
99 vec2i_sub_ptr(&res, &a, &b);
100 return res;
101}
102
113{
114 vector2i res;
115 vec2i_mul_scalar_ptr(&res, &v, s);
116 return res;
117}
118
130{
131 vector2i res;
132 vec2i_div_scalar_ptr(&res, &v, s);
133 return res;
134}
135
146{
147 vector2i res;
148 vec2i_mul_ptr(&res, &a, &b);
149 return res;
150}
151
161{
162 vector2i res;
163 vec2i_neg_ptr(&res, &v);
164 return res;
165}
166
176{
177 vector2i res;
178 vec2i_abs_ptr(&res, &v);
179 return res;
180}
181
191{
192 vector2i res;
193 vec2i_normalize_ptr(&res, &v);
194 return res;
195}
196
207{
208 vector2i res;
209 vec2i_min_ptr(&res, &a, &b);
210 return res;
211}
212
223{
224 vector2i res;
225 vec2i_max_ptr(&res, &a, &b);
226 return res;
227}
228
238{
239 vector2i res;
240 vec2i_sign_ptr(&res, &v);
241 return res;
242}
243
253{
254 vector2i res;
255 vec2i_perpendicular_ptr(&res, &v);
256 return res;
257}
258
269{
270 vector2i res;
271 vec2i_cross_ptr(&res, &a, &b);
272 return res;
273}
274
283{
284 return a.x * b.x + a.y * b.y;
285}
286
294{
295 return VECMAT_SQRT(vec2i_dot(v, v));
296}
297
306{
307 const vm_int_t dx = a.x - b.x;
308 const vm_int_t dy = a.y - b.y;
309 return VECMAT_SQRT(dx * dx + dy * dy);
310}
311
323{
324 const vm_float_t dot = vec2i_dot(a, b);
325 const vm_float_t len_a = vec2i_length(a);
326 const vm_float_t len_b = vec2i_length(b);
327 if (len_a == 0.0f || len_b == 0.0f) return 0.0f;
328
329 return VECMAT_ATAN2(a.x * b.y - a.y * b.x, dot); // atan2 for signed angle
330}
331
341{
342 if (v.y == 0) return 0.0f;
343 return (vm_float_t)v.x / (vm_float_t)v.y;
344}
345
357{
358 vector2i res;
359 vec2i_lerp_ptr(&res, &a, &b, t);
360 return res;
361}
362
373vector2i vec2i_clamp(const vector2i v, const vector2i min, const vector2i max)
374{
375 vector2i res;
376 vec2i_clamp_ptr(&res, &v, &min, &max);
377 return res;
378}
379
390{
391 vector2i res;
392 vec2i_div_ptr(&res, &a, &b);
393 return res;
394}
395
406{
407 vector2i res;
408 vec2i_add_scalar_ptr(&res, &v, s);
409 return res;
410}
411
422{
423 vector2i res;
424 vec2i_sub_scalar_ptr(&res, &v, s);
425 return res;
426}
427
438{
439 vector2i res;
440 vec2i_mod_ptr(&res, &a, &b);
441 return res;
442}
443
454{
455 vector2i res;
456 vec2i_div_floor_ptr(&res, &a, &b);
457 return res;
458}
459
469vector2i vec2i_wrap(const vector2i v, const vector2i period)
470{
471 vector2i res;
472 vec2i_wrap_ptr(&res, &v, &period);
473 return res;
474}
475
485{
486 return (vector2i){.x = s, .y = s};
487}
488
499{
500 vector3i res;
501 vec2i_to_vec3i_ptr(&res, &v, z);
502 return res;
503}
504
514{
515 vector2 res;
517 return res;
518}
519
528{
529 return a.x * b.y - a.y * b.x;
530}
531
539{
540 return vec2i_dot(v, v);
541}
542
551{
552 const vm_int_t dx = a.x - b.x;
553 const vm_int_t dy = a.y - b.y;
554 return dx * dx + dy * dy;
555}
556
564{
565 const vm_int_t ax = v.x < 0 ? -v.x : v.x;
566 const vm_int_t ay = v.y < 0 ? -v.y : v.y;
567 return ax + ay;
568}
569
577{
578 const vm_int_t ax = v.x < 0 ? -v.x : v.x;
579 const vm_int_t ay = v.y < 0 ? -v.y : v.y;
580 return ax > ay ? ax : ay;
581}
582
590{
591 return v.x < v.y ? v.x : v.y;
592}
593
601{
602 return v.x > v.y ? v.x : v.y;
603}
604
612{
613 return v.x + v.y;
614}
615
623{
624 return v.x == 0 && v.y == 0;
625}
vm_int_t y
Definition vecmat.h:165
vm_int_t x
Definition vecmat.h:164
void vec2i_perpendicular_ptr(vector2i *res, const vector2i *v)
Computes the perpendicular vector to v (90 degrees counterclockwise rotation), storing the result in ...
void vec2i_div_floor_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Component-wise floored division of a by b.
void vec2i_sub_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Subtracts vector b from vector a component-wise, storing the result in res.
void vec2i_div_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Divides two vectors component-wise.
void vec2i_min_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Computes the component-wise minimum of vectors a and b, storing the result in res.
void vec2i_neg_ptr(vector2i *res, const vector2i *v)
Negates the components of vector v, storing the result in res.
void vec2i_mul_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Multiplies vectors a and b component-wise (Hadamard product), storing the result in res.
void vec2i_sub_scalar_ptr(vector2i *res, const vector2i *v, vm_int_t s)
Subtracts a scalar from each component.
void vec2i_abs_ptr(vector2i *res, const vector2i *v)
Computes the absolute values of the components of vector v (using int abs), storing the result in res...
void vec2i_mod_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Component-wise floor modulo of a by b.
void vec2i_normalize_ptr(vector2i *res, const vector2i *v)
Normalizes vector v to approximate unit length (float length computation, truncated to int),...
void vec2i_lerp_ptr(vector2i *res, const vector2i *a, const vector2i *b, vm_float_t t)
Linearly interpolates from a to b by t.
void vec2i_clamp_ptr(vector2i *res, const vector2i *v, const vector2i *min, const vector2i *max)
Clamps each component between min and max.
void vec2i_add_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Adds vectors a and b component-wise, storing the result in res.
void vec2i_mul_scalar_ptr(vector2i *res, const vector2i *v, vm_int_t s)
Multiplies vector v by scalar s component-wise, storing the result in res.
void vec2i_add_scalar_ptr(vector2i *res, const vector2i *v, vm_int_t s)
Adds a scalar to each component.
double vm_float_t
Definition vecmat.h:79
#define VECMAT_SQRT(x)
Definition vecmat.h:414
void vec2i_normalize_to_vec2_ptr(vector2 *res, const vector2i *v)
Converts to a unit-length vector2.
void vec2i_wrap_ptr(vector2i *res, const vector2i *v, const vector2i *period)
Wraps each component of v into [0, period).
void vec2i_max_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Computes the component-wise maximum of vectors a and b, storing the result in res.
int8_t vm_int_t
Definition vecmat.h:103
void vec2i_to_vec3i_ptr(vector3i *res, const vector2i *v, vm_int_t z)
Converts a vector4i to a vector3i by dropping w.
void vec2i_cross_ptr(vector2i *res, const vector2i *a, const vector2i *b)
Computes the 2D cross-product of a and b, storing the scalar value in res->x and 0 in res->y.
#define VECMAT_ATAN2(y, x)
Definition vecmat.h:421
void vec2i_sign_ptr(vector2i *res, const vector2i *v)
Sets each component of res to the sign of the corresponding component in v (+1, -1,...
void vec2i_div_scalar_ptr(vector2i *res, const vector2i *v, vm_int_t s)
Divides vector v by scalar s component-wise (float division, truncated to int), storing the result in...
bool vec2i_is_zero(const vector2i v)
Returns true if every component is zero.
Definition vector2i.c:622
vector2 vec2i_normalize_to_vec2(const vector2i v)
Converts to a unit-length vector2.
Definition vector2i.c:513
vector2i vec2i_x_scale(const vm_int_t x)
Returns a vector2i representing x-axis scaling (y = 1).
Definition vector2i.c:55
vector2i vec2i_one(void)
Returns a vector2i with both components set to 1.
Definition vector2i.c:22
vm_float_t vec2i_angle(const vector2i a, const vector2i b)
Computes the signed angle between two vectors (in radians, range [-PI, PI]) using atan2(cross,...
Definition vector2i.c:322
vector2i vec2i_min(const vector2i a, const vector2i b)
Returns the component-wise minimum of two vectors.
Definition vector2i.c:206
vm_int_t vec2i_cross_scalar(const vector2i a, const vector2i b)
Returns the 2D cross product as a scalar (a.x*b.y - a.y*b.x).
Definition vector2i.c:527
vm_int_t vec2i_length_squared(const vector2i v)
Returns the squared Euclidean length.
Definition vector2i.c:538
vm_float_t vec2i_aspect_ratio(const vector2i v)
Computes the aspect ratio of the vector (x / y).
Definition vector2i.c:340
vm_int_t vec2i_sum(const vector2i v)
Returns the sum of all components.
Definition vector2i.c:611
vector2i vec2i_normalize(const vector2i v)
Normalizes the vector to approximate unit length (float length, truncated to int).
Definition vector2i.c:190
vm_int_t vec2i_dot(const vector2i a, const vector2i b)
Computes the dot product of two vectors.
Definition vector2i.c:282
vector2i vec2i_y_scale(const vm_int_t y)
Returns a vector2i representing y-axis scaling (x = 1).
Definition vector2i.c:66
vector2i vec2i_add(const vector2i a, const vector2i b)
Adds two vectors component-wise.
Definition vector2i.c:80
vm_int_t vec2i_distance_squared(const vector2i a, const vector2i b)
Returns the squared Euclidean distance between a and b.
Definition vector2i.c:550
vm_int_t vec2i_length_manhattan(const vector2i v)
Returns the Manhattan (L1) length.
Definition vector2i.c:563
vm_int_t vec2i_max_component(const vector2i v)
Returns the largest component.
Definition vector2i.c:600
vector2i vec2i_neg(const vector2i v)
Negates the vector (multiplies each component by -1).
Definition vector2i.c:160
vm_float_t vec2i_distance(const vector2i a, const vector2i b)
Computes the Euclidean distance between two vectors (treated as points).
Definition vector2i.c:305
vector2i vec2i_sub(const vector2i a, const vector2i b)
Subtracts the second vector from the first component-wise.
Definition vector2i.c:96
vector2i vec2i_sign(const vector2i v)
Returns the sign of each component (+1, -1, or 0).
Definition vector2i.c:237
vm_int_t vec2i_min_component(const vector2i v)
Returns the smallest component.
Definition vector2i.c:589
vector2i vec2i_lerp(const vector2i a, const vector2i b, const vm_float_t t)
Linearly interpolates from a to b by t.
Definition vector2i.c:356
vector2i vec2i_mul_scalar(const vector2i v, const vm_int_t s)
Multiplies a vector by a scalar component-wise.
Definition vector2i.c:112
vm_int_t vec2i_length_chebyshev(const vector2i v)
Returns the Chebyshev (L-inf) length.
Definition vector2i.c:576
vector2i vec2i_zero(void)
Returns a vector2i with both components set to 0.
Definition vector2i.c:12
vector2i vec2i_div(const vector2i a, const vector2i b)
Divides two vectors component-wise.
Definition vector2i.c:389
vector2i vec2i_add_scalar(const vector2i v, const vm_int_t s)
Adds a scalar to each component.
Definition vector2i.c:405
vector2i vec2i_splat(const vm_int_t s)
Returns a vector with every component set to s.
Definition vector2i.c:484
vector2i vec2i_max(const vector2i a, const vector2i b)
Returns the component-wise maximum of two vectors.
Definition vector2i.c:222
vector3i vec2i_to_vec3i(const vector2i v, const vm_int_t z)
Converts a vector2i to a vector3i using z.
Definition vector2i.c:498
vector2i vec2i_clamp(const vector2i v, const vector2i min, const vector2i max)
Clamps each component between min and max.
Definition vector2i.c:373
vector2i vec2i_wrap(const vector2i v, const vector2i period)
Wraps each component of v into [0, period).
Definition vector2i.c:469
vector2i vec2i_cross(const vector2i a, const vector2i b)
Computes the 2D cross-product as a vector.
Definition vector2i.c:268
vector2i vec2i_y_axis(const vm_int_t y)
Returns a vector2i along the y-axis (x = 0).
Definition vector2i.c:44
vector2i vec2i_sub_scalar(const vector2i v, const vm_int_t s)
Subtracts a scalar from each component.
Definition vector2i.c:421
vector2i vec2i_perpendicular(const vector2i v)
Returns the perpendicular vector (90 degrees counterclockwise).
Definition vector2i.c:252
vm_float_t vec2i_length(const vector2i v)
Computes the length (magnitude) of the vector.
Definition vector2i.c:293
vector2i vec2i_mod(const vector2i a, const vector2i b)
Component-wise floor modulo of a by b.
Definition vector2i.c:437
vector2i vec2i_x_axis(const vm_int_t x)
Returns a vector2i along the x-axis (y = 0).
Definition vector2i.c:33
vector2i vec2i_mul(const vector2i a, const vector2i b)
Multiplies two vectors component-wise (Hadamard product).
Definition vector2i.c:145
vector2i vec2i_div_scalar(const vector2i v, const vm_int_t s)
Divides a vector by a scalar component-wise (float division, truncated to int).
Definition vector2i.c:129
vector2i vec2i_abs(const vector2i v)
Returns the absolute values of each component.
Definition vector2i.c:175
vector2i vec2i_div_floor(const vector2i a, const vector2i b)
Component-wise floored division of a by b.
Definition vector2i.c:453