当前位置:   article > 正文

已知贝塞尔曲线上的点求控制点_贝塞尔曲线控制点计算

贝塞尔曲线控制点计算

 

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. #include <vector>
  4. #include <cmath>
  5. using namespace std;
  6. using namespace cv;
  7. vector<Point2d> orig_point;
  8. vector<Point2d> control_point;
  9. double u1 = 0.3;//这两个参数取决于中间两个点的位置
  10. double u2 = 0.7;
  11. int main() {
  12. //1.四个贝塞尔曲线上的点
  13. orig_point.push_back(Point2d(0, 0));
  14. orig_point.push_back(Point2d(3, 5));
  15. orig_point.push_back(Point2d(7, 5));
  16. orig_point.push_back(Point2d(10, 0));
  17. Mat P(4, 2, CV_64F);
  18. //将点赋值给4*2的矩阵
  19. for (int i = 0; i < 4; i++) {
  20. P.at<double>(i, 0) = orig_point[i].x;
  21. P.at<double>(i, 1) = orig_point[i].y;
  22. }
  23. cout << "贝塞尔曲线上的四个点分别为:\n" << P << endl;
  24. //2.定义一个4*4的U矩阵,每一行对应的是四个贝塞尔曲线上的点参数
  25. Mat U = (Mat_ <double>(4, 4) <<
  26. 0, 0, 0, 1, //对应第一个点,此时u=0
  27. u1 * u1 * u1, u1 * u1, u1, 1, //对应第二个点,(u1^3,u1^2,u1,1)
  28. u2 * u2 * u2, u2 * u2, u2, 1,
  29. 1, 1, 1, 1);//对应第四个点,此时u=1
  30. //3.定义好M矩阵,这个是固定的
  31. Mat M = (Mat_ <double>(4, 4) <<
  32. -1, 3, -3, 1,
  33. 3, -6, 3, 0,
  34. -3, 3, 0, 0,
  35. 1, 0, 0, 0);
  36. //4.求U*M的逆
  37. Mat UM = U * M;
  38. //cout << UM.size() << endl;
  39. //cout << UM << endl;
  40. Mat UM_inv = UM.inv();
  41. //5.控制点,因为P=U*M*C,所以控制点C=UM的逆*P
  42. Mat C;
  43. C = UM_inv * P;
  44. cout << endl << "求得的控制点为:\n" << C << endl;
  45. }

结果验证,首尾两点坐标一定相同 


2021年9月22日 -- add

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/423043
推荐阅读
相关标签
  

闽ICP备14008679号