闻心阁

一蓑烟雨看苍生,半壶浊酒笑红尘

Bezier曲线算法实现

2011-06-03 约 1 分钟读完 搬砖秘籍

狂风暴雨的计算机图形学实习终于快要结束了,呵呵,写完实习报告,然后应该就没有太让我纠结的事情了,所以这里先庆祝一下,今天就发完计算机图形学实习中的最后一个代码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.本代码并非原创,收集于网络

2.使用的时候请调用最后一个Bezier()函数,上面的函数均为最后一个函数服务

3.欢迎留言

PS:终于完了,但愿成绩不要完了~!