clamped b_spline 你的名字 2023-01-08 08:26 65阅读 0赞 #ifndef B_SPLINE_H #define B_SPLINE_H #include <vector> //节点个数 m + 1 //最大次数 p = m //定义基函数 class BaseFunction { public: BaseFunction(){}; ~BaseFunction(){}; void setKnots(std::vector<double> knots_) { knots = knots_; m = knots.size() - 1; max_p = m - 1; }; // i_: 0 -- m-1 // p_: 0 -- max_p // u_: knots.front() -- knots.back() // i_ + p_ <= max_p double baseN(int i_, int p_, double u_) { if (p_ == 0) { if (u_ >= knots[i_] && u_ < knots[i_ + 1]) return 1; else return 0; } else { double a = 0; if ((knots[i_ + p_] - knots[i_]) != 0) a = (u_ - knots[i_]) / (knots[i_ + p_] - knots[i_]); double b = 0; if ((knots[i_ + p_ + 1] - knots[i_ + 1]) != 0) b = (knots[i_ + p_ + 1] - u_) / (knots[i_ + p_ + 1] - knots[i_ + 1]); return a * baseN(i_, p_ - 1, u_) + b * baseN(i_ + 1, p_ - 1, u_); } } private: std::vector<double> knots; int m = 1; int max_p = 1; }; //对一组数据计算BSpline class BSpline { public: BSpline(){}; ~BSpline(){}; void setP(int p_) { p = p_; m = n + p + 1; generateKnots(); }; void addControlPoints(std::vector<double> control_points_) { control_points = control_points_; n = control_points.size() - 1; m = n + p + 1; generateKnots(); }; void setPointsNum(int points_num_) { points_num = points_num_; u.clear(); for (int i = 0; i < points_num; i++) { u.emplace_back((double)i / (double)(points_num - 1)); } }; bool bSplineCal() { if (n < 2) { return false; } data_out.clear(); BaseFunction bf; bf.setKnots(knots); for (int j = 0; j < u.size(); j++) { double c_u = 0; for (int i = 0; i <= n; i++) { if (j == u.size() - 1 && i == n) c_u += control_points[i]; else c_u += (bf.baseN(i, p, u[j]) * control_points[i]); } data_out.emplace_back(c_u); } return true; } public: std::vector<double> getDataOut() const { return data_out; }; private: std::vector<double> control_points; //控制点 int n = 1; //控制点n+1个 std::vector<double> knots; //节点0-1范围内 int m = 1; //节点数量m+1个 int p = 3; //曲线阶数 int points_num = 10; std::vector<double> u; //根据points_num计算采样点的 std::vector<double> data_out; //计算完成后的数据 //生成knots void generateKnots() { knots.clear(); for (size_t i = 0; i < m + 1; i++) { if (i <= p) knots.emplace_back(0); else if (i >= m - p) knots.emplace_back(1); else { // p+1 --- m-p-1区间范围内 int num = m - p - p; if (num < 2) return; double step = 1.0 / (double)num; knots.emplace_back(step * (i - p)); } } } }; class BSpline2D { public: BSpline2D(){}; ~BSpline2D(){}; std::vector<double> getXOut() const { return x_out; }; std::vector<double> getYOut() const { return y_out; }; void setP(int p_) { p = p_; }; void setPointsNum(int points_num_) { points_num = points_num_; }; void addXControlData(std::vector<double> x_control_data_) { x_control_data = x_control_data_; }; void addYControlData(std::vector<double> y_control_data_) { y_control_data = y_control_data_; }; bool bSpline2DCal() { BSpline bs; bs.setP(p); bs.setPointsNum(points_num); // x方向 bs.addControlPoints(x_control_data); if (!bs.bSplineCal()) { return false; } x_out = bs.getDataOut(); // y方向 bs.addControlPoints(y_control_data); if (!bs.bSplineCal()) { return false; } y_out = bs.getDataOut(); return true; }; private: std::vector<double> x_control_data, y_control_data; std::vector<double> x_out, y_out; int p = 3; int points_num = 30; }; #endif 使用方法: BSpline2D bs2d; bs2d.setPointsNum(point\_num);//设置点数量(默认30个点) bs2d.setP(3);//设置曲线阶数(默认3阶数) bs2d.addXControlData(x\_control\_data);//设置控制点 bs2d.addYControlData(y\_control\_data); //进行计算 if (!bs2d.bSpline2DCal()) \{ return false; \} //提取插值点数据 std::vector<double> x\_out = bs2d.getXOut(); std::vector<double> y\_out = bs2d.getYOut();
相关 讲解{TypeError}clamp(): argument ‘min‘ must be Number, not Tensor 目录 讲解TypeError: clamp(): argument 'min' must be Number, not Tensor 异常类型 clamp()函数 错误 男娘i/ 2024年02月05日 19:32/ 0 赞/ 52 阅读
相关 Clamp的介绍 Clamp的介绍 在Unity中,clamp是一种用于限制数值范围的函数。它可以帮助开发者将数值限制在指定的范围内,以避免数值溢出或错误。Unity中提供了多种clamp Myth丶恋晨/ 2023年10月14日 10:51/ 0 赞/ 1 阅读
相关 line-clamp 转自:https://www.cnblogs.com/jing-tian/p/11048853.html\\_label0 [CSS3属性—— line-clam 你的名字/ 2023年10月09日 11:27/ 0 赞/ 10 阅读
相关 unity,Mathf.Clamp方法的使用 介绍 Mathf.Clamp是Unity引擎中的一个静态方法,用于将一个值限制在指定的范围内。它可以用于限制数值、位置和旋转等属性的取值范围,以确保它们不会超出指定的范围 ╰半橙微兮°/ 2023年09月26日 20:56/ 0 赞/ 19 阅读
相关 clamped b_spline ifndef B_SPLINE_H define B_SPLINE_H include <vector> //节点个数 m 你的名字/ 2023年01月08日 08:26/ 0 赞/ 66 阅读
相关 clamp.min.js实现多行溢出显示省略号 1、对于"单个"的js语句:$(function()\{ var header = $(".wyl\_xinwen\_mid\_mk\_p1")\[0\] 桃扇骨/ 2022年07月14日 11:55/ 0 赞/ 103 阅读
相关 文本超出两行显示省略号插件Clamp.js overflow:hidden; text-overflow:ellipsis; display:-webkit-box; \-webkit-box-orient:v 系统管理员/ 2022年05月17日 10:38/ 0 赞/ 266 阅读
相关 JS-使用clamp.js-限制文本显示行数 使用clamp.js限制文本显示行数 <!DOCTYPE html> <html> <head> <meta charset= - 日理万妓/ 2022年04月01日 06:24/ 0 赞/ 470 阅读
相关 Ellipsis 的升级版 line-clamp 使用场景: 通常情况下我们使用点点点只是针对一行的情况下;也就是说content只能是单行;当content的实际长度超过了容器的长度就用点点点来显示。如下图: ![839 喜欢ヅ旅行/ 2021年12月22日 16:59/ 0 赞/ 234 阅读
还没有评论,来说两句吧...