#pragma once #include "vde/core/point.h" namespace vde::core { /** * @brief 三维无限直线 * * 由原点位置和单位方向向量表示。 * 参数方程:P(t) = origin + direction * t。 * * @tparam T 标量类型 * * @ingroup core */ template class Line3D { public: /// 默认构造:原点在 (0,0,0),方向沿 X 轴 Line3D() = default; /** * @brief 从原点和方向构造直线 * * @param origin 直线上一点 * @param direction 方向向量(自动归一化) */ Line3D(const Point3D& origin, const Vector3D& direction) : origin_(origin), direction_(direction.normalized()) {} /// 获取直线上的一点(原点) [[nodiscard]] const Point3D& origin() const { return origin_; } /// 获取单位方向向量 [[nodiscard]] const Vector3D& direction() const { return direction_; } /** * @brief 参数方程求点 * * @param t 参数值 * @return origin + direction * t */ [[nodiscard]] Point3D point_at(T t) const { return origin_ + direction_ * t; } private: Point3D origin_{0,0,0}; Vector3D direction_{1,0,0}; }; /** * @brief 三维线段 * * 由两个端点定义的有界直线段。 * * @tparam T 标量类型 * * @ingroup core */ template class Segment3D { public: /// 默认构造:两个端点均在原点 Segment3D() = default; /** * @brief 从两个端点构造线段 * * @param p0 起点 * @param p1 终点 */ Segment3D(const Point3D& p0, const Point3D& p1) : p0_(p0), p1_(p1) {} /// 获取起点 [[nodiscard]] const Point3D& p0() const { return p0_; } /// 获取终点 [[nodiscard]] const Point3D& p1() const { return p1_; } /** * @brief 方向向量(未归一化) * @return p1 - p0 */ [[nodiscard]] Vector3D direction() const { return p1_ - p0_; } /** * @brief 线段长度 * @return ||p1 - p0|| */ [[nodiscard]] T length() const { return direction().norm(); } private: Point3D p0_{0,0,0}, p1_{0,0,0}; }; /** * @brief 三维射线 * * 由原点和方向定义的半无限直线(t ≥ 0)。 * 参数方程:P(t) = origin + direction * t, t ≥ 0。 * * @tparam T 标量类型 * * @ingroup core */ template class Ray3D { public: /// 默认构造:原点在 (0,0,0),方向沿 X 轴 Ray3D() = default; /** * @brief 从原点和方向构造射线 * * @param origin 射线起点 * @param direction 方向向量(自动归一化) */ Ray3D(const Point3D& origin, const Vector3D& direction) : origin_(origin), direction_(direction.normalized()) {} /// 获取射线起点 [[nodiscard]] const Point3D& origin() const { return origin_; } /// 获取单位方向向量 [[nodiscard]] const Vector3D& direction() const { return direction_; } /** * @brief 参数方程求点(t ≥ 0) * * @param t 参数值(应为非负) * @return origin + direction * t */ [[nodiscard]] Point3D point_at(T t) const { return origin_ + direction_ * t; } private: Point3D origin_{0,0,0}; Vector3D direction_{1,0,0}; }; /// 双精度三维直线 using Line3Dd = Line3D; /// 双精度三维线段 using Segment3Dd = Segment3D; /// 双精度三维射线 using Ray3Dd = Ray3D; } // namespace vde::core