| #include "rive/math/vec2d.hpp" |
| #include "rive/math/mat2d.hpp" |
| #include <cmath> |
| |
| using namespace rive; |
| |
| Vec2D::Vec2D() : m_Buffer{0.0f, 0.0f} {} |
| |
| Vec2D::Vec2D(float x, float y) : m_Buffer{x, y} {} |
| |
| Vec2D::Vec2D(const Vec2D& copy) : m_Buffer{copy.m_Buffer[0], copy.m_Buffer[1]} |
| { |
| } |
| |
| void Vec2D::transform(Vec2D& result, const Vec2D& a, const Mat2D& m) |
| { |
| float x = a[0]; |
| float y = a[1]; |
| result[0] = m[0] * x + m[2] * y + m[4]; |
| result[1] = m[1] * x + m[3] * y + m[5]; |
| } |
| |
| void Vec2D::transformDir(Vec2D& result, const Vec2D& a, const Mat2D& m) |
| { |
| float x = a[0]; |
| float y = a[1]; |
| result[0] = m[0] * x + m[2] * y; |
| result[1] = m[1] * x + m[3] * y; |
| } |
| |
| void Vec2D::add(Vec2D& result, const Vec2D& a, const Vec2D& b) |
| { |
| result[0] = a[0] + b[0]; |
| result[1] = a[1] + b[1]; |
| } |
| |
| void Vec2D::subtract(Vec2D& result, const Vec2D& a, const Vec2D& b) |
| { |
| result[0] = a[0] - b[0]; |
| result[1] = a[1] - b[1]; |
| } |
| |
| float Vec2D::length(const Vec2D& a) { return std::sqrt(lengthSquared(a)); } |
| |
| float Vec2D::lengthSquared(const Vec2D& a) |
| { |
| float x = a[0]; |
| float y = a[1]; |
| return x * x + y * y; |
| } |
| |
| float Vec2D::distance(const Vec2D& a, const Vec2D& b) |
| { |
| return std::sqrt(distanceSquared(a, b)); |
| } |
| |
| float Vec2D::distanceSquared(const Vec2D& a, const Vec2D& b) |
| { |
| float x = b[0] - a[0]; |
| float y = b[1] - a[1]; |
| return x * x + y * y; |
| } |
| |
| void Vec2D::copy(Vec2D& result, const Vec2D& a) |
| { |
| result[0] = a[0]; |
| result[1] = a[1]; |
| } |
| |
| void Vec2D::normalize(Vec2D& result, const Vec2D& a) |
| { |
| float x = a[0]; |
| float y = a[1]; |
| float len = x * x + y * y; |
| if (len > 0.0f) |
| { |
| len = 1.0f / std::sqrt(len); |
| result[0] = a[0] * len; |
| result[1] = a[1] * len; |
| } |
| } |
| |
| float Vec2D::dot(const Vec2D& a, const Vec2D& b) |
| { |
| return a[0] * b[0] + a[1] * b[1]; |
| } |
| |
| void Vec2D::lerp(Vec2D& o, const Vec2D& a, const Vec2D& b, float f) |
| { |
| float ax = a[0]; |
| float ay = a[1]; |
| o[0] = ax + f * (b[0] - ax); |
| o[1] = ay + f * (b[1] - ay); |
| } |
| |
| void Vec2D::scale(Vec2D& o, const Vec2D& a, float scale) |
| { |
| o[0] = a[0] * scale; |
| o[1] = a[1] * scale; |
| } |
| |
| void Vec2D::scaleAndAdd(Vec2D& o, const Vec2D& a, const Vec2D& b, float scale) |
| { |
| o[0] = a[0] + b[0] * scale; |
| o[1] = a[1] + b[1] * scale; |
| } |
| |
| void Vec2D::negate(Vec2D& o, const Vec2D& a) |
| { |
| o[0] = -a[0]; |
| o[1] = -a[1]; |
| } |