2023-05-03 22:50:46 +02:00
|
|
|
#ifndef VECTOR2D_H
|
|
|
|
#define VECTOR2D_H
|
|
|
|
|
|
|
|
#include <num/num.h>
|
|
|
|
|
|
|
|
|
2023-05-06 22:35:15 +02:00
|
|
|
libnum::num32 sqrt_num32(libnum::num32 v);
|
|
|
|
|
|
|
|
|
2023-05-16 16:11:39 +02:00
|
|
|
class Point2D
|
2023-05-06 22:35:15 +02:00
|
|
|
{
|
2023-05-16 16:11:39 +02:00
|
|
|
public:
|
|
|
|
Point2D() {};
|
|
|
|
~Point2D() {};
|
|
|
|
|
|
|
|
libnum::num x, y;
|
|
|
|
};
|
2023-05-06 22:35:15 +02:00
|
|
|
|
2023-05-16 16:11:39 +02:00
|
|
|
class Circle
|
2023-05-06 22:35:15 +02:00
|
|
|
{
|
2023-05-16 16:11:39 +02:00
|
|
|
public:
|
|
|
|
Circle() {};
|
|
|
|
~Circle() {};
|
|
|
|
|
|
|
|
libnum::num x,y,r;
|
|
|
|
};
|
2023-05-06 22:35:15 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2023-05-03 22:50:46 +02:00
|
|
|
|
|
|
|
class Vector2D
|
|
|
|
{
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
2023-05-16 16:11:39 +02:00
|
|
|
Vector2D();
|
|
|
|
Vector2D( float x, float y );
|
|
|
|
Vector2D( libnum::num32 x, libnum::num32 y );
|
|
|
|
~Vector2D();
|
|
|
|
|
|
|
|
Vector2D Clone( void );
|
|
|
|
|
|
|
|
void AddVectors( Vector2D a, Vector2D b );
|
|
|
|
void Add( Vector2D v, libnum::num32 scale );
|
|
|
|
void SubtractVectors( Vector2D a, Vector2D b );
|
|
|
|
void Subtract( Vector2D v, libnum::num32 scale );
|
|
|
|
|
|
|
|
libnum::num32 Length( void );
|
|
|
|
void Scale( libnum::num32 scale );
|
|
|
|
|
|
|
|
libnum::num32 Dot( Vector2D v );
|
|
|
|
Vector2D Perp( void );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline constexpr Vector2D &operator+=( Vector2D const &other )
|
|
|
|
{
|
|
|
|
this->x += other.x;
|
|
|
|
this->y += other.y;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline constexpr Vector2D &operator-=( Vector2D const &other )
|
|
|
|
{
|
|
|
|
this->x -= other.x;
|
|
|
|
this->y -= other.y;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline constexpr Vector2D &operator*=( float scale )
|
|
|
|
{
|
|
|
|
this->x *= libnum::num32(scale);
|
|
|
|
this->y *= libnum::num32(scale);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline constexpr Vector2D &operator/=( float scale )
|
|
|
|
{
|
|
|
|
this->x /= libnum::num32(scale);
|
|
|
|
this->y /= libnum::num32(scale);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline friend Vector2D operator*(float scale, Vector2D const &v) {
|
|
|
|
Vector2D r;
|
|
|
|
r.x = v.x * libnum::num32( scale );
|
|
|
|
r.y = v.y * libnum::num32( scale );
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline friend Vector2D operator*(Vector2D const &v, float scale) {
|
|
|
|
Vector2D r;
|
|
|
|
r.x = v.x * libnum::num32( scale );
|
|
|
|
r.y = v.y * libnum::num32( scale );
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline friend Vector2D operator/(Vector2D const &v, float scale) {
|
|
|
|
Vector2D r;
|
|
|
|
r.x = v.x / libnum::num32( scale );
|
|
|
|
r.y = v.y / libnum::num32( scale );
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
libnum::num32 x;
|
|
|
|
libnum::num32 y;
|
2023-05-03 22:50:46 +02:00
|
|
|
|
|
|
|
};
|
|
|
|
|
2023-05-16 16:11:39 +02:00
|
|
|
class Border
|
2023-05-06 22:35:15 +02:00
|
|
|
{
|
2023-05-16 16:11:39 +02:00
|
|
|
public:
|
|
|
|
Border();
|
|
|
|
~Border();
|
|
|
|
|
|
|
|
Point2D A;
|
|
|
|
Point2D B;
|
|
|
|
Vector2D N;
|
|
|
|
};
|
2023-05-06 22:35:15 +02:00
|
|
|
|
|
|
|
|
|
|
|
bool CollisionDroite(Point2D A,Point2D B, Circle C);
|
|
|
|
bool CollisionSegment(Point2D A,Point2D B,Circle C);
|
|
|
|
bool CollisionBorder(Border B, Circle C);
|
|
|
|
Vector2D GetNormale(Point2D A,Point2D B,Point2D C);
|
|
|
|
Point2D ProjectionI(Point2D A,Point2D B,Point2D C);
|
|
|
|
Vector2D ComputeVectorRebound(Vector2D v,Vector2D N);
|
2023-05-03 22:50:46 +02:00
|
|
|
|
|
|
|
#endif
|