求VC下三次B样条曲线的算法原代码 十万火急求

meander 2008-05-06 08:38:02
因小弟毕业设计需要,求各位懂算法的高手能帮忙一把,最好提供原代码,小弟不甚感激
我的信箱:yuli16888@126.com
在线等
...全文
281 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2008-05-08
  • 打赏
  • 举报
回复
/*-------------------------------------------------------------------*//*!
* 绘制CubicBezier曲线(示意代码,不可运行)
* param
* p0 anchor1;
* p1 第一控制点;
* p2 第二控制点;
* p3 anchor2;
* return
*//*-------------------------------------------------------------------*/

bool DrawCubicBezier(const Vector2& p0, const Vector2& p1, const Vector2& p2, const Vector2& p3)
{
if(p0 == p1 && p0 == p2 && p0 == p3)
{
RI_ASSERT(p1 == p2 && p1 == p3 && p2 == p3);
return false; //discard zero-length segments
}


// 可变长度测试:算法再斟酌
int segments = 256; // 取决于您的绘制精度

MoveTo(p0);

Vector2 pp = p0; // 上一个点
for(int i=1;i<segments;i++)
{
#if 标准算法
// 该处的算法注意《计算机图形学》第三版 P355,该程序使用的是标准的但非高效的算法,
RIfloat t = (RIfloat)i / (RIfloat)segments;
RIfloat u = 1.0f-t;
Vector2 pn = u*u*u * p0 + 3.0f*t*u*u * p1 + 3.0f*t*t*u * p2 + t*t*t * p3; // 下一个点
#else
// 或: 使用De Casteljau算法替代这里;
// 其原始公式如下:
// r(i) = (1 - u) * p(i) + u * p(i + 1)
// s(i) = (1 - u) * r(i) + u * r(i + 1)
// t0 = (1 - u) * s(0) + u * s(1)
// 以上是三次Bezier曲线的计算,对于二次Bezier曲线仅需要计算r(i)和t0,及只需要计算r(0)、r(1)和t0三个值即可(参考以下程序)
// 参见:3D计算机图形学(OpenGL版) P143
Vector2 r1 = (1-u) * p0 + u * p1;
Vector2 r2 = (1-u) * p1 + u * p2;
Vector2 r3 = (1-u) * p2 + u * p3;
Vector2 s1 = (1-u) * r1 + u * r2;
Vector2 s2 = (1-u) * r2 + u * r3;
Vector2 pb = (1-u) * s1 + u * s2;
#endif
说明:以上仅仅是算法说明,实际在标准尤其实时绘图不使用如上算法----效率仍有些低;
其中:算法1为标准算法。算法2为De Castljau算法----效率较算法1要高些
Vector2为一个类,表示一个向量

LineTo(pn);

pp = pn;
}
LineTo(p3);

return true;
}
ollydbg23 2008-05-08
  • 打赏
  • 举报
回复
呵呵,楼上的还是挺赞的,不过楼主应该可以找到简单的算法啊。
Eleven 2008-05-07
  • 打赏
  • 举报
回复
Up
「已注销」 2008-05-07
  • 打赏
  • 举报
回复
cximage里好像有实现,找找看
yiyaoyao58958 2008-05-07
  • 打赏
  • 举报
回复
MFC的Button触发绘制在对话框上

void CthreeBezeryDlg::OnBnClickedOk()
{
int N;
CDC *pDC=GetDC();
static long p[9][2]={50,400,100,120,260,
180,500,120,600,300,
590,420,50,400,100,120,
260,180};
pDC->MoveTo(p[0][0],p[0][1]);

N=9-3;

p[0][0]=6.0*p[0][0]-4.0*p[1][0]-p[2][0];
p[0][1]=6.0*p[0][1]-4.0*p[1][1]-p[2][1];
p[N-1][0]=6.0*p[N-1][0]-4.0*p[N-2][0]-p[N-3][0];
p[N-1][1]=6.0*p[N-1][1]-4.0*p[N-2][1]-p[N-3][1];

B3_curves('p',p,N-1,pDC);
}




绘制中心方法


void CthreeBezeryDlg::B3_curves(char pflag,long xq[][2],int m,CDC*pDC)
{
CDC *pdc=GetDC();
int i,j,k=10;
long lx1,ly1;
double t0,t1,t2,t3;
lx1=(xq[0][0]+4.0*xq[1][0]+xq[2][0])/6;
ly1=(xq[0][1]+4.0*xq[1][1]+xq[2][1])/6;


if(pflag=='p')

pDC->MoveTo(lx1,ly1);


for(i=1;i<m;i++)
for(j=0;j<=k;j++)
{
t3=1.0*j/k;
t0=1-t3;
t0=t0*t0*t0/6.0;
t1=((3.0*t3-6.0)*t3*t3+4.0)/6.0;
t2=(((3-3*t3)*t3+3)*t3+1)/6.0;
t3=1.0-t0-t1-t2;
lx1=xq[i-1][0]*t0+xq[i][0]*t1+xq[i+1][0]*t2+xq[i+2][0]*t3;
ly1=xq[i-1][1]*t0+xq[i][1]*t1+xq[i+1][1]*t2+xq[i+2][1]*t3;
if(pflag=='p')
pDC->LineTo(lx1,ly1);
}

}


19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧