144 lines
3.4 KiB
C++
144 lines
3.4 KiB
C++
#pragma once
|
|
#include "vde/core/point.h"
|
|
|
|
namespace vde::core {
|
|
|
|
/**
|
|
* @brief 三维无限直线
|
|
*
|
|
* 由原点位置和单位方向向量表示。
|
|
* 参数方程:P(t) = origin + direction * t。
|
|
*
|
|
* @tparam T 标量类型
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
template <typename T>
|
|
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 <typename T>
|
|
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 <typename T>
|
|
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<double>;
|
|
/// 双精度三维线段
|
|
using Segment3Dd = Segment3D<double>;
|
|
/// 双精度三维射线
|
|
using Ray3Dd = Ray3D<double>;
|
|
|
|
} // namespace vde::core
|