pbpt
Loading...
Searching...
No Matches
ray.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "point.hpp"
4#include "global.hpp"
5#include "vector.hpp"
6#include <array>
7
15
16namespace pbpt::math {
17
18
35template<typename T, int N>
36class Ray {
37private:
38 Point<T, N> m_origin{};
39 Vector<T, N> m_direction{};
40
41public:
42 // --- 构造函数 (Constructors) ---
43
49 constexpr Ray() noexcept
50 : m_origin(Point<T, N>::zeros()), m_direction(Vector<T, N>::zeros()) {
51 // Default direction is along the x-axis.
52 m_direction.x() = 1.0;
53 }
54
62 constexpr Ray(const Point<T, N>& origin, const Vector<T, N>& direction)
63 : m_origin(origin), m_direction(direction.normalized()) {}
64
72 constexpr Ray(const Point<T, N>& origin, const Point<T, N>& target)
73 : m_origin(origin), m_direction((target - origin).normalized()) {}
74
75 // --- 访问器 (Accessors) ---
76
81 constexpr const Point<T, N>& origin() const noexcept { return m_origin; }
82
88 constexpr const Vector<T, N>& direction() const noexcept { return m_direction; }
89
90 // --- 核心方法 (Core Methods) ---
91
101 constexpr Point<T, N> at(T t) const noexcept {
102 return m_origin + t * m_direction;
103 }
104};
105
106// --- 类型别名 (Type Aliases) ---
107
110
113
114template <typename T, int N>
115class RayDifferential {
116private:
117 Ray<T, N> m_ray{};
118 std::array<Ray<T, N>, N - 1> m_differential_rays{};
119
120public:
121 // --- 构造函数 (Constructors) ---
122 constexpr RayDifferential() = default;
123 constexpr RayDifferential(const Ray<T, N>& ray)
124 : m_ray(ray) {}
125 constexpr RayDifferential(const Point<T, N>& origin, const Vector<T, N>& direction)
126 : m_ray(origin, direction) {}
127 constexpr RayDifferential(const Point<T, N>& origin, const Point<T, N>& target)
128 : m_ray(origin, target) {}
129
130 // --- 访问器 (Accessors) ---
131 constexpr const Ray<T, N>& get_differential_ray(int i) const {
132 return m_differential_rays[i];
133 }
134
135 constexpr Ray<T, N>& get_differential_ray(int i) {
136 return m_differential_rays[i];
137 }
138
139 constexpr const Ray<T, N>& ray() const {
140 return m_ray;
141 }
142
143 constexpr Ray<T, N>& ray() {
144 return m_ray;
145 }
146};
147
148using RayDiff3 = RayDifferential<Float, 3>;
149
150} // namespace math
A template class for an N-dimensional point in space.
Definition point.hpp:37
Definition ray.hpp:115
A template class for an N-dimensional geometric ray.
Definition ray.hpp:36
constexpr Ray(const Point< T, N > &origin, const Point< T, N > &target)
Constructs a ray from a starting point to a target point.
Definition ray.hpp:72
constexpr const Vector< Float, N > & direction() const noexcept
Definition ray.hpp:88
constexpr Ray(const Point< T, N > &origin, const Vector< T, N > &direction)
Constructs a ray from an origin point and a direction vector.
Definition ray.hpp:62
constexpr Point< T, N > at(T t) const noexcept
Calculates a point along the ray using the parametric equation.
Definition ray.hpp:101
constexpr const Point< Float, N > & origin() const noexcept
Definition ray.hpp:81
constexpr Ray() noexcept
Default constructor.
Definition ray.hpp:49
A template class for N-dimensional mathematical vectors.
Definition vector.hpp:35
Defines the primary floating-point type alias for the math library.
The namespace for math library implementation.
Definition bounding_box.hpp:9
Ray< Float, 2 > Ray2
A 2-dimensional ray of type Float.
Definition ray.hpp:112
Ray< Float, 3 > Ray3
A 3-dimensional ray of type Float, commonly used in 3D graphics.
Definition ray.hpp:109
Defines a generic, N-dimensional Point class and its geometric operations.
Defines a generic, N-dimensional, constexpr-friendly vector class.