blob: 468fd1665c1e38802d951b903a7ac9220ea7409f [file] [log] [blame]
#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];
}