ViewDesignEngine  3.1.0
高性能 CAD 计算几何引擎
nurbs_surface.h
浏览该文件的文档.
1 #pragma once
2 #include "vde/core/point.h"
5 #include <vector>
6 #include <array>
7 
8 namespace vde::curves {
9 using core::Point3D;
10 using core::Vector3D;
11 
24 class NurbsSurface {
25 public:
38  NurbsSurface(std::vector<std::vector<Point3D>> control_grid,
39  std::vector<double> knots_u, std::vector<double> knots_v,
40  std::vector<std::vector<double>> weights,
41  int degree_u, int degree_v);
42 
49  [[nodiscard]] Point3D evaluate(double u, double v) const;
50 
57  [[nodiscard]] Vector3D derivative_u(double u, double v) const;
58 
65  [[nodiscard]] Vector3D derivative_v(double u, double v) const;
66 
73  [[nodiscard]] Vector3D normal(double u, double v) const;
74 
79  [[nodiscard]] int degree_u() const { return degree_u_; }
80 
85  [[nodiscard]] int degree_v() const { return degree_v_; }
86 
91  [[nodiscard]] std::array<int, 2> num_control_points() const {
92  return {static_cast<int>(cp_.size()), static_cast<int>(cp_.empty()?0:cp_[0].size())};
93  }
94 
99  [[nodiscard]] const std::vector<double>& knots_u() const { return knots_u_; }
100 
105  [[nodiscard]] const std::vector<double>& knots_v() const { return knots_v_; }
106 
111  [[nodiscard]] const std::vector<std::vector<Point3D>>& control_points() const { return cp_; }
112 
117  [[nodiscard]] const std::vector<std::vector<double>>& weights() const { return weights_; }
118 
127  static NurbsSurface ruled(const NurbsCurve& c1, const NurbsCurve& c2);
128 
141  static NurbsSurface revolve(const NurbsCurve& profile, const Point3D& axis_origin,
142  const Vector3D& axis_dir, double angle_rad);
143 
152  [[nodiscard]] std::pair<std::vector<Point3D>, std::vector<std::array<int,3>>>
153  tessellate(int res_u, int res_v) const;
154 
155 private:
156  std::vector<std::vector<Point3D>> cp_;
157  std::vector<double> knots_u_, knots_v_;
158  std::vector<std::vector<double>> weights_;
159  int degree_u_, degree_v_;
160 };
161 
162 } // namespace vde::curves
NURBS 曲线(Non-Uniform Rational B-Spline)
Definition: nurbs_curve.h:26
NURBS 张量积曲面
Definition: nurbs_surface.h:24
Vector3D normal(double u, double v) const
单位法向量
int degree_u() const
u 向阶次
Definition: nurbs_surface.h:79
const std::vector< double > & knots_v() const
v 向节点向量
Point3D evaluate(double u, double v) const
求曲面点 S(u,v)
const std::vector< std::vector< double > > & weights() const
权重网格访问
Vector3D derivative_u(double u, double v) const
u 向偏导数
static NurbsSurface revolve(const NurbsCurve &profile, const Point3D &axis_origin, const Vector3D &axis_dir, double angle_rad)
由截面曲线旋转生成旋转曲面
int degree_v() const
v 向阶次
Definition: nurbs_surface.h:85
const std::vector< double > & knots_u() const
u 向节点向量
Definition: nurbs_surface.h:99
const std::vector< std::vector< Point3D > > & control_points() const
控制点网格访问
std::pair< std::vector< Point3D >, std::vector< std::array< int, 3 > > > tessellate(int res_u, int res_v) const
将 NURBS 曲面三角化
NurbsSurface(std::vector< std::vector< Point3D >> control_grid, std::vector< double > knots_u, std::vector< double > knots_v, std::vector< std::vector< double >> weights, int degree_u, int degree_v)
构造 NURBS 曲面
std::array< int, 2 > num_control_points() const
控制点数量
Definition: nurbs_surface.h:91
static NurbsSurface ruled(const NurbsCurve &c1, const NurbsCurve &c2)
由两条 NURBS 曲线创建直纹面
Vector3D derivative_v(double u, double v) const
v 向偏导数
foundation::Vector3D Vector3D
双精度三维向量(重新导出)
Definition: point.h:49
foundation::Point3D Point3D
双精度三维点(重新导出)
Definition: point.h:31