#pragma once #include "vde/core/point.h" #include namespace vde::curves { class BezierSurface { public: BezierSurface(std::vector> control_grid); [[nodiscard]] Point3D evaluate(double u, double v) const; [[nodiscard]] Vector3D derivative_u(double u, double v) const; [[nodiscard]] Vector3D derivative_v(double u, double v) const; [[nodiscard]] Vector3D normal(double u, double v) const; [[nodiscard]] int degree_u() const { return static_cast(cp_.size()) - 1; } [[nodiscard]] int degree_v() const { return static_cast(cp_[0].size()) - 1; } private: std::vector> cp_; [[nodiscard]] Point3D de_casteljau(double t, const std::vector& pts) const; }; } // namespace vde::curves