#pragma once #include "vde/core/point.h" namespace vde::core { template class Plane { public: Plane() = default; Plane(const Point3D& point, const Vector3D& normal) : normal_(normal.normalized()), d_(-normal_.dot(point)) {} Plane(const Point3D& a, const Point3D& b, const Point3D& c) : Plane(a, (b - a).cross(c - a)) {} [[nodiscard]] const Vector3D& normal() const { return normal_; } [[nodiscard]] T d() const { return d_; } [[nodiscard]] T signed_distance(const Point3D& p) const { return normal_.dot(p) + d_; } [[nodiscard]] T distance(const Point3D& p) const { return std::abs(signed_distance(p)); } [[nodiscard]] Point3D project(const Point3D& p) const { return p - normal_ * signed_distance(p); } private: Vector3D normal_{0,0,1}; T d_{0}; }; using Plane3D = Plane; } // namespace vde::core