Bezier曲线算法实现
狂风暴雨的计算机图形学实习终于快要结束了,呵呵,写完实习报告,然后应该就没有太让我纠结的事情了,所以这里先庆祝一下,今天就发完计算机图形学实习中的最后一个代码Bezier曲线生成算法。
老规矩,只讲代码实现,原理请绕行~
代码如下:
//×下面是bezier曲线的函数×//求n!
int JieCheng(int n)
{
if(n==1||n==0)
{
return 1;
}
else
{
return n*JieCheng(n-1);
}
}
//求组合排列
double C(int n,int i)
{
return ((double)JieCheng(n))/((double)(JieCheng(i)*JieCheng(n-i)));
}
//求一个数u的num次方
double N(double u,int n)
{
double sum=1.0;
if (n==0)
{
return 1;
}
for(int i=0;i<n;i++)
{
sum*=u;
}
return sum;
}
void S6GraphPt::Bezier(CDC *pDC)//Bezier曲线
{
int iNumber=m_points.size();
pDC->MoveTo(m_points.at(0));
if (iNumber==1)
{
pDC->SetPixel(m_points.at(0),m_color);
return;
}
for(int i=0;i<iNumber-1;i++)
{
pDC->SetPixel(m_points.at(i),m_color);
pDC->SetPixel(m_points.at(i+1),m_color);
pDC->LineTo(m_points.at(i+1));
}
double u,x,y;
pDC->SetPixel(m_points.at(0), m_color);
pDC->MoveTo(m_points.at(0));
for(u=0;u<=1;u=u+0.001)
{
x=0;y=0;
for (int i=0;i<iNumber;i++)
{
x+=C(iNumber-1,i)*N(u,i)*N((1-u),(iNumber-1-i))*m_points.at(i).x;
y+=C(iNumber-1,i)*N(u,i)*N((1-u),(iNumber-1-i))*m_points.at(i).y;
}
pDC->LineTo((int)x,(int)y);
}
}
声明:
1.本代码并非原创,收集于网络PS:终于完了,但愿成绩不要完了~!2.使用的时候请调用最后一个Bezier()函数,上面的函数均为最后一个函数服务
3.欢迎留言