计算机图形学试题递推算法De,计算机图形学实验de-Casteljau算法知识讲解(6页)-原创力文档...

计算机图形学实验de-Casteljau算法

精品文档

精品文档

收集于网络,如有侵权请联系管理员删除

收集于网络,如有侵权请联系管理员删除

精品文档

收集于网络,如有侵权请联系管理员删除

实验7-2

一、实验题目

在屏幕上使用鼠标绘制任意控制点的控制多边形,基于de Casteljau算法绘制如图7-48所示的Bezier曲线。

二、实验思想

Bezier曲线上的点,可以使用Bezier曲线方程直接计算,但使用de Casteljau递推算法则要简单的多。

1.递推公式

给定空间n+1个控制点Pi(i=0,1, 2?n)及参数t,de Casteljau递推算法表述为:

当n=3时,有

三次Bezier曲线递推如下

第一级递推:

第二级递推:

第三级递推:

其中:规定:

定义Bezier曲线的控制点编号为 其中,r为递推次数。de Casteljau已经证明,当r=n时, 表示曲线上的点。根据式(7-16)可以绘制n次Bezier曲线。

三、实验代码

void CTestView::OnMENUBezierCurve()

{

// TODO: Add your command handler code here

RedrawWindow();

MessageBox("单击左键绘制特征多边形,单击右键绘制曲线","提示",MB_OK);

pt=new CPoint [N_MAX_POINT];

Flag=true;CtrlPoint=0;

}

void CTestView::DrawBezier()//绘制Bezier曲线

{

CClientDC dc(this);

int rate=500,n;

n=CtrlPoint-1;

double x,y;

double px[N_MAX_POINT],py[N_MAX_POINT];

for(int k=0;k<=n;k++)

{

px[k]=pt[k].x;

py[k]=pt[k].y;

}

for(double t=0;t<=1;t+=0.01/rate)

{

x=DeCasteliau(t,px);

y=DeCasteliau(t,py);

dc.SetPixel(ROUND(x),ROUND(y),RGB(0,0,255));

}

}

double CTestView::DeCasteliau(double t,double p[])//德卡斯特里奥函数

{

double pp[N_MAX_POINT][N_MAX_POINT];

int n=CtrlPoint-1;

for(int k=0;k<=n;k++)

{

pp[k][0]=p[k];

}

for(int r=1;r<=n;r++)

{

for(int i=0;i<=n-r;i++)

{

pp[i][r]=(1-t)*pp[i][r-1]+t*pp[i+1][r-1];

}

}

return(pp[0][n]);

}

void CTestView::DrawCharPolygon()//绘制控制多边形

{

CClientDC dc(this);

CPen NewPen,*OldPen;

NewPen.CreatePen(PS_SOLID,3,RGB(0,0,0));

OldPen=dc.SelectObject(&NewPen);

for(int i=0;i

{

if(i==0)

{

dc.MoveTo(pt[i]);

dc.Ellipse(pt[i].x-2,pt[i].y-2,pt[i].x+2,pt[i].y+2);

}

else

{

dc.LineTo(pt[i]);

dc.Ellipse(pt[i].x-2,pt[i].y-2,pt[i].x+2,pt[i].y+2);

}

}

dc.SelectObject(OldPen);

NewPen.DeleteObject();

}

void CTestView::OnLButtonDown(UINT nFlags, CPoint point)//获得屏幕控制点坐标

{

// TODO: Add your message handler code here and/or call default

CView::OnLButtonDown(nFlags, point);

if(Flag)

{

pt[CtrlPoint].x=point.x;

pt[CtrlPoint].y=point.y;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值