• Bezier曲线的原理 及 二次Bezier曲线的实现


    原文地址:http://blog.csdn.net/jimi36/article/details/7792103

    Bezier曲线的原理

    Bezier曲线是应用于二维图形的曲线。曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状。

     

    一次Bezier曲线公式:

    一次Bezier曲线是由P0至P1的连续点,描述的一条线段

     

    二次Bezier曲线公式:

    二次Bezier曲线是 P0至P1 的连续点Q0和P1至P2 的连续点Q1 组成的线段上的连续点B(t),描述一条抛物线。

     

    三次Bezier曲线公式:

     

    二次Bezier曲线的实现

    1. #ifndef CBEZIERCURVE_H_  
    2. #define CBEZIERCURVE_H_  
    3.   
    4. #include <vector>  
    5.   
    6. class CBezierCurve  
    7. {  
    8. public:  
    9.     CBezierCurve();  
    10.     ~CBezierCurve();  
    11.   
    12.     void SetCtrlPoint(POINT& stPt);  
    13.   
    14.     bool CreateCurve();  
    15.   
    16.     void Draw(CDC* pDC);  
    17.       
    18. private:  
    19.         // 主要算法,计算曲线各个点坐标  
    20.     void CalCurvePoint(float t, POINT& stPt);  
    21.   
    22. private:  
    23.         // 顶点和控制点数组  
    24.     std::vector<POINT> m_vecCtrlPt;  
    25.         // 曲线上各点坐标数组  
    26.     std::vector<POINT> m_vecCurvePt;        
    27. };  
    28.   
    29. #endif  
    [html] view plaincopy
    1. #include <math.h>  
    2. #include "BezierCurve.h"  
    3.   
    4. CBezierCurve::CBezierCurve()  
    5. {  
    6. }  
    7.   
    8. CBezierCurve::~CBezierCurve()  
    9. {  
    10. }  
    11.   
    12. void CBezierCurve::SetCtrlPoint(POINT& stPt)  
    13. {  
    14.     m_vecCtrlPt.push_back(stPt);  
    15. }  
    16.   
    17. void CBezierCurve::CreateCurve()  
    18. {  
    19.     // 确保是二次曲线,2个顶点一个控制点  
    20.     assert(m_vecCtrlPt.size() == 3);  
    21.   
    22.     // t的增量, 可以通过setp大小确定需要保存的曲线上点的个数  
    23.     float step = 0.01;  
    24.     for (float t = 0.0; t <= 1.0; t += step)  
    25.     {  
    26.         POINT stPt;  
    27.         CalCurvePoint(t, stPt);  
    28.         m_vecCurvePt.push_back(stPt);  
    29.     }  
    30. }  
    31.   
    32. void CBezierCurve::Draw(CDC* pDC)  
    33. {     
    34.     // 画出曲线上个点,若不连续可以用直线连接各点  
    35.     int nCount = m_vecCurvePt.size();  
    36.     for (int i = 0; i < nCount; ++i)  
    37.     {  
    38.         pDC->SetPixel(m_vecCurvePt[i], 0x000000);  
    39.     }  
    40. }  
    41.   
    42. void CBezierCurve::CalCurvePoint(float t, POINT& stPt)  
    43. {  
    44.         // 确保是二次曲线,2个顶点一个控制点  
    45.     assert(m_vecCtrlPt.size() == 3);  
    46.   
    47.     // 计算曲线点坐标,此为2次算法,改变此处可以实现多次曲线  
    48.     float x = (float)m_vecCtrlPt[0].x * pow(1 - t, 2)   +   
    49.               (float)m_vecCtrlPt[1].x * t * (1 - t) * 2 +   
    50.               (float)m_vecCtrlPt[2].x * pow(t, 2);  
    51.     float y = (float)m_vecCtrlPt[0].y * pow(1 - t, 2)   +   
    52.               (float)m_vecCtrlPt[1].y * t * (1 - t) * 2 +   
    53.               (float)m_vecCtrlPt[2].y * pow(t, 2);  
    54.     stPt.x =x;  
    55.     stPt.yy;  
    56. }  
  • 相关阅读:
    java知识学习17-API、String、StringBuilder
    java知识学习16-构造方法
    java知识学习15-封装
    定位在input输入框上的图片变模糊的问题
    查看echarts的版本
    vue-cli3项目解决npm run dev在浏览器打开两次的问题
    ElementUI的日期组件禁止选择过去的时间
    二维数组的使用
    实现在线预览文档
    vue-cli3项目在ie浏览器下白屏问题
  • 原文地址:https://www.cnblogs.com/shiweihappy/p/4246428.html
Copyright © 2020-2023  润新知