Files
茂之钳 4c9ee4f760
CI / Build & Test (push) Failing after 29s
CI / Release Build (push) Failing after 38s
docs: doxygen annotations for curves + mesh + sketch
2026-07-24 11:04:04 +00:00

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