v0.1.0: 初始工程骨架 — 7模块 40头文件 32源文件 17文档 Apache-2.0
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user