习题第九章.docx
- 文档编号:11595333
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:14
- 大小:152.87KB
习题第九章.docx
《习题第九章.docx》由会员分享,可在线阅读,更多相关《习题第九章.docx(14页珍藏版)》请在冰豆网上搜索。
习题第九章
习题
9.1.举出几个曲线和曲面用显式、隐式和参数式表示的实例,并给出相应数学表达式。
解:
曲线:
圆显式
隐式
参数式
曲面:
显式:
抛物面
隐式:
椭球面
参数式:
Bézier曲面
9.2.参照Hermite三次曲线的几何形式,试用
推导相应五次曲线的调和函数和系数矩阵。
解:
设五次曲线的参数形式为:
由:
易知:
整理得调和函数形式:
系数矩阵为
9.3.给定
构造一条Bézier曲线,分别计算参数0,1/3,2/3,1处的值。
解:
Bézier曲线的方程是
即
且
。
9.4.已知Bézier曲线上的四个点
,它们对应的参数分别为0,1/3,2/3,1,求Bézier曲线的控制顶点。
解:
设控制顶点为
则Bézier曲线的方程是
计算得
9.5.设由
四点定义的三次Bézier曲线为
,
四点满足什么条件
为二次曲线。
解:
三次Bézier曲线为
整理得3次项的系数为
要使曲线为二次曲线,只要
9.6.用三次组合Bézier曲线描述一个曲线外型,在连接点处为GC1连续,编制一个可以修改控制点的交互式程序。
解:
原程序代码参考附件
voidCEX9_7View:
:
OnFileNew()
{
CEX9_7Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
Addyourcommandhandlercodehere
CCNDialogCND;
if(CND.DoModal()==IDOK)
{
pDoc->m_CurveNumber=CND.m_CurveNumber;
}
inti;
for(i=0;i
{
if(i%2==0)
{
pDoc->m_CBC.BC[i].CP[0].x=100+i*150;
pDoc->m_CBC.BC[i].CP[0].y=100;
pDoc->m_CBC.BC[i].CP[1].x=150+i*150;
pDoc->m_CBC.BC[i].CP[1].y=50;
pDoc->m_CBC.BC[i].CP[2].x=200+i*150;
pDoc->m_CBC.BC[i].CP[2].y=50;
pDoc->m_CBC.BC[i].CP[3].x=250+i*150;
pDoc->m_CBC.BC[i].CP[3].y=100;
}
else
{
pDoc->m_CBC.BC[i].CP[0].x=100+i*150;
pDoc->m_CBC.BC[i].CP[0].y=100;
pDoc->m_CBC.BC[i].CP[1].x=150+i*150;
pDoc->m_CBC.BC[i].CP[1].y=150;
pDoc->m_CBC.BC[i].CP[2].x=200+i*150;
pDoc->m_CBC.BC[i].CP[2].y=150;
pDoc->m_CBC.BC[i].CP[3].x=250+i*150;
pDoc->m_CBC.BC[i].CP[3].y=100;
}
}
Invalidate(true);
}
voidCEX9_7View:
:
DrawCurve()
{
CEX9_7Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
intcurvei;
intcurvenumber;
curvenumber=pDoc->m_CurveNumber;
//DrawControlPolygon
CPennewpen(PS_SOLID,1,0x0000ff);
CPen*poldpen=m_pDC->SelectObject(&newpen);
for(curvei=0;curvei { m_pDC->MoveTo(pDoc->m_CBC.BC[curvei].CP[0].x,pDoc->m_CBC.BC[curvei].CP[0].y) m_pDC->LineTo(pDoc->m_CBC.BC[curvei].CP[1].x,pDoc->m_CBC.BC[curvei].CP[1].y); m_pDC->LineTo(pDoc->m_CBC.BC[curvei].CP[2].x,pDoc->m_CBC.BC[curvei].CP[2].y); m_pDC->LineTo(pDoc->m_CBC.BC[curvei].CP[3].x,pDoc->m_CBC.BC[curvei].CP[3].y); } m_pDC->SelectObject(poldpen); //DrawBezierCurve CPennewnewpen(PS_SOLID,1,0xff0000); poldpen=m_pDC->SelectObject(&newnewpen); doublex; doubley; for(curvei=0;curvei { m_pDC->MoveTo(pDoc->m_CBC.BC[curvei].CP[0].x,pDoc->m_CBC.BC[curvei].CP[0].y); for(doublet=0.0;t<1.00000001;) { x=0.0; y=0.0; for(intj=0;j<4;j++) { x+=pDoc->m_CBC.BC[curvei].CP[j].x*pDoc->BezierBasis(j,t); y+=pDoc->m_CBC.BC[curvei].CP[j].y*pDoc->BezierBasis(j,t); } m_pDC->LineTo(x,y); t+=0.01; } } m_pDC->SelectObject(poldpen); //DrawBigControlPoint for(curvei=0;curvei { for(intj=0;j<4;j++) { x=pDoc->m_CBC.BC[curvei].CP[j].x; y=pDoc->m_CBC.BC[curvei].CP[j].y; m_pDC->SetPixel(x-1,y-1,0x000000); m_pDC->SetPixel(x-1,y,0x000000); m_pDC->SetPixel(x-1,y+1,0x000000); m_pDC->SetPixel(x,y-1,0x000000); m_pDC->SetPixel(x,y,0x000000); m_pDC->SetPixel(x,y+1,0x000000); m_pDC->SetPixel(x+1,y-1,0x000000); m_pDC->SetPixel(x+1,y,0x000000); m_pDC->SetPixel(x+1,y+1,0x000000); } } if(m_bMove) { x=pDoc->m_CBC.BC[m_SelectCurveI].CP[m_SelectCPI].x; y=pDoc->m_CBC.BC[m_SelectCurveI].CP[m_SelectCPI].y; m_pDC->SetPixel(x-1,y-1,0x00ff00); m_pDC->SetPixel(x-1,y,0x00ff00); m_pDC->SetPixel(x-1,y+1,0x00ff00); m_pDC->SetPixel(x,y-1,0x00ff00); m_pDC->SetPixel(x,y,0x00ff00); m_pDC->SetPixel(x,y+1,0x00ff00); m_pDC->SetPixel(x+1,y-1,0x00ff00); m_pDC->SetPixel(x+1,y,0x00ff00); m_pDC->SetPixel(x+1,y+1,0x00ff00); } } doubleCEX9_7View: : Distance(CMyPointP1,CMyPointP2) { doublex1=P1.x; doubley1=P1.y; doublez1=P1.z; doublex2=P2.x; doubley2=P2.y; doublez2=P2.z; returnsqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)); } voidCEX9_7View: : OnLButtonDown(UINTnFlags,CPointpoint) { //TODO: Addyourmessagehandlercodehereand/orcalldefault m_bMove=true; CView: : OnLButtonDown(nFlags,point); } voidCEX9_7View: : OnLButtonUp(UINTnFlags,CPointpoint) { //TODO: Addyourmessagehandlercodehereand/orcalldefault m_bMove=false; m_bFirst=true; Invalidate(true); CView: : OnLButtonUp(nFlags,point); } voidCEX9_7View: : OnMouseMove(UINTnFlags,CPointpoint) { //TODO: Addyourmessagehandlercodehereand/orcalldefault //见附件源程序 } 9.7.设计程序来绘制一个 次的Bézier曲面,该程序可以通过修改控制顶点来改变Bézier曲面的形状,注意观察Bézier曲面的形状和控制顶点的关系。 解: 原程序代码参考附件 CBezierSurfaceView: : CBezierSurfaceView() { //TODO: addconstructioncodehere viewvector[0]=1; viewvector[1]=-1; viewvector[2]=1; cubelength=300; doubleinterval=cubelength/3.; doubleinterval2=5.*cubelength/12.; doubleinterval3=7.*cubelength/12.; doublea=20; for(inti=0;i<4;i++){ for(intj=0;j<4;j++){ BSctrl[i][j][0]=interval*j; BSctrl[i][j][2]=interval*i; BSctrl[i][j][1]=0; } } BSctrl[1][1][1]=-200; BSctrl[1][2][1]=-200; BSctrl[2][1][1]=-200; BSctrl[2][2][1]=-200; BSctrl[1][1][0]=BSctrl[1][1][0]+a; BSctrl[1][2][0]=BSctrl[1][2][0]-a; BSctrl[2][1][0]=BSctrl[2][1][0]+a; BSctrl[2][2][0]=BSctrl[2][2][0]-a; BSctrl[1][1][2]=BSctrl[1][1][2]-a; BSctrl[1][2][2]=BSctrl[1][2][2]-a; BSctrl[2][1][2]=BSctrl[2][1][2]+a; BSctrl[2][2][2]=BSctrl[2][2][2]+a; } voidCBezierSurfaceView: : Drawfpsurface(doublectrl[][4][3]) { CClientDCdc(this); CRectrect; GetClientRect(&rect); dc.SetViewportOrg(rect.Width()/2,rect.Height()/2); doublespoint[3],ppoint[2]; doublecolor; for(doubleu=0.;u<=1.;u=u+0.1){ for(doublev=0.;v<=1.;v=v+0.001){ ComputePonBS(spoint,4,4,u,v,ctrl); Comprojectpoint(spoint,ppoint); color=0; dc.SetPixel(ppoint[0],ppoint[1],RGB(color,color,color)); } } for(doublev=0.;v<=1.;v=v+0.1){ for(doubleu=0.;u<=1.;u=u+0.0001){ ComputePonBS(spoint,4,4,u,v,ctrl); Comprojectpoint(spoint,ppoint); color=0; dc.SetPixel(ppoint[0],ppoint[1],RGB(color,color,color)); } } } 9.8写出二、三次均匀B样条曲线方程。 解: 二次均匀B样条曲线的方程是 三次均匀B样条曲线的方程是 9.9编制一个求B样条曲线上 点的程序。 解: 假设t在 内,利用deBoor分割算法求P(t) B样条曲线—deBoor分割算法 floatdeboor(degree,coeff,knot,u,i) floatcoeff[],knot[]; floatu; intdegree,i; { intk,j; floatt1,t2; floatcoeffa[30]; for(j=i-degree+1;j<=i+1;j++) coeffa[j]=coeff[j-i+degree-1]; for(k=1;i<=degree;k++) for(j=i+1;j>=i-degree+k+1;j--) { t1=(knot[j+degree-k]-u)/(knot[j+degree-k]-knot[j-1]); t2=1.0-t1; coeffa[j]=t1*coeffa[j-1]+t2*coeffa[j]; } return(coeffa[i+1]); } 9.10如何使三次B样条曲线通过一个给定的点,其中控制点不重合。 解: 这是一个b-spline插值曲线的反算问题.首先给定位于曲线 上的点,然后反算出控制顶点及节点向量.由于只给定一个点,方程个数远少于未知量个数,需要再加上其他约束条件(如本题要求的控制顶点不重合)才能最终求出b-spline曲线的控制顶点和节点向量. 9.11对三次B样条曲线 ,用deBoor公式证明 。 证明: 由deBoor公式: 代入 ,整理得 右边= 左边,因为 ,所以 其中 在 上, 求得 故, 的系数左右一样,同理可以求得其他各项也一样。 因此,左边=右边。 原命题得证。 9.12试编制用deBoor算法产生双三次B样条曲面的程序。 解: B样条曲面—deBoor算法 floatdeboor(degree,coeff,knot,u,i) floatcoeff[],knot[]; floatu; intdegree,i; { intk,m,n; floatt1,t2; floatcoeffa[30,30]; for(n=i-degree+1;n<=i+1;n++) coeffa[m,n]=coeff[m,n-i+degree-1]; for(m=i-degree+1;m<=i+1;m++) coeffa[m,n]=coeff[m-i+degree-1,n]; for(k=1;i<=degree;k++) for(m=i+1;m>=i-degree+k+1;m--) { t1=(knot[m+degree-k]-u)/(knot[m+degree-k]-knot[m-1]); t2=1.0-t1; coeffa[m,n]=t1*coeffa[m-1,n]+t2*coeffa[m,n]; } for(k=1;i<=degree;k++) for(n=i+1;n>=i-degree+k+1;n--) { t1=(knot[n+degree-k]-u)/(knot[n+degree-k]-knot[n-1]); t2=1.0-t1; coeffa[m,n]=t1*coeffa[m,n-1]+t2*coeffa[m,n]; } return(coeffa[i+1,i+1]); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 习题 第九