31 lines
893 B
C++
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
|