////////////////////////////////////////////////////////////////////////////////
/// <summary>贝塞尔曲线通用算法</summary>
/// <param>
/// @<- _control_pts 确定贝塞尔曲线的控制点集合
/// @<- _density 密度值(0~1)
/// @->_bezier 获取的贝塞尔曲线
/// return: 形点数
/// </param>
////////////////////////////////////////////////////////////////////////////////
static int bezier( const vector< PointType >& _control_pts, double _density, vector< PointType>& _bezier )
{
int n = _control_pts.size() - 1 ;
if ( n < 2)
{
return 0;
}
for ( double t = 0.0; t < 1.0; t+= _density )
{
PointType pt;
pt.m_x = 0;
pt.m_y = 0;
for ( int i = 0; i <= n; i++ )
{
int fac_para = fac( n ) / ( fac( i) * fac( n - i ) );
XYType x = _control_pts[i].m_x;
XYType y = _control_pts[i].m_y;
pt.m_x += fac_para * x * pow( 1-t, n - i ) * pow( t, i );
pt.m_y += fac_para * y * pow( 1- t, n-i ) * pow( t, i );
}
_bezier.push_back( pt );
}
_bezier.push_back( *_control_pts.rbegin() );
return _bezier.size();
}
};
|