init
This commit is contained in:
59
util/ray2.hpp
Normal file
59
util/ray2.hpp
Normal file
@@ -0,0 +1,59 @@
|
||||
#ifndef RAY2_HPP
|
||||
#define RAY2_HPP
|
||||
|
||||
#include "Vec2.hpp"
|
||||
|
||||
class Ray2 {
|
||||
public:
|
||||
Vec2 origin;
|
||||
Vec2 direction;
|
||||
|
||||
Ray2() : origin(Vec2()), direction(Vec2(1, 0)) {}
|
||||
Ray2(const Vec2& origin, const Vec2& direction)
|
||||
: origin(origin), direction(direction.normalized()) {}
|
||||
|
||||
// Get point at parameter t along the ray
|
||||
Vec2 at(float t) const {
|
||||
return origin + direction * t;
|
||||
}
|
||||
|
||||
// Reflect ray off a surface with given normal
|
||||
Ray2 reflect(const Vec2& point, const Vec2& normal) const {
|
||||
Vec2 reflectedDir = direction.reflect(normal);
|
||||
return Ray2(point, reflectedDir);
|
||||
}
|
||||
|
||||
// Check if ray intersects with a circle
|
||||
bool intersectsCircle(const Vec2& center, float radius, float& t1, float& t2) const {
|
||||
Vec2 oc = origin - center;
|
||||
float a = direction.dot(direction);
|
||||
float b = 2.0f * oc.dot(direction);
|
||||
float c = oc.dot(oc) - radius * radius;
|
||||
|
||||
float discriminant = b * b - 4 * a * c;
|
||||
|
||||
if (discriminant < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
discriminant = std::sqrt(discriminant);
|
||||
t1 = (-b - discriminant) / (2.0f * a);
|
||||
t2 = (-b + discriminant) / (2.0f * a);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Get the distance from a point to this ray
|
||||
float distanceToPoint(const Vec2& point) const {
|
||||
Vec2 pointToOrigin = point - origin;
|
||||
float projection = pointToOrigin.dot(direction);
|
||||
Vec2 closestPoint = origin + direction * projection;
|
||||
return point.distance(closestPoint);
|
||||
}
|
||||
|
||||
std::string toString() const {
|
||||
return "Ray2(origin: " + origin.toString() + ", direction: " + direction.toString() + ")";
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user