免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

Bezier貝塞爾曲線的原理、二次貝塞爾曲線的實(shí)現(xiàn)

 felwell 2019-05-23

Bezier曲線的原理

Bezier曲線是應(yīng)用于二維圖形的曲線。曲線由頂點(diǎn)和控制點(diǎn)組成,通過(guò)改變控制點(diǎn)坐標(biāo)可以改變曲線的形狀。

一次Bezier曲線公式:

一次Bezier曲線是由P0至P1的連續(xù)點(diǎn),描述的一條線段

二次Bezier曲線公式:

二次Bezier曲線是 P0至P1 的連續(xù)點(diǎn)Q0和P1至P2 的連續(xù)點(diǎn)Q1 組成的線段上的連續(xù)點(diǎn)B(t),描述一條拋物線。

三次Bezier曲線公式:

二次Bezier曲線的實(shí)現(xiàn)

復(fù)制代碼
#include <vector>class CBezierCurve
{public:
    CBezierCurve();~CBezierCurve();void SetCtrlPoint(POINT& stPt);bool CreateCurve();void Draw(CDC* pDC);    
private:// 主要算法,計(jì)算曲線各個(gè)點(diǎn)坐標(biāo)void CalCurvePoint(float t, POINT& stPt);private:// 頂點(diǎn)和控制點(diǎn)數(shù)組std::vector<POINT> m_vecCtrlPt;// 曲線上各點(diǎn)坐標(biāo)數(shù)組std::vector<POINT> m_vecCurvePt;        
};
復(fù)制代碼
復(fù)制代碼
    #include <math.h>  
    #include "BezierCurve.h"  
      
    CBezierCurve::CBezierCurve()  
    {  
    }  
      
    CBezierCurve::~CBezierCurve()  
    {  
    }  
      void CBezierCurve::SetCtrlPoint(POINT& stPt)  
    {  
        m_vecCtrlPt.push_back(stPt);  
    }  
      void CBezierCurve::CreateCurve()  
    {  // 確保是二次曲線,2個(gè)頂點(diǎn)一個(gè)控制點(diǎn)  assert(m_vecCtrlPt.size() == 3);  
      // t的增量, 可以通過(guò)setp大小確定需要保存的曲線上點(diǎn)的個(gè)數(shù)  float step = 0.01;  for (float t = 0.0; t <= 1.0; t += step)  
        {  
            POINT stPt;  
            CalCurvePoint(t, stPt);  
            m_vecCurvePt.push_back(stPt);  
        }  
    }  
      void CBezierCurve::Draw(CDC* pDC)  
    {     // 畫出曲線上個(gè)點(diǎn),若不連續(xù)可以用直線連接各點(diǎn)  int nCount = m_vecCurvePt.size();  for (int i = 0; i < nCount; ++i)  
        {  
            pDC->SetPixel(m_vecCurvePt[i], 0x000000);  
        }  
    }  
      void CBezierCurve::CalCurvePoint(float t, POINT& stPt)  
    {  // 確保是二次曲線,2個(gè)頂點(diǎn)一個(gè)控制點(diǎn)  assert(m_vecCtrlPt.size() == 3);  
      // 計(jì)算曲線點(diǎn)坐標(biāo),此為2次算法,改變此處可以實(shí)現(xiàn)多次曲線  float x = (float)m_vecCtrlPt[0].x * pow(1 - t, 2)   +   
                  (float)m_vecCtrlPt[1].x * t * (1 - t) * 2 +   
                  (float)m_vecCtrlPt[2].x * pow(t, 2);  float y = (float)m_vecCtrlPt[0].y * pow(1 - t, 2)   +   
                  (float)m_vecCtrlPt[1].y * t * (1 - t) * 2 +   
                  (float)m_vecCtrlPt[2].y * pow(t, 2);  
        stPt.x =x;  
        stPt.y= y;  
    }
復(fù)制代碼

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多