Files
ViewDesignEngine/include/vde/core/plane.h
T

31 lines
893 B
C++

#pragma once
#include "vde/core/point.h"
namespace vde::core {
template <typename T>
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<double>;
} // namespace vde::core