Work on vector 2.

This commit is contained in:
Relintai 2022-03-13 16:39:40 +01:00
parent e8bbb13f85
commit 840fef5041
3 changed files with 218 additions and 167 deletions

View File

@ -30,104 +30,109 @@
#include "vector2.h"
real_t Vector2::angle() const {
return Math::atan2(y, x);
real_t vector2_length(const Vector2 *v) {
return math_sqrtf(v->x * v->x + v->y * v->y);
}
real_t Vector2::length() const {
return Math::sqrt(x * x + y * y);
real_t vector2_length_squared(const Vector2 *v) {
return v->x * v->x + v->y * v->y;
}
real_t Vector2::length_squared() const {
return x * x + y * y;
}
void Vector2::normalize() {
real_t l = x * x + y * y;
void vector2_normalize(Vector2 *v) {
real_t l = v->x * v->x + v->y * v->y;
if (l != 0) {
l = Math::sqrt(l);
x /= l;
y /= l;
l = math_sqrtf(l);
v->x /= l;
v->y /= l;
}
}
Vector2 Vector2::normalized() const {
Vector2 v = *this;
v.normalize();
Vector2 vector2_normalized(Vector2 v) {
vector2_normalize(&v);
return v;
}
bool Vector2::is_normalized() const {
bool vector2_is_normalized(const Vector2 *v) {
// use length_squared() instead of length() to avoid sqrt(), makes it more stringent.
return Math::is_equal_approx(length_squared(), 1, (real_t)UNIT_EPSILON);
return math_is_equal_approxft(length_squared(v), 1, (real_t)UNIT_EPSILON);
}
real_t Vector2::distance_to(const Vector2 &p_vector2) const {
return Math::sqrt((x - p_vector2.x) * (x - p_vector2.x) + (y - p_vector2.y) * (y - p_vector2.y));
real_t vector2_dot(const Vector2 *self, const Vector2 *p_other) {
return self->x * p_other->x + self->y * p_other->y;
}
real_t Vector2::distance_squared_to(const Vector2 &p_vector2) const {
return (x - p_vector2.x) * (x - p_vector2.x) + (y - p_vector2.y) * (y - p_vector2.y);
real_t vector2_cross(const Vector2 *self, const Vector2 *p_other) {
return self->x * p_other->y - self->y * p_other->x;
}
real_t Vector2::angle_to(const Vector2 &p_vector2) const {
return Math::atan2(cross(p_vector2), dot(p_vector2));
real_t vector2_distance_to(const Vector2 *self, const Vector2 *p_vector2) {
return math_sqrtf((self->x - p_vector2->x) * (self->x - p_vector2->x) + (self->y - p_vector2->y) * (self->y - p_vector2->y));
}
real_t Vector2::angle_to_point(const Vector2 &p_vector2) const {
return Math::atan2(y - p_vector2.y, x - p_vector2.x);
real_t vector2_distance_squared_to(const Vector2 *self, const Vector2 *p_vector2) {
return (self->x - p_vector2->x) * (self->x - p_vector2->x) + (self->y - p_vector2->y) * (self->y - p_vector2->y);
}
real_t Vector2::dot(const Vector2 &p_other) const {
return x * p_other.x + y * p_other.y;
real_t vector2_angle_to(const Vector2 *self, const Vector2 *p_vector2) {
return math_atan2f(cross(self, p_vector2), dot(self, p_vector2));
}
real_t Vector2::cross(const Vector2 &p_other) const {
return x * p_other.y - y * p_other.x;
real_t vector2_angle_to_point(const Vector2 *self, const Vector2 *p_vector2) {
return math_atan2f(self->y - p_vector2->y, self->x - p_vector2->x);
}
Vector2 Vector2::sign() const {
/*
real_t vector2_angle() {
return Math::atan2(y, x);
}
Vector2 vector2_sign() {
return Vector2(SGN(x), SGN(y));
}
Vector2 Vector2::floor() const {
Vector2 vector2_floor() {
return Vector2(Math::floor(x), Math::floor(y));
}
Vector2 Vector2::ceil() const {
Vector2 vector2_ceil() {
return Vector2(Math::ceil(x), Math::ceil(y));
}
Vector2 Vector2::round() const {
Vector2 vector2_round() {
return Vector2(Math::round(x), Math::round(y));
}
Vector2 Vector2::rotated(real_t p_by) const {
Vector2 vector2_rotated(real_t p_by) {
Vector2 v;
v.set_rotation(angle() + p_by);
v *= length();
return v;
}
Vector2 Vector2::posmod(const real_t p_mod) const {
Vector2 vector2_posmod(const real_t p_mod) {
return Vector2(Math::fposmod(x, p_mod), Math::fposmod(y, p_mod));
}
Vector2 Vector2::posmodv(const Vector2 &p_modv) const {
Vector2 vector2_posmodv(const Vector2 &p_modv) {
return Vector2(Math::fposmod(x, p_modv.x), Math::fposmod(y, p_modv.y));
}
Vector2 Vector2::project(const Vector2 &p_to) const {
Vector2 vector2_project(const Vector2 &p_to) {
return p_to * (dot(p_to) / p_to.length_squared());
}
Vector2 Vector2::snapped(const Vector2 &p_by) const {
Vector2 vector2_snapped(const Vector2 &p_by) {
return Vector2(
Math::stepify(x, p_by.x),
Math::stepify(y, p_by.y));
}
Vector2 Vector2::clamped(real_t p_len) const {
Vector2 vector2_clamped(real_t p_len) {
WARN_DEPRECATED_MSG("'Vector2.clamped()' is deprecated because it has been renamed to 'limit_length'.");
real_t l = length();
Vector2 v = *this;
@ -139,7 +144,7 @@ Vector2 Vector2::clamped(real_t p_len) const {
return v;
}
Vector2 Vector2::limit_length(const real_t p_len) const {
Vector2 vector2_limit_length(const real_t p_len) {
const real_t l = length();
Vector2 v = *this;
if (l > 0 && p_len < l) {
@ -150,7 +155,7 @@ Vector2 Vector2::limit_length(const real_t p_len) const {
return v;
}
Vector2 Vector2::cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_weight) const {
Vector2 vector2_cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_weight) const {
Vector2 p0 = p_pre_a;
Vector2 p1 = *this;
Vector2 p2 = p_b;
@ -169,7 +174,7 @@ Vector2 Vector2::cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, c
return out;
}
Vector2 Vector2::move_toward(const Vector2 &p_to, const real_t p_delta) const {
Vector2 vector2_move_toward(const Vector2 &p_to, const real_t p_delta) {
Vector2 v = *this;
Vector2 vd = p_to - v;
real_t len = vd.length();
@ -177,38 +182,38 @@ Vector2 Vector2::move_toward(const Vector2 &p_to, const real_t p_delta) const {
}
// slide returns the component of the vector along the given plane, specified by its normal vector.
Vector2 Vector2::slide(const Vector2 &p_normal) const {
Vector2 vector2_slide(const Vector2 &p_normal) {
#ifdef MATH_CHECKS
ERR_FAIL_COND_V_MSG(!p_normal.is_normalized(), Vector2(), "The normal Vector2 must be normalized.");
#endif
return *this - p_normal * this->dot(p_normal);
}
Vector2 Vector2::bounce(const Vector2 &p_normal) const {
Vector2 vector2_bounce(const Vector2 &p_normal) {
return -reflect(p_normal);
}
Vector2 Vector2::reflect(const Vector2 &p_normal) const {
Vector2 vector2_reflect(const Vector2 &p_normal) {
#ifdef MATH_CHECKS
ERR_FAIL_COND_V_MSG(!p_normal.is_normalized(), Vector2(), "The normal Vector2 must be normalized.");
#endif
return 2 * p_normal * this->dot(p_normal) - *this;
}
bool Vector2::is_equal_approx(const Vector2 &p_v) const {
bool vector2_is_equal_approx(const Vector2 &p_v) {
return Math::is_equal_approx(x, p_v.x) && Math::is_equal_approx(y, p_v.y);
}
/* Vector2i */
// Vector2i
Vector2i Vector2i::operator+(const Vector2i &p_v) const {
Vector2i Vector2i::operator+(const Vector2i &p_v) {
return Vector2i(x + p_v.x, y + p_v.y);
}
void Vector2i::operator+=(const Vector2i &p_v) {
x += p_v.x;
y += p_v.y;
}
Vector2i Vector2i::operator-(const Vector2i &p_v) const {
Vector2i Vector2i::operator-(const Vector2i &p_v) {
return Vector2i(x - p_v.x, y - p_v.y);
}
void Vector2i::operator-=(const Vector2i &p_v) {
@ -216,11 +221,11 @@ void Vector2i::operator-=(const Vector2i &p_v) {
y -= p_v.y;
}
Vector2i Vector2i::operator*(const Vector2i &p_v1) const {
Vector2i Vector2i::operator*(const Vector2i &p_v1) {
return Vector2i(x * p_v1.x, y * p_v1.y);
};
Vector2i Vector2i::operator*(const int &rvalue) const {
Vector2i Vector2i::operator*(const int &rvalue) {
return Vector2i(x * rvalue, y * rvalue);
};
void Vector2i::operator*=(const int &rvalue) {
@ -228,11 +233,11 @@ void Vector2i::operator*=(const int &rvalue) {
y *= rvalue;
};
Vector2i Vector2i::operator/(const Vector2i &p_v1) const {
Vector2i Vector2i::operator/(const Vector2i &p_v1) {
return Vector2i(x / p_v1.x, y / p_v1.y);
};
Vector2i Vector2i::operator/(const int &rvalue) const {
Vector2i Vector2i::operator/(const int &rvalue) {
return Vector2i(x / rvalue, y / rvalue);
};
@ -241,13 +246,14 @@ void Vector2i::operator/=(const int &rvalue) {
y /= rvalue;
};
Vector2i Vector2i::operator-() const {
Vector2i Vector2i::operator-() {
return Vector2i(-x, -y);
}
bool Vector2i::operator==(const Vector2i &p_vec2) const {
bool Vector2i::operator==(const Vector2i &p_vec2) {
return x == p_vec2.x && y == p_vec2.y;
}
bool Vector2i::operator!=(const Vector2i &p_vec2) const {
bool Vector2i::operator!=(const Vector2i &p_vec2) {
return x != p_vec2.x || y != p_vec2.y;
}
*/

View File

@ -35,14 +35,14 @@
struct Vector2i;
struct _NO_DISCARD_CLASS_ Vector2 {
static const int AXIS_COUNT = 2;
static const int VECTOR2_AXIS_COUNT = 2;
enum Axis {
AXIS_X,
AXIS_Y,
enum Vector2Axis {
VECTOR2_AXIS_X,
VECTOR2_AXIS_Y,
};
typedef struct _NO_DISCARD_CLASS_ Vector2 {
union {
struct {
union {
@ -57,92 +57,126 @@ struct _NO_DISCARD_CLASS_ Vector2 {
real_t coord[2];
};
} Vector2;
_FORCE_INLINE_ real_t &operator[](int p_idx) {
DEV_ASSERT((unsigned int)p_idx < 2);
return coord[p_idx];
_FORCE_INLINE_ real_t vector2_get_axis(const Vector2 *v, int p_idx) {
//DEV_ASSERT((unsigned int)p_idx < 2);
return v->coord[p_idx];
}
/*
//not needed
_FORCE_INLINE_ const real_t &operator[](int p_idx) const {
DEV_ASSERT((unsigned int)p_idx < 2);
return coord[p_idx];
}
*/
_FORCE_INLINE_ void set_all(real_t p_value) {
x = y = p_value;
_FORCE_INLINE_ void vector2_set_all(Vector2 *self, real_t p_value) {
self->x = self->y = p_value;
}
_FORCE_INLINE_ int min_axis() const {
return x < y ? 0 : 1;
_FORCE_INLINE_ void vector2_set(Vector2 *self, real_t p_value_x, real_t p_value_y) {
self->x = p_value_x;
self->y = p_value_y;
}
_FORCE_INLINE_ int max_axis() const {
return x < y ? 1 : 0;
_FORCE_INLINE_ int vector2_min_axis(const Vector2 *v) {
return v->x < v->y ? 0 : 1;
}
void normalize();
Vector2 normalized() const;
bool is_normalized() const;
_FORCE_INLINE_ int vector2_max_axis(const Vector2 *v) {
return v->x < v->y ? 1 : 0;
}
real_t length() const;
real_t length_squared() const;
real_t length(const Vector2 *v);
real_t length_squared(const Vector2 *v);
real_t distance_to(const Vector2 &p_vector2) const;
real_t distance_squared_to(const Vector2 &p_vector2) const;
real_t angle_to(const Vector2 &p_vector2) const;
real_t angle_to_point(const Vector2 &p_vector2) const;
_FORCE_INLINE_ Vector2 direction_to(const Vector2 &p_to) const;
void vector2_normalize(Vector2 *v);
Vector2 vector2_normalized(Vector2 v);
bool vector2_is_normalized(const Vector2 *v);
real_t dot(const Vector2 &p_other) const;
real_t cross(const Vector2 &p_other) const;
Vector2 posmod(const real_t p_mod) const;
Vector2 posmodv(const Vector2 &p_modv) const;
Vector2 project(const Vector2 &p_to) const;
real_t dot(const Vector2 *self, const Vector2 *p_other);
real_t cross(const Vector2 *self, const Vector2 *p_other);
Vector2 plane_project(real_t p_d, const Vector2 &p_vec) const;
real_t vector2_distance_to(const Vector2 *self, const Vector2 *p_vector2);
real_t vector2_distance_squared_to(const Vector2 *self, const Vector2 *p_vector2);
real_t vector2_angle_to(const Vector2 *self, const Vector2 *p_vector2);
real_t vector2_angle_to_point(const Vector2 *self, const Vector2 *p_vector2);
Vector2 clamped(real_t p_len) const;
Vector2 limit_length(const real_t p_len = 1.0) const;
_FORCE_INLINE_ Vector2 vector2_direction_to(const Vector2 *self, const Vector2 *p_to) {
Vector2 ret;
vector2_set(&ret, p_to->x - self->x, p_to->y - self->y);
vector2_normalize(&ret);
return ret;
}
/*
Vector2 posmod(const real_t p_mod);
Vector2 posmodv(const Vector2 &p_modv);
Vector2 project(const Vector2 &p_to);
Vector2 plane_project(real_t p_d, const Vector2 &p_vec);
Vector2 clamped(real_t p_len);
Vector2 limit_length(const real_t p_len = 1.0);
_FORCE_INLINE_ static Vector2 linear_interpolate(const Vector2 &p_a, const Vector2 &p_b, real_t p_weight);
_FORCE_INLINE_ Vector2 linear_interpolate(const Vector2 &p_to, real_t p_weight) const;
_FORCE_INLINE_ Vector2 slerp(const Vector2 &p_to, real_t p_weight) const;
Vector2 cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_weight) const;
Vector2 move_toward(const Vector2 &p_to, const real_t p_delta) const;
_FORCE_INLINE_ Vector2 linear_interpolate(const Vector2 &p_to, real_t p_weight);
_FORCE_INLINE_ Vector2 slerp(const Vector2 &p_to, real_t p_weight);
Vector2 cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_weight);
Vector2 move_toward(const Vector2 &p_to, const real_t p_delta);
Vector2 slide(const Vector2 &p_normal) const;
Vector2 bounce(const Vector2 &p_normal) const;
Vector2 reflect(const Vector2 &p_normal) const;
Vector2 slide(const Vector2 &p_normal);
Vector2 bounce(const Vector2 &p_normal);
Vector2 reflect(const Vector2 &p_normal);
bool is_equal_approx(const Vector2 &p_v) const;
bool is_equal_approx(const Vector2 &p_v);
Vector2 operator+(const Vector2 &p_v) const;
Vector2 operator+(const Vector2 &p_v);
void operator+=(const Vector2 &p_v);
Vector2 operator-(const Vector2 &p_v) const;
Vector2 operator-(const Vector2 &p_v);
void operator-=(const Vector2 &p_v);
Vector2 operator*(const Vector2 &p_v1) const;
Vector2 operator*(const Vector2 &p_v1);
Vector2 operator*(const real_t &rvalue) const;
Vector2 operator*(const real_t &rvalue);
void operator*=(const real_t &rvalue);
void operator*=(const Vector2 &rvalue) { *this = *this * rvalue; }
void operator*=(const Vector2 &rvalue) {
*this = *this * rvalue;
}
Vector2 operator/(const Vector2 &p_v1) const;
Vector2 operator/(const Vector2 &p_v1);
Vector2 operator/(const real_t &rvalue) const;
Vector2 operator/(const real_t &rvalue);
void operator/=(const real_t &rvalue);
void operator/=(const Vector2 &rvalue) { *this = *this / rvalue; }
void operator/=(const Vector2 &rvalue) {
*this = *this / rvalue;
}
Vector2 operator-() const;
Vector2 operator-();
bool operator==(const Vector2 &p_vec2) const;
bool operator!=(const Vector2 &p_vec2) const;
bool operator==(const Vector2 &p_vec2);
bool operator!=(const Vector2 &p_vec2);
bool operator<(const Vector2 &p_vec2) const { return x == p_vec2.x ? (y < p_vec2.y) : (x < p_vec2.x); }
bool operator>(const Vector2 &p_vec2) const { return x == p_vec2.x ? (y > p_vec2.y) : (x > p_vec2.x); }
bool operator<=(const Vector2 &p_vec2) const { return x == p_vec2.x ? (y <= p_vec2.y) : (x < p_vec2.x); }
bool operator>=(const Vector2 &p_vec2) const { return x == p_vec2.x ? (y >= p_vec2.y) : (x > p_vec2.x); }
bool operator<(const Vector2 &p_vec2) const {
return x == p_vec2.x ? (y < p_vec2.y) : (x < p_vec2.x);
}
bool operator>(const Vector2 &p_vec2) const {
return x == p_vec2.x ? (y > p_vec2.y) : (x > p_vec2.x);
}
bool operator<=(const Vector2 &p_vec2) const {
return x == p_vec2.x ? (y <= p_vec2.y) : (x < p_vec2.x);
}
bool operator>=(const Vector2 &p_vec2) const {
return x == p_vec2.x ? (y >= p_vec2.y) : (x > p_vec2.x);
}
real_t angle() const;
real_t angle();
void set_rotation(real_t p_radians) {
x = Math::cos(p_radians);
@ -153,26 +187,31 @@ struct _NO_DISCARD_CLASS_ Vector2 {
return Vector2(Math::abs(x), Math::abs(y));
}
Vector2 rotated(real_t p_by) const;
Vector2 rotated(real_t p_by);
Vector2 tangent() const {
return Vector2(y, -x);
}
Vector2 sign() const;
Vector2 floor() const;
Vector2 ceil() const;
Vector2 round() const;
Vector2 snapped(const Vector2 &p_by) const;
real_t aspect() const { return width / height; }
Vector2 sign();
Vector2 floor();
Vector2 ceil();
Vector2 round();
Vector2 snapped(const Vector2 &p_by);
real_t aspect() const {
return width / height;
}
operator String() const { return String::num(x) + ", " + String::num(y); }
operator String() const {
return String::num(x) + ", " + String::num(y);
}
_FORCE_INLINE_ Vector2(real_t p_x, real_t p_y) {
x = p_x;
y = p_y;
}
_FORCE_INLINE_ Vector2() { x = y = 0; }
};
_FORCE_INLINE_ Vector2() {
x = y = 0;
}
_FORCE_INLINE_ Vector2 Vector2::plane_project(real_t p_d, const Vector2 &p_vec) const {
return p_vec - *this * (dot(p_vec) - p_d);
@ -250,11 +289,7 @@ Vector2 Vector2::slerp(const Vector2 &p_to, real_t p_weight) const {
return rotated(theta * p_weight);
}
Vector2 Vector2::direction_to(const Vector2 &p_to) const {
Vector2 ret(p_to.x - x, p_to.y - y);
ret.normalize();
return ret;
}
Vector2 Vector2::linear_interpolate(const Vector2 &p_a, const Vector2 &p_b, real_t p_weight) {
Vector2 res = p_a;
@ -268,7 +303,7 @@ Vector2 Vector2::linear_interpolate(const Vector2 &p_a, const Vector2 &p_b, real
typedef Vector2 Size2;
typedef Vector2 Point2;
/* INTEGER STUFF */
// INTEGER STUFF
struct _NO_DISCARD_CLASS_ Vector2i {
enum Axis {
@ -300,27 +335,27 @@ struct _NO_DISCARD_CLASS_ Vector2i {
return coord[p_idx];
}
Vector2i operator+(const Vector2i &p_v) const;
Vector2i operator+(const Vector2i &p_v);
void operator+=(const Vector2i &p_v);
Vector2i operator-(const Vector2i &p_v) const;
Vector2i operator-(const Vector2i &p_v);
void operator-=(const Vector2i &p_v);
Vector2i operator*(const Vector2i &p_v1) const;
Vector2i operator*(const Vector2i &p_v1);
Vector2i operator*(const int &rvalue) const;
Vector2i operator*(const int &rvalue);
void operator*=(const int &rvalue);
Vector2i operator/(const Vector2i &p_v1) const;
Vector2i operator/(const Vector2i &p_v1);
Vector2i operator/(const int &rvalue) const;
Vector2i operator/(const int &rvalue);
void operator/=(const int &rvalue);
Vector2i operator-() const;
Vector2i operator-();
bool operator<(const Vector2i &p_vec2) const { return (x == p_vec2.x) ? (y < p_vec2.y) : (x < p_vec2.x); }
bool operator>(const Vector2i &p_vec2) const { return (x == p_vec2.x) ? (y > p_vec2.y) : (x > p_vec2.x); }
bool operator==(const Vector2i &p_vec2) const;
bool operator!=(const Vector2i &p_vec2) const;
bool operator==(const Vector2i &p_vec2);
bool operator!=(const Vector2i &p_vec2);
real_t get_aspect() const { return width / (real_t)height; }
@ -344,4 +379,6 @@ struct _NO_DISCARD_CLASS_ Vector2i {
typedef Vector2i Size2i;
typedef Vector2i Point2i;
*/
#endif // VECTOR2_H

View File

@ -1,7 +1,15 @@
#include <stdio.h>
#include "core/math/vector2.h"
int main() {
printf("test\n");
Vector2 v;
vector2_set_all(&v, 23);
vector2_max_axis(&v);
printf("test %d\n", vector2_max_axis(&v));
}