zoukankan      html  css  js  c++  java
  • 曲线平滑-贝塞尔曲线 【转】

    http://blog.csdn.net/bleurever/article/details/52383454

    Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线 

    曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。 1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。 

    以下公式中:B(t)t时间下 点的坐标;

     P0为起点,Pn为终点,Pi为控制点

    一阶贝塞尔曲线(线段)


    意义:由 P0 至 P1 的连续点, 描述的一条线段

     

    二阶贝塞尔曲线(抛物线)



    原理:由 P0 至 P1 的连续点 Q0,描述一条线段。 
          由 P1 至 P2 的连续点 Q1,描述一条线段。 
          由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。

     

    经验:P1-P0为曲线在P0处的切线。

     

    三阶贝塞尔曲线:




    通用公式:

     

    高阶贝塞尔曲线:

    4阶曲线:


    5阶曲线:

     

    三次贝塞尔曲线光滑示例:

      1. struct D_DOT3D //D_DOT3D的主要参数,未完全实现  
      2. {  
      3.     double x,y,z;  
      4. }  
      5. double GetThreeBezierValue(double p0, double p1, double p2, double p3, double t)  
      6. {  
      7.     return pow(1-t,3.0) * p0 + 3*t*(1-t)*(1-t)*p1 + 3*t*t*(1-t)*p2 + t*t*t*p3;  
      8. }  
      9.   
      10. D_DOT3D GetThreeBezierValue(D_DOT3D p0, D_DOT3D p1, D_DOT3D p2, D_DOT3D p3 , double t)  
      11. {  
      12.     D_DOT3D dot;  
      13.     dot.x = GetThreeBezierValue(p0.x, p1.x, p2.x, p3.x, t);  
      14.     dot.y = GetThreeBezierValue(p0.y, p1.y, p2.y, p3.y, t);  
      15.     dot.z = GetThreeBezierValue(p0.z, p1.z, p2.z, p3.z, t);  
      16.   
      17.     return dot;  
      18. }  
      19.   
      20. long ThreeBezierCurve( vector<D_DOT3D> &line )  
      21. {  
      22.     if (line.size()<4)  
      23.         return 0;  
      24.   
      25.     vector<D_DOT3D> vout;  
      26.   
      27.     for (int i=0; i<line.size()-3; i += 3)  
      28.     {  
      29.         D_DOT3D p0(line[i]);  
      30.         D_DOT3D p1(line[i+1]);  
      31.         D_DOT3D p2(line[i+2]);  
      32.         D_DOT3D p3(line[i+3]);  
      33.   
      34.         if (0 == i)  
      35.         {  
      36.             D_DOT3D dot1 = GetThreeBezierValue(p0, p1, p2, p3, 0.);  
      37.             vout.push_back(dot1);  
      38.         }  
      39.         D_DOT3D dot2 = GetThreeBezierValue(p0, p1, p2, p3, 1/3.0);  
      40.         D_DOT3D dot3 = GetThreeBezierValue(p0, p1, p2, p3, 2/3.0);  
      41.         D_DOT3D dot4 = GetThreeBezierValue(p0, p1, p2, p3, 1.0);  
      42.   
      43.         vout.push_back(dot2);  
      44.         vout.push_back(dot3);  
      45.         vout.push_back(dot4);  
      46.     }  
      47.   
      48.     line = vout;  
      49.     return 1;  
  • 相关阅读:
    sass、less和stylus的安装使用和入门实践
    CSS LINT,优化你的CSS样式表
    css lint是有害的
    CSS学习资源
    css border制作小三角形状及应用(兼容IE6)
    css专题学习-浏览器兼容性问题目录
    每位设计师都应该拥有的50个CSS代码片段
    前端基础一:Doctype? 行内元素和块级元素
    inline-block代替浮动布局float:left列表布局最佳方案
    css超出一行添加省略号属性:text-overflow和white-space
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/8309294.html
Copyright © 2011-2022 走看看