习题第九章Word格式.docx
- 文档编号:8219201
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:14
- 大小:152.87KB
习题第九章Word格式.docx
《习题第九章Word格式.docx》由会员分享,可在线阅读,更多相关《习题第九章Word格式.docx(14页珍藏版)》请在冰点文库上搜索。
9.4.已知Bé
zier曲线上的四个点
,它们对应的参数分别为0,1/3,2/3,1,求Bé
zier曲线的控制顶点。
设控制顶点为
则Bé
计算得
9.5.设由
四点定义的三次Bé
zier曲线为
,
四点满足什么条件
为二次曲线。
三次Bé
整理得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<
pDoc->
m_CurveNumber;
i++)
if(i%2==0)
{
pDoc->
m_CBC.BC[i].CP[0].x=100+i*150;
m_CBC.BC[i].CP[0].y=100;
m_CBC.BC[i].CP[1].x=150+i*150;
m_CBC.BC[i].CP[1].y=50;
m_CBC.BC[i].CP[2].x=200+i*150;
m_CBC.BC[i].CP[2].y=50;
m_CBC.BC[i].CP[3].x=250+i*150;
m_CBC.BC[i].CP[3].y=100;
}
else
m_CBC.BC[i].CP[1].y=150;
m_CBC.BC[i].CP[2].y=150;
Invalidate(true);
}
DrawCurve()
intcurvei;
intcurvenumber;
curvenumber=pDoc->
//DrawControlPolygon
CPennewpen(PS_SOLID,1,0x0000ff);
CPen*poldpen=m_pDC->
SelectObject(&
newpen);
for(curvei=0;
curvei<
curvenumber;
curvei++)
m_pDC->
MoveTo(pDoc->
m_CBC.BC[curvei].CP[0].x,pDoc->
m_CBC.BC[curvei].CP[0].y)
LineTo(pDoc->
m_CBC.BC[curvei].CP[1].x,pDoc->
m_CBC.BC[curvei].CP[1].y);
m_CBC.BC[curvei].CP[2].x,pDoc->
m_CBC.BC[curvei].CP[2].y);
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->
newnewpen);
doublex;
doubley;
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->
}
m_pDC->
LineTo(x,y);
t+=0.01;
//DrawBigControlPoint
for(intj=0;
j++)
x=pDoc->
m_CBC.BC[curvei].CP[j].x;
y=pDoc->
m_CBC.BC[curvei].CP[j].y;
SetPixel(x-1,y-1,0x000000);
SetPixel(x-1,y,0x000000);
SetPixel(x-1,y+1,0x000000);
SetPixel(x,y-1,0x000000);
SetPixel(x,y,0x000000);
SetPixel(x,y+1,0x000000);
SetPixel(x+1,y-1,0x000000);
SetPixel(x+1,y,0x000000);
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;
SetPixel(x-1,y-1,0x00ff00);
SetPixel(x-1,y,0x00ff00);
SetPixel(x-1,y+1,0x00ff00);
SetPixel(x,y-1,0x00ff00);
SetPixel(x,y,0x00ff00);
SetPixel(x,y+1,0x00ff00);
SetPixel(x+1,y-1,0x00ff00);
SetPixel(x+1,y,0x00ff00);
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));
OnLButtonDown(UINTnFlags,CPointpoint)
Addyourmessagehandlercodehereand/orcalldefault
m_bMove=true;
CView:
OnLButtonDown(nFlags,point);
OnLButtonUp(UINTnFlags,CPointpoint)
m_bMove=false;
m_bFirst=true;
OnLButtonUp(nFlags,point);
OnMouseMove(UINTnFlags,CPointpoint)
//见附件源程序
9.7.设计程序来绘制一个
次的Bé
zier曲面,该程序可以通过修改控制顶点来改变Bé
zier曲面的形状,注意观察Bé
zier曲面的形状和控制顶点的关系。
CBezierSurfaceView:
CBezierSurfaceView()
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++){
for(intj=0;
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<
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=v+0.1){
for(doubleu=0.;
u=u+0.0001){
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算法
intk,m,n;
floatcoeffa[30,30];
for(n=i-degree+1;
n<
n++)
coeffa[m,n]=coeff[m,n-i+degree-1];
for(m=i-degree+1;
m<
m++)
coeffa[m,n]=coeff[m-i+degree-1,n];
for(m=i+1;
m>
m--)
t1=(knot[m+degree-k]-u)/(knot[m+degree-k]-knot[m-1]);
coeffa[m,n]=t1*coeffa[m-1,n]+t2*coeffa[m,n];
for(n=i+1;
n>
n--)
t1=(knot[n+degree-k]-u)/(knot[n+degree-k]-knot[n-1]);
coeffa[m,n]=t1*coeffa[m,n-1]+t2*coeffa[m,n];
return(coeffa[i+1,i+1]);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 习题 第九